aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2013-04-17 02:18:26 -0400
committerDavid S. Miller <davem@davemloft.net>2013-04-17 14:18:33 -0400
commit8aeb89f214cdb4c3d9e43213d52d4c5b0fb93bbb (patch)
treeba2175f89efa688ad4e58e0d21842dce4f4c34da /net
parentccc4ba2ea23e4507c174620405c5de7bee328f99 (diff)
tipc: move bcast_addr from struct tipc_media to struct tipc_bearer
Some network protocols, like InfiniBand, don't have a fixed broadcast address but one that depends on the configuration. Move the bcast_addr to struct tipc_bearer and initialize it with the broadcast address of the network device when the bearer is enabled. Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r--net/tipc/bcast.c4
-rw-r--r--net/tipc/bearer.c5
-rw-r--r--net/tipc/bearer.h5
-rw-r--r--net/tipc/discover.c2
-rw-r--r--net/tipc/eth_media.c18
5 files changed, 18 insertions, 16 deletions
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c
index 2655c9f4ecad..25e159c2feb4 100644
--- a/net/tipc/bcast.c
+++ b/net/tipc/bcast.c
@@ -620,10 +620,10 @@ static int tipc_bcbearer_send(struct sk_buff *buf,
620 continue; /* bearer pair doesn't add anything */ 620 continue; /* bearer pair doesn't add anything */
621 621
622 if (!tipc_bearer_blocked(p)) 622 if (!tipc_bearer_blocked(p))
623 tipc_bearer_send(p, buf, &p->media->bcast_addr); 623 tipc_bearer_send(p, buf, &p->bcast_addr);
624 else if (s && !tipc_bearer_blocked(s)) 624 else if (s && !tipc_bearer_blocked(s))
625 /* unable to send on primary bearer */ 625 /* unable to send on primary bearer */
626 tipc_bearer_send(s, buf, &s->media->bcast_addr); 626 tipc_bearer_send(s, buf, &s->bcast_addr);
627 else 627 else
628 /* unable to send on either bearer */ 628 /* unable to send on either bearer */
629 continue; 629 continue;
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c
index aa62f93a9127..45d5398cd957 100644
--- a/net/tipc/bearer.c
+++ b/net/tipc/bearer.c
@@ -89,9 +89,6 @@ int tipc_register_media(struct tipc_media *m_ptr)
89 89
90 if ((strlen(m_ptr->name) + 1) > TIPC_MAX_MEDIA_NAME) 90 if ((strlen(m_ptr->name) + 1) > TIPC_MAX_MEDIA_NAME)
91 goto exit; 91 goto exit;
92 if ((m_ptr->bcast_addr.media_id != m_ptr->type_id) ||
93 !m_ptr->bcast_addr.broadcast)
94 goto exit;
95 if (m_ptr->priority > TIPC_MAX_LINK_PRI) 92 if (m_ptr->priority > TIPC_MAX_LINK_PRI)
96 goto exit; 93 goto exit;
97 if ((m_ptr->tolerance < TIPC_MIN_LINK_TOL) || 94 if ((m_ptr->tolerance < TIPC_MIN_LINK_TOL) ||
@@ -407,7 +404,7 @@ restart:
407 INIT_LIST_HEAD(&b_ptr->links); 404 INIT_LIST_HEAD(&b_ptr->links);
408 spin_lock_init(&b_ptr->lock); 405 spin_lock_init(&b_ptr->lock);
409 406
410 res = tipc_disc_create(b_ptr, &m_ptr->bcast_addr, disc_domain); 407 res = tipc_disc_create(b_ptr, &b_ptr->bcast_addr, disc_domain);
411 if (res) { 408 if (res) {
412 bearer_disable(b_ptr); 409 bearer_disable(b_ptr);
413 pr_warn("Bearer <%s> rejected, discovery object creation failed\n", 410 pr_warn("Bearer <%s> rejected, discovery object creation failed\n",
diff --git a/net/tipc/bearer.h b/net/tipc/bearer.h
index cc2d74e1f9f7..3b3fa26cb3dd 100644
--- a/net/tipc/bearer.h
+++ b/net/tipc/bearer.h
@@ -94,8 +94,8 @@ struct tipc_media {
94 void (*disable_bearer)(struct tipc_bearer *b_ptr); 94 void (*disable_bearer)(struct tipc_bearer *b_ptr);
95 int (*addr2str)(struct tipc_media_addr *a, char *str_buf, int str_size); 95 int (*addr2str)(struct tipc_media_addr *a, char *str_buf, int str_size);
96 int (*addr2msg)(struct tipc_media_addr *a, char *msg_area); 96 int (*addr2msg)(struct tipc_media_addr *a, char *msg_area);
97 int (*msg2addr)(struct tipc_media_addr *a, char *msg_area); 97 int (*msg2addr)(const struct tipc_bearer *b_ptr,
98 struct tipc_media_addr bcast_addr; 98 struct tipc_media_addr *a, char *msg_area);
99 u32 priority; 99 u32 priority;
100 u32 tolerance; 100 u32 tolerance;
101 u32 window; 101 u32 window;
@@ -134,6 +134,7 @@ struct tipc_bearer {
134 char name[TIPC_MAX_BEARER_NAME]; 134 char name[TIPC_MAX_BEARER_NAME];
135 spinlock_t lock; 135 spinlock_t lock;
136 struct tipc_media *media; 136 struct tipc_media *media;
137 struct tipc_media_addr bcast_addr;
137 u32 priority; 138 u32 priority;
138 u32 window; 139 u32 window;
139 u32 tolerance; 140 u32 tolerance;
diff --git a/net/tipc/discover.c b/net/tipc/discover.c
index 1074b9587e81..eedff58d0387 100644
--- a/net/tipc/discover.c
+++ b/net/tipc/discover.c
@@ -129,7 +129,7 @@ void tipc_disc_recv_msg(struct sk_buff *buf, struct tipc_bearer *b_ptr)
129 int link_fully_up; 129 int link_fully_up;
130 130
131 media_addr.broadcast = 1; 131 media_addr.broadcast = 1;
132 b_ptr->media->msg2addr(&media_addr, msg_media_addr(msg)); 132 b_ptr->media->msg2addr(b_ptr, &media_addr, msg_media_addr(msg));
133 kfree_skb(buf); 133 kfree_skb(buf);
134 134
135 /* Ensure message from node is valid and communication is permitted */ 135 /* Ensure message from node is valid and communication is permitted */
diff --git a/net/tipc/eth_media.c b/net/tipc/eth_media.c
index 1bdc6df0a79e..06488195f998 100644
--- a/net/tipc/eth_media.c
+++ b/net/tipc/eth_media.c
@@ -77,12 +77,13 @@ static struct notifier_block notifier = {
77 * Media-dependent "value" field stores MAC address in first 6 bytes 77 * Media-dependent "value" field stores MAC address in first 6 bytes
78 * and zeroes out the remaining bytes. 78 * and zeroes out the remaining bytes.
79 */ 79 */
80static void eth_media_addr_set(struct tipc_media_addr *a, char *mac) 80static void eth_media_addr_set(const struct tipc_bearer *tb_ptr,
81 struct tipc_media_addr *a, char *mac)
81{ 82{
82 memcpy(a->value, mac, ETH_ALEN); 83 memcpy(a->value, mac, ETH_ALEN);
83 memset(a->value + ETH_ALEN, 0, sizeof(a->value) - ETH_ALEN); 84 memset(a->value + ETH_ALEN, 0, sizeof(a->value) - ETH_ALEN);
84 a->media_id = TIPC_MEDIA_TYPE_ETH; 85 a->media_id = TIPC_MEDIA_TYPE_ETH;
85 a->broadcast = !memcmp(mac, eth_media_info.bcast_addr.value, ETH_ALEN); 86 a->broadcast = !memcmp(mac, tb_ptr->bcast_addr.value, ETH_ALEN);
86} 87}
87 88
88/** 89/**
@@ -201,9 +202,13 @@ static int enable_bearer(struct tipc_bearer *tb_ptr)
201 /* Associate TIPC bearer with Ethernet bearer */ 202 /* Associate TIPC bearer with Ethernet bearer */
202 eb_ptr->bearer = tb_ptr; 203 eb_ptr->bearer = tb_ptr;
203 tb_ptr->usr_handle = (void *)eb_ptr; 204 tb_ptr->usr_handle = (void *)eb_ptr;
205 memset(tb_ptr->bcast_addr.value, 0, sizeof(tb_ptr->bcast_addr.value));
206 memcpy(tb_ptr->bcast_addr.value, dev->broadcast, ETH_ALEN);
207 tb_ptr->bcast_addr.media_id = TIPC_MEDIA_TYPE_ETH;
208 tb_ptr->bcast_addr.broadcast = 1;
204 tb_ptr->mtu = dev->mtu; 209 tb_ptr->mtu = dev->mtu;
205 tb_ptr->blocked = 0; 210 tb_ptr->blocked = 0;
206 eth_media_addr_set(&tb_ptr->addr, (char *)dev->dev_addr); 211 eth_media_addr_set(tb_ptr, &tb_ptr->addr, (char *)dev->dev_addr);
207 return 0; 212 return 0;
208} 213}
209 214
@@ -315,12 +320,13 @@ static int eth_addr2msg(struct tipc_media_addr *a, char *msg_area)
315/** 320/**
316 * eth_str2addr - convert message header address format to Ethernet format 321 * eth_str2addr - convert message header address format to Ethernet format
317 */ 322 */
318static int eth_msg2addr(struct tipc_media_addr *a, char *msg_area) 323static int eth_msg2addr(const struct tipc_bearer *tb_ptr,
324 struct tipc_media_addr *a, char *msg_area)
319{ 325{
320 if (msg_area[TIPC_MEDIA_TYPE_OFFSET] != TIPC_MEDIA_TYPE_ETH) 326 if (msg_area[TIPC_MEDIA_TYPE_OFFSET] != TIPC_MEDIA_TYPE_ETH)
321 return 1; 327 return 1;
322 328
323 eth_media_addr_set(a, msg_area + ETH_ADDR_OFFSET); 329 eth_media_addr_set(tb_ptr, a, msg_area + ETH_ADDR_OFFSET);
324 return 0; 330 return 0;
325} 331}
326 332
@@ -334,8 +340,6 @@ static struct tipc_media eth_media_info = {
334 .addr2str = eth_addr2str, 340 .addr2str = eth_addr2str,
335 .addr2msg = eth_addr2msg, 341 .addr2msg = eth_addr2msg,
336 .msg2addr = eth_msg2addr, 342 .msg2addr = eth_msg2addr,
337 .bcast_addr = { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
338 TIPC_MEDIA_TYPE_ETH, 1 },
339 .priority = TIPC_DEF_LINK_PRI, 343 .priority = TIPC_DEF_LINK_PRI,
340 .tolerance = TIPC_DEF_LINK_TOL, 344 .tolerance = TIPC_DEF_LINK_TOL,
341 .window = TIPC_DEF_LINK_WIN, 345 .window = TIPC_DEF_LINK_WIN,