mirror of https://gitee.com/openkylin/linux.git
tipc: simplify signature of tipc_nametbl_lookup_group()
We reduce the signature of tipc_nametbl_lookup_group() by using a struct tipc_uaddr pointer. This entails a couple of minor changes in the functions tipc_send_group_mcast/anycast/unicast/bcast() in socket.c Signed-off-by: Jon Maloy <jmaloy@redhat.com> Acked-by: Ying Xue <ying.xue@windriver.com> Acked-by: Hoang Le <hoang.h.le@dektech.com.au> Acked-by: Tung Nguyen <tung.q.nguyen@dektech.com.au> Acked-by: Xin Long <lucien.xin@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
833f867089
commit
006ed14ef8
|
@ -621,31 +621,31 @@ bool tipc_nametbl_lookup_anycast(struct net *net,
|
|||
* destination socket/node pairs matching the given address.
|
||||
* The requester may or may not want to exclude himself from the list.
|
||||
*/
|
||||
bool tipc_nametbl_lookup_group(struct net *net, u32 type, u32 instance,
|
||||
u32 scope, struct list_head *dsts,
|
||||
int *dstcnt, u32 exclude,
|
||||
bool mcast)
|
||||
bool tipc_nametbl_lookup_group(struct net *net, struct tipc_uaddr *ua,
|
||||
struct list_head *dsts, int *dstcnt,
|
||||
u32 exclude, bool mcast)
|
||||
{
|
||||
u32 self = tipc_own_addr(net);
|
||||
u32 inst = ua->sa.instance;
|
||||
struct service_range *sr;
|
||||
struct tipc_service *sc;
|
||||
struct publication *p;
|
||||
|
||||
*dstcnt = 0;
|
||||
rcu_read_lock();
|
||||
sc = tipc_service_find(net, type);
|
||||
sc = tipc_service_find(net, ua->sa.type);
|
||||
if (unlikely(!sc))
|
||||
goto exit;
|
||||
|
||||
spin_lock_bh(&sc->lock);
|
||||
|
||||
/* Todo: a full search i.e. service_range_foreach_match() instead? */
|
||||
sr = service_range_match_first(sc->ranges.rb_node, instance, instance);
|
||||
sr = service_range_match_first(sc->ranges.rb_node, inst, inst);
|
||||
if (!sr)
|
||||
goto no_match;
|
||||
|
||||
list_for_each_entry(p, &sr->all_publ, all_publ) {
|
||||
if (p->scope != scope)
|
||||
if (p->scope != ua->scope)
|
||||
continue;
|
||||
if (p->sk.ref == exclude && p->sk.node == self)
|
||||
continue;
|
||||
|
|
|
@ -116,10 +116,9 @@ void tipc_nametbl_lookup_mcast_sockets(struct net *net, struct tipc_uaddr *ua,
|
|||
bool exact, struct list_head *dports);
|
||||
void tipc_nametbl_lookup_mcast_nodes(struct net *net, struct tipc_uaddr *ua,
|
||||
struct tipc_nlist *nodes);
|
||||
bool tipc_nametbl_lookup_group(struct net *net, u32 type, u32 instance,
|
||||
u32 domain, struct list_head *dsts,
|
||||
int *dstcnt, u32 exclude,
|
||||
bool all);
|
||||
bool tipc_nametbl_lookup_group(struct net *net, struct tipc_uaddr *ua,
|
||||
struct list_head *dsts, int *dstcnt,
|
||||
u32 exclude, bool mcast);
|
||||
void tipc_nametbl_build_group(struct net *net, struct tipc_group *grp,
|
||||
u32 type, u32 domain);
|
||||
struct publication *tipc_nametbl_publish(struct net *net, struct tipc_uaddr *ua,
|
||||
|
|
|
@ -958,7 +958,7 @@ static int tipc_send_group_unicast(struct socket *sock, struct msghdr *m,
|
|||
int dlen, long timeout)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name);
|
||||
struct tipc_uaddr *ua = (struct tipc_uaddr *)m->msg_name;
|
||||
int blks = tsk_blocks(GROUP_H_SIZE + dlen);
|
||||
struct tipc_sock *tsk = tipc_sk(sk);
|
||||
struct net *net = sock_net(sk);
|
||||
|
@ -966,8 +966,8 @@ static int tipc_send_group_unicast(struct socket *sock, struct msghdr *m,
|
|||
u32 node, port;
|
||||
int rc;
|
||||
|
||||
node = dest->addr.id.node;
|
||||
port = dest->addr.id.ref;
|
||||
node = ua->sk.node;
|
||||
port = ua->sk.ref;
|
||||
if (!port && !node)
|
||||
return -EHOSTUNREACH;
|
||||
|
||||
|
@ -1001,7 +1001,7 @@ static int tipc_send_group_unicast(struct socket *sock, struct msghdr *m,
|
|||
static int tipc_send_group_anycast(struct socket *sock, struct msghdr *m,
|
||||
int dlen, long timeout)
|
||||
{
|
||||
DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name);
|
||||
struct tipc_uaddr *ua = (struct tipc_uaddr *)m->msg_name;
|
||||
struct sock *sk = sock->sk;
|
||||
struct tipc_sock *tsk = tipc_sk(sk);
|
||||
struct list_head *cong_links = &tsk->cong_links;
|
||||
|
@ -1012,16 +1012,13 @@ static int tipc_send_group_anycast(struct socket *sock, struct msghdr *m,
|
|||
struct net *net = sock_net(sk);
|
||||
u32 node, port, exclude;
|
||||
struct list_head dsts;
|
||||
u32 type, inst, scope;
|
||||
int lookups = 0;
|
||||
int dstcnt, rc;
|
||||
bool cong;
|
||||
|
||||
INIT_LIST_HEAD(&dsts);
|
||||
|
||||
type = msg_nametype(hdr);
|
||||
inst = dest->addr.name.name.instance;
|
||||
scope = msg_lookup_scope(hdr);
|
||||
ua->sa.type = msg_nametype(hdr);
|
||||
ua->scope = msg_lookup_scope(hdr);
|
||||
|
||||
while (++lookups < 4) {
|
||||
exclude = tipc_group_exclude(tsk->group);
|
||||
|
@ -1030,9 +1027,8 @@ static int tipc_send_group_anycast(struct socket *sock, struct msghdr *m,
|
|||
|
||||
/* Look for a non-congested destination member, if any */
|
||||
while (1) {
|
||||
if (!tipc_nametbl_lookup_group(net, type, inst, scope,
|
||||
&dsts, &dstcnt, exclude,
|
||||
false))
|
||||
if (!tipc_nametbl_lookup_group(net, ua, &dsts, &dstcnt,
|
||||
exclude, false))
|
||||
return -EHOSTUNREACH;
|
||||
tipc_dest_pop(&dsts, &node, &port);
|
||||
cong = tipc_group_cong(tsk->group, node, port, blks,
|
||||
|
@ -1087,7 +1083,7 @@ static int tipc_send_group_anycast(struct socket *sock, struct msghdr *m,
|
|||
static int tipc_send_group_bcast(struct socket *sock, struct msghdr *m,
|
||||
int dlen, long timeout)
|
||||
{
|
||||
DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name);
|
||||
struct tipc_uaddr *ua = (struct tipc_uaddr *)m->msg_name;
|
||||
struct sock *sk = sock->sk;
|
||||
struct net *net = sock_net(sk);
|
||||
struct tipc_sock *tsk = tipc_sk(sk);
|
||||
|
@ -1112,9 +1108,9 @@ static int tipc_send_group_bcast(struct socket *sock, struct msghdr *m,
|
|||
return -EHOSTUNREACH;
|
||||
|
||||
/* Complete message header */
|
||||
if (dest) {
|
||||
if (ua) {
|
||||
msg_set_type(hdr, TIPC_GRP_MCAST_MSG);
|
||||
msg_set_nameinst(hdr, dest->addr.name.name.instance);
|
||||
msg_set_nameinst(hdr, ua->sa.instance);
|
||||
} else {
|
||||
msg_set_type(hdr, TIPC_GRP_BCAST_MSG);
|
||||
msg_set_nameinst(hdr, 0);
|
||||
|
@ -1161,29 +1157,25 @@ static int tipc_send_group_bcast(struct socket *sock, struct msghdr *m,
|
|||
static int tipc_send_group_mcast(struct socket *sock, struct msghdr *m,
|
||||
int dlen, long timeout)
|
||||
{
|
||||
struct tipc_uaddr *ua = (struct tipc_uaddr *)m->msg_name;
|
||||
struct sock *sk = sock->sk;
|
||||
DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name);
|
||||
struct tipc_sock *tsk = tipc_sk(sk);
|
||||
struct tipc_group *grp = tsk->group;
|
||||
struct tipc_msg *hdr = &tsk->phdr;
|
||||
struct net *net = sock_net(sk);
|
||||
u32 type, inst, scope, exclude;
|
||||
struct list_head dsts;
|
||||
u32 dstcnt;
|
||||
u32 dstcnt, exclude;
|
||||
|
||||
INIT_LIST_HEAD(&dsts);
|
||||
|
||||
type = msg_nametype(hdr);
|
||||
inst = dest->addr.name.name.instance;
|
||||
scope = msg_lookup_scope(hdr);
|
||||
ua->sa.type = msg_nametype(hdr);
|
||||
ua->scope = msg_lookup_scope(hdr);
|
||||
exclude = tipc_group_exclude(grp);
|
||||
|
||||
if (!tipc_nametbl_lookup_group(net, type, inst, scope, &dsts,
|
||||
&dstcnt, exclude, true))
|
||||
if (!tipc_nametbl_lookup_group(net, ua, &dsts, &dstcnt, exclude, true))
|
||||
return -EHOSTUNREACH;
|
||||
|
||||
if (dstcnt == 1) {
|
||||
tipc_dest_pop(&dsts, &dest->addr.id.node, &dest->addr.id.ref);
|
||||
tipc_dest_pop(&dsts, &ua->sk.node, &ua->sk.ref);
|
||||
return tipc_send_group_unicast(sock, m, dlen, timeout);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue