Skip to content

Commit cf61950

Browse files
jtlaytonchucklever
authored andcommitted
SUNRPC: add a new svc_find_listener helper
svc_find_listener will return the transport instance pointer for the endpoint accepting connections/peer traffic from the specified transport class and matching sockaddr. Signed-off-by: Jeff Layton <[email protected]> Signed-off-by: Lorenzo Bianconi <[email protected]> Signed-off-by: Chuck Lever <[email protected]>
1 parent a79ec2a commit cf61950

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

include/linux/sunrpc/svc_xprt.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@ void svc_xprt_copy_addrs(struct svc_rqst *rqstp, struct svc_xprt *xprt);
150150
void svc_xprt_close(struct svc_xprt *xprt);
151151
int svc_port_is_privileged(struct sockaddr *sin);
152152
int svc_print_xprts(char *buf, int maxlen);
153+
struct svc_xprt *svc_find_listener(struct svc_serv *serv, const char *xcl_name,
154+
struct net *net, const struct sockaddr *sa);
153155
struct svc_xprt *svc_find_xprt(struct svc_serv *serv, const char *xcl_name,
154156
struct net *net, const sa_family_t af,
155157
const unsigned short port);

net/sunrpc/svc_xprt.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1276,6 +1276,40 @@ static struct svc_deferred_req *svc_deferred_dequeue(struct svc_xprt *xprt)
12761276
return dr;
12771277
}
12781278

1279+
/**
1280+
* svc_find_listener - find an RPC transport instance
1281+
* @serv: pointer to svc_serv to search
1282+
* @xcl_name: C string containing transport's class name
1283+
* @net: owner net pointer
1284+
* @sa: sockaddr containing address
1285+
*
1286+
* Return the transport instance pointer for the endpoint accepting
1287+
* connections/peer traffic from the specified transport class,
1288+
* and matching sockaddr.
1289+
*/
1290+
struct svc_xprt *svc_find_listener(struct svc_serv *serv, const char *xcl_name,
1291+
struct net *net, const struct sockaddr *sa)
1292+
{
1293+
struct svc_xprt *xprt;
1294+
struct svc_xprt *found = NULL;
1295+
1296+
spin_lock_bh(&serv->sv_lock);
1297+
list_for_each_entry(xprt, &serv->sv_permsocks, xpt_list) {
1298+
if (xprt->xpt_net != net)
1299+
continue;
1300+
if (strcmp(xprt->xpt_class->xcl_name, xcl_name))
1301+
continue;
1302+
if (!rpc_cmp_addr_port(sa, (struct sockaddr *)&xprt->xpt_local))
1303+
continue;
1304+
found = xprt;
1305+
svc_xprt_get(xprt);
1306+
break;
1307+
}
1308+
spin_unlock_bh(&serv->sv_lock);
1309+
return found;
1310+
}
1311+
EXPORT_SYMBOL_GPL(svc_find_listener);
1312+
12791313
/**
12801314
* svc_find_xprt - find an RPC transport instance
12811315
* @serv: pointer to svc_serv to search

0 commit comments

Comments
 (0)