diff options
-rw-r--r-- | net/tipc/addr.c | 12 | ||||
-rw-r--r-- | net/tipc/addr.h | 2 | ||||
-rw-r--r-- | net/tipc/core.h | 3 | ||||
-rw-r--r-- | net/tipc/discover.c | 13 | ||||
-rw-r--r-- | net/tipc/name_table.c | 8 | ||||
-rw-r--r-- | net/tipc/net.c | 2 |
6 files changed, 22 insertions, 18 deletions
diff --git a/net/tipc/addr.c b/net/tipc/addr.c index dfc31a730ca5..19987994704f 100644 --- a/net/tipc/addr.c +++ b/net/tipc/addr.c | |||
@@ -48,15 +48,17 @@ int in_own_node(struct net *net, u32 addr) | |||
48 | return (addr == tn->own_addr) || !addr; | 48 | return (addr == tn->own_addr) || !addr; |
49 | } | 49 | } |
50 | 50 | ||
51 | int tipc_in_scope(u32 domain, u32 addr) | 51 | bool tipc_in_scope(bool legacy_format, u32 domain, u32 addr) |
52 | { | 52 | { |
53 | if (!domain || (domain == addr)) | 53 | if (!domain || (domain == addr)) |
54 | return 1; | 54 | return true; |
55 | if (!legacy_format) | ||
56 | return false; | ||
55 | if (domain == tipc_cluster_mask(addr)) /* domain <Z.C.0> */ | 57 | if (domain == tipc_cluster_mask(addr)) /* domain <Z.C.0> */ |
56 | return 1; | 58 | return true; |
57 | if (domain == (addr & TIPC_ZONE_MASK)) /* domain <Z.0.0> */ | 59 | if (domain == (addr & TIPC_ZONE_MASK)) /* domain <Z.0.0> */ |
58 | return 1; | 60 | return true; |
59 | return 0; | 61 | return false; |
60 | } | 62 | } |
61 | 63 | ||
62 | char *tipc_addr_string_fill(char *string, u32 addr) | 64 | char *tipc_addr_string_fill(char *string, u32 addr) |
diff --git a/net/tipc/addr.h b/net/tipc/addr.h index 5ffde51b0e68..97bdc0e1a369 100644 --- a/net/tipc/addr.h +++ b/net/tipc/addr.h | |||
@@ -67,7 +67,7 @@ static inline int tipc_scope2node(struct net *net, int sc) | |||
67 | 67 | ||
68 | u32 tipc_own_addr(struct net *net); | 68 | u32 tipc_own_addr(struct net *net); |
69 | int in_own_node(struct net *net, u32 addr); | 69 | int in_own_node(struct net *net, u32 addr); |
70 | int tipc_in_scope(u32 domain, u32 addr); | 70 | bool tipc_in_scope(bool legacy_format, u32 domain, u32 addr); |
71 | char *tipc_addr_string_fill(char *string, u32 addr); | 71 | char *tipc_addr_string_fill(char *string, u32 addr); |
72 | 72 | ||
73 | #endif | 73 | #endif |
diff --git a/net/tipc/core.h b/net/tipc/core.h index 347f850dc872..bd2b112680a4 100644 --- a/net/tipc/core.h +++ b/net/tipc/core.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * net/tipc/core.h: Include file for TIPC global declarations | 2 | * net/tipc/core.h: Include file for TIPC global declarations |
3 | * | 3 | * |
4 | * Copyright (c) 2005-2006, 2013 Ericsson AB | 4 | * Copyright (c) 2005-2006, 2013-2018 Ericsson AB |
5 | * Copyright (c) 2005-2007, 2010-2013, Wind River Systems | 5 | * Copyright (c) 2005-2007, 2010-2013, Wind River Systems |
6 | * All rights reserved. | 6 | * All rights reserved. |
7 | * | 7 | * |
@@ -81,6 +81,7 @@ struct tipc_net { | |||
81 | u32 own_addr; | 81 | u32 own_addr; |
82 | int net_id; | 82 | int net_id; |
83 | int random; | 83 | int random; |
84 | bool legacy_addr_format; | ||
84 | 85 | ||
85 | /* Node table and node list */ | 86 | /* Node table and node list */ |
86 | spinlock_t node_list_lock; | 87 | spinlock_t node_list_lock; |
diff --git a/net/tipc/discover.c b/net/tipc/discover.c index 669af125b3de..82556e19222d 100644 --- a/net/tipc/discover.c +++ b/net/tipc/discover.c | |||
@@ -139,6 +139,7 @@ void tipc_disc_rcv(struct net *net, struct sk_buff *skb, | |||
139 | struct tipc_net *tn = tipc_net(net); | 139 | struct tipc_net *tn = tipc_net(net); |
140 | struct tipc_msg *hdr = buf_msg(skb); | 140 | struct tipc_msg *hdr = buf_msg(skb); |
141 | u16 caps = msg_node_capabilities(hdr); | 141 | u16 caps = msg_node_capabilities(hdr); |
142 | bool legacy = tn->legacy_addr_format; | ||
142 | u32 signature = msg_node_sig(hdr); | 143 | u32 signature = msg_node_sig(hdr); |
143 | u32 dst = msg_dest_domain(hdr); | 144 | u32 dst = msg_dest_domain(hdr); |
144 | u32 net_id = msg_bc_netid(hdr); | 145 | u32 net_id = msg_bc_netid(hdr); |
@@ -165,13 +166,11 @@ void tipc_disc_rcv(struct net *net, struct sk_buff *skb, | |||
165 | disc_dupl_alert(b, self, &maddr); | 166 | disc_dupl_alert(b, self, &maddr); |
166 | return; | 167 | return; |
167 | } | 168 | } |
168 | /* Domain filter only works if both peers use legacy address format */ | 169 | if (!tipc_in_scope(legacy, dst, self)) |
169 | if (b->domain) { | 170 | return; |
170 | if (!tipc_in_scope(dst, self)) | 171 | if (!tipc_in_scope(legacy, b->domain, src)) |
171 | return; | 172 | return; |
172 | if (!tipc_in_scope(b->domain, src)) | 173 | |
173 | return; | ||
174 | } | ||
175 | tipc_node_check_dest(net, src, b, caps, signature, | 174 | tipc_node_check_dest(net, src, b, caps, signature, |
176 | &maddr, &respond, &dupl_addr); | 175 | &maddr, &respond, &dupl_addr); |
177 | if (dupl_addr) | 176 | if (dupl_addr) |
diff --git a/net/tipc/name_table.c b/net/tipc/name_table.c index bbbfc0702634..7478acb39096 100644 --- a/net/tipc/name_table.c +++ b/net/tipc/name_table.c | |||
@@ -499,7 +499,9 @@ struct publication *tipc_nametbl_remove_publ(struct net *net, u32 type, | |||
499 | u32 tipc_nametbl_translate(struct net *net, u32 type, u32 instance, | 499 | u32 tipc_nametbl_translate(struct net *net, u32 type, u32 instance, |
500 | u32 *destnode) | 500 | u32 *destnode) |
501 | { | 501 | { |
502 | struct tipc_net *tn = net_generic(net, tipc_net_id); | 502 | struct tipc_net *tn = tipc_net(net); |
503 | bool legacy = tn->legacy_addr_format; | ||
504 | u32 self = tipc_own_addr(net); | ||
503 | struct sub_seq *sseq; | 505 | struct sub_seq *sseq; |
504 | struct name_info *info; | 506 | struct name_info *info; |
505 | struct publication *publ; | 507 | struct publication *publ; |
@@ -507,7 +509,7 @@ u32 tipc_nametbl_translate(struct net *net, u32 type, u32 instance, | |||
507 | u32 port = 0; | 509 | u32 port = 0; |
508 | u32 node = 0; | 510 | u32 node = 0; |
509 | 511 | ||
510 | if (!tipc_in_scope(*destnode, tn->own_addr)) | 512 | if (!tipc_in_scope(legacy, *destnode, self)) |
511 | return 0; | 513 | return 0; |
512 | 514 | ||
513 | rcu_read_lock(); | 515 | rcu_read_lock(); |
@@ -521,7 +523,7 @@ u32 tipc_nametbl_translate(struct net *net, u32 type, u32 instance, | |||
521 | info = sseq->info; | 523 | info = sseq->info; |
522 | 524 | ||
523 | /* Closest-First Algorithm */ | 525 | /* Closest-First Algorithm */ |
524 | if (likely(!*destnode)) { | 526 | if (legacy && !*destnode) { |
525 | if (!list_empty(&info->local_publ)) { | 527 | if (!list_empty(&info->local_publ)) { |
526 | publ = list_first_entry(&info->local_publ, | 528 | publ = list_first_entry(&info->local_publ, |
527 | struct publication, | 529 | struct publication, |
diff --git a/net/tipc/net.c b/net/tipc/net.c index a074f285e6ea..eb0d7a352e3f 100644 --- a/net/tipc/net.c +++ b/net/tipc/net.c | |||
@@ -240,7 +240,7 @@ int __tipc_nl_net_set(struct sk_buff *skb, struct genl_info *info) | |||
240 | addr = nla_get_u32(attrs[TIPC_NLA_NET_ADDR]); | 240 | addr = nla_get_u32(attrs[TIPC_NLA_NET_ADDR]); |
241 | if (!addr) | 241 | if (!addr) |
242 | return -EINVAL; | 242 | return -EINVAL; |
243 | 243 | tn->legacy_addr_format = true; | |
244 | tipc_net_start(net, addr); | 244 | tipc_net_start(net, addr); |
245 | } | 245 | } |
246 | 246 | ||