diff options
-rw-r--r-- | net/tipc/bearer.c | 106 | ||||
-rw-r--r-- | net/tipc/bearer.h | 26 | ||||
-rw-r--r-- | net/tipc/eth_media.c | 124 | ||||
-rw-r--r-- | net/tipc/ib_media.c | 124 |
4 files changed, 149 insertions, 231 deletions
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index e95e0b91ef30..3bb5f266b0eb 100644 --- a/net/tipc/bearer.c +++ b/net/tipc/bearer.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * net/tipc/bearer.c: TIPC bearer code | 2 | * net/tipc/bearer.c: TIPC bearer code |
3 | * | 3 | * |
4 | * Copyright (c) 1996-2006, 2013, Ericsson AB | 4 | * Copyright (c) 1996-2006, 2013, Ericsson AB |
5 | * Copyright (c) 2004-2006, 2010-2011, Wind River Systems | 5 | * Copyright (c) 2004-2006, 2010-2013, Wind River Systems |
6 | * All rights reserved. | 6 | * All rights reserved. |
7 | * | 7 | * |
8 | * Redistribution and use in source and binary forms, with or without | 8 | * Redistribution and use in source and binary forms, with or without |
@@ -332,6 +332,7 @@ restart: | |||
332 | 332 | ||
333 | b_ptr = &tipc_bearers[bearer_id]; | 333 | b_ptr = &tipc_bearers[bearer_id]; |
334 | strcpy(b_ptr->name, name); | 334 | strcpy(b_ptr->name, name); |
335 | b_ptr->media = m_ptr; | ||
335 | res = m_ptr->enable_media(b_ptr); | 336 | res = m_ptr->enable_media(b_ptr); |
336 | if (res) { | 337 | if (res) { |
337 | pr_warn("Bearer <%s> rejected, enable failure (%d)\n", | 338 | pr_warn("Bearer <%s> rejected, enable failure (%d)\n", |
@@ -340,7 +341,6 @@ restart: | |||
340 | } | 341 | } |
341 | 342 | ||
342 | b_ptr->identity = bearer_id; | 343 | b_ptr->identity = bearer_id; |
343 | b_ptr->media = m_ptr; | ||
344 | b_ptr->tolerance = m_ptr->tolerance; | 344 | b_ptr->tolerance = m_ptr->tolerance; |
345 | b_ptr->window = m_ptr->window; | 345 | b_ptr->window = m_ptr->window; |
346 | b_ptr->net_plane = bearer_id + 'A'; | 346 | b_ptr->net_plane = bearer_id + 'A'; |
@@ -432,6 +432,108 @@ int tipc_disable_bearer(const char *name) | |||
432 | return res; | 432 | return res; |
433 | } | 433 | } |
434 | 434 | ||
435 | |||
436 | /* tipc_l2_media_addr_set - initialize Ethernet media address structure | ||
437 | * | ||
438 | * Media-dependent "value" field stores MAC address in first 6 bytes | ||
439 | * and zeroes out the remaining bytes. | ||
440 | */ | ||
441 | void tipc_l2_media_addr_set(const struct tipc_bearer *b, | ||
442 | struct tipc_media_addr *a, char *mac) | ||
443 | { | ||
444 | int len = b->media->hwaddr_len; | ||
445 | |||
446 | if (unlikely(sizeof(a->value) < len)) { | ||
447 | WARN_ONCE(1, "Media length invalid\n"); | ||
448 | return; | ||
449 | } | ||
450 | |||
451 | memcpy(a->value, mac, len); | ||
452 | memset(a->value + len, 0, sizeof(a->value) - len); | ||
453 | a->media_id = b->media->type_id; | ||
454 | a->broadcast = !memcmp(mac, b->bcast_addr.value, len); | ||
455 | } | ||
456 | |||
457 | int tipc_enable_l2_media(struct tipc_bearer *b) | ||
458 | { | ||
459 | struct net_device *dev; | ||
460 | char *driver_name = strchr((const char *)b->name, ':') + 1; | ||
461 | |||
462 | /* Find device with specified name */ | ||
463 | dev = dev_get_by_name(&init_net, driver_name); | ||
464 | if (!dev) | ||
465 | return -ENODEV; | ||
466 | |||
467 | /* Associate TIPC bearer with Ethernet bearer */ | ||
468 | b->media_ptr = dev; | ||
469 | memset(b->bcast_addr.value, 0, sizeof(b->bcast_addr.value)); | ||
470 | memcpy(b->bcast_addr.value, dev->broadcast, b->media->hwaddr_len); | ||
471 | b->bcast_addr.media_id = b->media->type_id; | ||
472 | b->bcast_addr.broadcast = 1; | ||
473 | b->mtu = dev->mtu; | ||
474 | tipc_l2_media_addr_set(b, &b->addr, (char *)dev->dev_addr); | ||
475 | rcu_assign_pointer(dev->tipc_ptr, b); | ||
476 | return 0; | ||
477 | } | ||
478 | |||
479 | /* tipc_disable_l2_media - detach TIPC bearer from an Ethernet interface | ||
480 | * | ||
481 | * Mark Ethernet bearer as inactive so that incoming buffers are thrown away, | ||
482 | * then get worker thread to complete bearer cleanup. (Can't do cleanup | ||
483 | * here because cleanup code needs to sleep and caller holds spinlocks.) | ||
484 | */ | ||
485 | void tipc_disable_l2_media(struct tipc_bearer *b) | ||
486 | { | ||
487 | struct net_device *dev = (struct net_device *)b->media_ptr; | ||
488 | RCU_INIT_POINTER(dev->tipc_ptr, NULL); | ||
489 | dev_put(dev); | ||
490 | } | ||
491 | |||
492 | /** | ||
493 | * tipc_l2_send_msg - send a TIPC packet out over an Ethernet interface | ||
494 | * @buf: the packet to be sent | ||
495 | * @b_ptr: the bearer throught which the packet is to be sent | ||
496 | * @dest: peer destination address | ||
497 | */ | ||
498 | int tipc_l2_send_msg(struct sk_buff *buf, struct tipc_bearer *b, | ||
499 | struct tipc_media_addr *dest) | ||
500 | { | ||
501 | struct sk_buff *clone; | ||
502 | int delta; | ||
503 | struct net_device *dev = (struct net_device *)b->media_ptr; | ||
504 | |||
505 | clone = skb_clone(buf, GFP_ATOMIC); | ||
506 | if (!clone) | ||
507 | return 0; | ||
508 | |||
509 | delta = dev->hard_header_len - skb_headroom(buf); | ||
510 | if ((delta > 0) && | ||
511 | pskb_expand_head(clone, SKB_DATA_ALIGN(delta), 0, GFP_ATOMIC)) { | ||
512 | kfree_skb(clone); | ||
513 | return 0; | ||
514 | } | ||
515 | |||
516 | skb_reset_network_header(clone); | ||
517 | clone->dev = dev; | ||
518 | clone->protocol = htons(ETH_P_TIPC); | ||
519 | dev_hard_header(clone, dev, ETH_P_TIPC, dest->value, | ||
520 | dev->dev_addr, clone->len); | ||
521 | dev_queue_xmit(clone); | ||
522 | return 0; | ||
523 | } | ||
524 | |||
525 | /* tipc_bearer_send- sends buffer to destination over bearer | ||
526 | * | ||
527 | * IMPORTANT: | ||
528 | * The media send routine must not alter the buffer being passed in | ||
529 | * as it may be needed for later retransmission! | ||
530 | */ | ||
531 | void tipc_bearer_send(struct tipc_bearer *b, struct sk_buff *buf, | ||
532 | struct tipc_media_addr *dest) | ||
533 | { | ||
534 | b->media->send_msg(buf, b, dest); | ||
535 | } | ||
536 | |||
435 | /** | 537 | /** |
436 | * tipc_l2_rcv_msg - handle incoming TIPC message from an interface | 538 | * tipc_l2_rcv_msg - handle incoming TIPC message from an interface |
437 | * @buf: the received packet | 539 | * @buf: the received packet |
diff --git a/net/tipc/bearer.h b/net/tipc/bearer.h index 0974c2f2bbe5..fa95c34ca926 100644 --- a/net/tipc/bearer.h +++ b/net/tipc/bearer.h | |||
@@ -84,6 +84,7 @@ struct tipc_bearer; | |||
84 | * @tolerance: default time (in ms) before declaring link failure | 84 | * @tolerance: default time (in ms) before declaring link failure |
85 | * @window: default window (in packets) before declaring link congestion | 85 | * @window: default window (in packets) before declaring link congestion |
86 | * @type_id: TIPC media identifier | 86 | * @type_id: TIPC media identifier |
87 | * @hwaddr_len: TIPC media address len | ||
87 | * @name: media name | 88 | * @name: media name |
88 | */ | 89 | */ |
89 | struct tipc_media { | 90 | struct tipc_media { |
@@ -100,6 +101,7 @@ struct tipc_media { | |||
100 | u32 tolerance; | 101 | u32 tolerance; |
101 | u32 window; | 102 | u32 window; |
102 | u32 type_id; | 103 | u32 type_id; |
104 | u32 hwaddr_len; | ||
103 | char name[TIPC_MAX_MEDIA_NAME]; | 105 | char name[TIPC_MAX_MEDIA_NAME]; |
104 | }; | 106 | }; |
105 | 107 | ||
@@ -128,8 +130,7 @@ struct tipc_media { | |||
128 | * care of initializing all other fields. | 130 | * care of initializing all other fields. |
129 | */ | 131 | */ |
130 | struct tipc_bearer { | 132 | struct tipc_bearer { |
131 | struct net_device *dev; | 133 | void *media_ptr; /* initalized by media */ |
132 | void *usr_handle; /* initalized by media */ | ||
133 | u32 mtu; /* initalized by media */ | 134 | u32 mtu; /* initalized by media */ |
134 | struct tipc_media_addr addr; /* initalized by media */ | 135 | struct tipc_media_addr addr; /* initalized by media */ |
135 | char name[TIPC_MAX_BEARER_NAME]; | 136 | char name[TIPC_MAX_BEARER_NAME]; |
@@ -178,6 +179,12 @@ int tipc_media_set_priority(const char *name, u32 new_value); | |||
178 | int tipc_media_set_window(const char *name, u32 new_value); | 179 | int tipc_media_set_window(const char *name, u32 new_value); |
179 | void tipc_media_addr_printf(char *buf, int len, struct tipc_media_addr *a); | 180 | void tipc_media_addr_printf(char *buf, int len, struct tipc_media_addr *a); |
180 | struct sk_buff *tipc_media_get_names(void); | 181 | struct sk_buff *tipc_media_get_names(void); |
182 | void tipc_l2_media_addr_set(const struct tipc_bearer *b, | ||
183 | struct tipc_media_addr *a, char *mac); | ||
184 | int tipc_enable_l2_media(struct tipc_bearer *b); | ||
185 | void tipc_disable_l2_media(struct tipc_bearer *b); | ||
186 | int tipc_l2_send_msg(struct sk_buff *buf, struct tipc_bearer *b, | ||
187 | struct tipc_media_addr *dest); | ||
181 | 188 | ||
182 | struct sk_buff *tipc_bearer_get_names(void); | 189 | struct sk_buff *tipc_bearer_get_names(void); |
183 | void tipc_bearer_add_dest(struct tipc_bearer *b_ptr, u32 dest); | 190 | void tipc_bearer_add_dest(struct tipc_bearer *b_ptr, u32 dest); |
@@ -188,18 +195,7 @@ struct tipc_media *tipc_media_find(const char *name); | |||
188 | int tipc_bearer_setup(void); | 195 | int tipc_bearer_setup(void); |
189 | void tipc_bearer_cleanup(void); | 196 | void tipc_bearer_cleanup(void); |
190 | void tipc_bearer_stop(void); | 197 | void tipc_bearer_stop(void); |
191 | 198 | void tipc_bearer_send(struct tipc_bearer *b, struct sk_buff *buf, | |
192 | /** | 199 | struct tipc_media_addr *dest); |
193 | * tipc_bearer_send- sends buffer to destination over bearer | ||
194 | * | ||
195 | * IMPORTANT: | ||
196 | * The media send routine must not alter the buffer being passed in | ||
197 | * as it may be needed for later retransmission! | ||
198 | */ | ||
199 | static inline void tipc_bearer_send(struct tipc_bearer *b, struct sk_buff *buf, | ||
200 | struct tipc_media_addr *dest) | ||
201 | { | ||
202 | b->media->send_msg(buf, b, dest); | ||
203 | } | ||
204 | 200 | ||
205 | #endif /* _TIPC_BEARER_H */ | 201 | #endif /* _TIPC_BEARER_H */ |
diff --git a/net/tipc/eth_media.c b/net/tipc/eth_media.c index f28f7160adba..67cf3f935dba 100644 --- a/net/tipc/eth_media.c +++ b/net/tipc/eth_media.c | |||
@@ -39,94 +39,9 @@ | |||
39 | 39 | ||
40 | #define ETH_ADDR_OFFSET 4 /* message header offset of MAC address */ | 40 | #define ETH_ADDR_OFFSET 4 /* message header offset of MAC address */ |
41 | 41 | ||
42 | /** | 42 | /* convert Ethernet address to string */ |
43 | * eth_media_addr_set - initialize Ethernet media address structure | 43 | static int tipc_eth_addr2str(struct tipc_media_addr *a, char *str_buf, |
44 | * | 44 | int str_size) |
45 | * Media-dependent "value" field stores MAC address in first 6 bytes | ||
46 | * and zeroes out the remaining bytes. | ||
47 | */ | ||
48 | static void eth_media_addr_set(const struct tipc_bearer *tb_ptr, | ||
49 | struct tipc_media_addr *a, char *mac) | ||
50 | { | ||
51 | memcpy(a->value, mac, ETH_ALEN); | ||
52 | memset(a->value + ETH_ALEN, 0, sizeof(a->value) - ETH_ALEN); | ||
53 | a->media_id = TIPC_MEDIA_TYPE_ETH; | ||
54 | a->broadcast = !memcmp(mac, tb_ptr->bcast_addr.value, ETH_ALEN); | ||
55 | } | ||
56 | |||
57 | /** | ||
58 | * send_msg - send a TIPC message out over an Ethernet interface | ||
59 | */ | ||
60 | static int send_msg(struct sk_buff *buf, struct tipc_bearer *tb_ptr, | ||
61 | struct tipc_media_addr *dest) | ||
62 | { | ||
63 | struct sk_buff *clone; | ||
64 | int delta; | ||
65 | struct net_device *dev = tb_ptr->dev; | ||
66 | |||
67 | clone = skb_clone(buf, GFP_ATOMIC); | ||
68 | if (!clone) | ||
69 | return 0; | ||
70 | |||
71 | delta = dev->hard_header_len - skb_headroom(buf); | ||
72 | if ((delta > 0) && | ||
73 | pskb_expand_head(clone, SKB_DATA_ALIGN(delta), 0, GFP_ATOMIC)) { | ||
74 | kfree_skb(clone); | ||
75 | return 0; | ||
76 | } | ||
77 | |||
78 | skb_reset_network_header(clone); | ||
79 | clone->dev = dev; | ||
80 | clone->protocol = htons(ETH_P_TIPC); | ||
81 | dev_hard_header(clone, dev, ETH_P_TIPC, dest->value, | ||
82 | dev->dev_addr, clone->len); | ||
83 | dev_queue_xmit(clone); | ||
84 | return 0; | ||
85 | } | ||
86 | |||
87 | /** | ||
88 | * enable_media - attach TIPC bearer to an Ethernet interface | ||
89 | */ | ||
90 | static int enable_media(struct tipc_bearer *tb_ptr) | ||
91 | { | ||
92 | struct net_device *dev; | ||
93 | char *driver_name = strchr((const char *)tb_ptr->name, ':') + 1; | ||
94 | |||
95 | /* Find device with specified name */ | ||
96 | dev = dev_get_by_name(&init_net, driver_name); | ||
97 | if (!dev) | ||
98 | return -ENODEV; | ||
99 | |||
100 | /* Associate TIPC bearer with Ethernet bearer */ | ||
101 | tb_ptr->dev = dev; | ||
102 | tb_ptr->usr_handle = NULL; | ||
103 | memset(tb_ptr->bcast_addr.value, 0, sizeof(tb_ptr->bcast_addr.value)); | ||
104 | memcpy(tb_ptr->bcast_addr.value, dev->broadcast, ETH_ALEN); | ||
105 | tb_ptr->bcast_addr.media_id = TIPC_MEDIA_TYPE_ETH; | ||
106 | tb_ptr->bcast_addr.broadcast = 1; | ||
107 | tb_ptr->mtu = dev->mtu; | ||
108 | eth_media_addr_set(tb_ptr, &tb_ptr->addr, (char *)dev->dev_addr); | ||
109 | rcu_assign_pointer(dev->tipc_ptr, tb_ptr); | ||
110 | return 0; | ||
111 | } | ||
112 | |||
113 | /** | ||
114 | * disable_media - detach TIPC bearer from an Ethernet interface | ||
115 | * | ||
116 | * Mark Ethernet bearer as inactive so that incoming buffers are thrown away, | ||
117 | * then get worker thread to complete bearer cleanup. (Can't do cleanup | ||
118 | * here because cleanup code needs to sleep and caller holds spinlocks.) | ||
119 | */ | ||
120 | static void disable_media(struct tipc_bearer *tb_ptr) | ||
121 | { | ||
122 | RCU_INIT_POINTER(tb_ptr->dev->tipc_ptr, NULL); | ||
123 | dev_put(tb_ptr->dev); | ||
124 | } | ||
125 | |||
126 | /** | ||
127 | * eth_addr2str - convert Ethernet address to string | ||
128 | */ | ||
129 | static int eth_addr2str(struct tipc_media_addr *a, char *str_buf, int str_size) | ||
130 | { | 45 | { |
131 | if (str_size < 18) /* 18 = strlen("aa:bb:cc:dd:ee:ff\0") */ | 46 | if (str_size < 18) /* 18 = strlen("aa:bb:cc:dd:ee:ff\0") */ |
132 | return 1; | 47 | return 1; |
@@ -135,10 +50,8 @@ static int eth_addr2str(struct tipc_media_addr *a, char *str_buf, int str_size) | |||
135 | return 0; | 50 | return 0; |
136 | } | 51 | } |
137 | 52 | ||
138 | /** | 53 | /* convert Ethernet address format to message header format */ |
139 | * eth_str2addr - convert Ethernet address format to message header format | 54 | static int tipc_eth_addr2msg(struct tipc_media_addr *a, char *msg_area) |
140 | */ | ||
141 | static int eth_addr2msg(struct tipc_media_addr *a, char *msg_area) | ||
142 | { | 55 | { |
143 | memset(msg_area, 0, TIPC_MEDIA_ADDR_SIZE); | 56 | memset(msg_area, 0, TIPC_MEDIA_ADDR_SIZE); |
144 | msg_area[TIPC_MEDIA_TYPE_OFFSET] = TIPC_MEDIA_TYPE_ETH; | 57 | msg_area[TIPC_MEDIA_TYPE_OFFSET] = TIPC_MEDIA_TYPE_ETH; |
@@ -146,33 +59,30 @@ static int eth_addr2msg(struct tipc_media_addr *a, char *msg_area) | |||
146 | return 0; | 59 | return 0; |
147 | } | 60 | } |
148 | 61 | ||
149 | /** | 62 | /* convert message header address format to Ethernet format */ |
150 | * eth_str2addr - convert message header address format to Ethernet format | 63 | static int tipc_eth_msg2addr(const struct tipc_bearer *tb_ptr, |
151 | */ | 64 | struct tipc_media_addr *a, char *msg_area) |
152 | static int eth_msg2addr(const struct tipc_bearer *tb_ptr, | ||
153 | struct tipc_media_addr *a, char *msg_area) | ||
154 | { | 65 | { |
155 | if (msg_area[TIPC_MEDIA_TYPE_OFFSET] != TIPC_MEDIA_TYPE_ETH) | 66 | if (msg_area[TIPC_MEDIA_TYPE_OFFSET] != TIPC_MEDIA_TYPE_ETH) |
156 | return 1; | 67 | return 1; |
157 | 68 | ||
158 | eth_media_addr_set(tb_ptr, a, msg_area + ETH_ADDR_OFFSET); | 69 | tipc_l2_media_addr_set(tb_ptr, a, msg_area + ETH_ADDR_OFFSET); |
159 | return 0; | 70 | return 0; |
160 | } | 71 | } |
161 | 72 | ||
162 | /* | 73 | /* Ethernet media registration info */ |
163 | * Ethernet media registration info | ||
164 | */ | ||
165 | struct tipc_media eth_media_info = { | 74 | struct tipc_media eth_media_info = { |
166 | .send_msg = send_msg, | 75 | .send_msg = tipc_l2_send_msg, |
167 | .enable_media = enable_media, | 76 | .enable_media = tipc_enable_l2_media, |
168 | .disable_media = disable_media, | 77 | .disable_media = tipc_disable_l2_media, |
169 | .addr2str = eth_addr2str, | 78 | .addr2str = tipc_eth_addr2str, |
170 | .addr2msg = eth_addr2msg, | 79 | .addr2msg = tipc_eth_addr2msg, |
171 | .msg2addr = eth_msg2addr, | 80 | .msg2addr = tipc_eth_msg2addr, |
172 | .priority = TIPC_DEF_LINK_PRI, | 81 | .priority = TIPC_DEF_LINK_PRI, |
173 | .tolerance = TIPC_DEF_LINK_TOL, | 82 | .tolerance = TIPC_DEF_LINK_TOL, |
174 | .window = TIPC_DEF_LINK_WIN, | 83 | .window = TIPC_DEF_LINK_WIN, |
175 | .type_id = TIPC_MEDIA_TYPE_ETH, | 84 | .type_id = TIPC_MEDIA_TYPE_ETH, |
85 | .hwaddr_len = ETH_ALEN, | ||
176 | .name = "eth" | 86 | .name = "eth" |
177 | }; | 87 | }; |
178 | 88 | ||
diff --git a/net/tipc/ib_media.c b/net/tipc/ib_media.c index 62d91aeda058..844a77e25828 100644 --- a/net/tipc/ib_media.c +++ b/net/tipc/ib_media.c | |||
@@ -42,94 +42,9 @@ | |||
42 | #include "core.h" | 42 | #include "core.h" |
43 | #include "bearer.h" | 43 | #include "bearer.h" |
44 | 44 | ||
45 | /** | 45 | /* convert InfiniBand address to string */ |
46 | * ib_media_addr_set - initialize Infiniband media address structure | 46 | static int tipc_ib_addr2str(struct tipc_media_addr *a, char *str_buf, |
47 | * | 47 | int str_size) |
48 | * Media-dependent "value" field stores MAC address in first 6 bytes | ||
49 | * and zeroes out the remaining bytes. | ||
50 | */ | ||
51 | static void ib_media_addr_set(const struct tipc_bearer *tb_ptr, | ||
52 | struct tipc_media_addr *a, char *mac) | ||
53 | { | ||
54 | BUILD_BUG_ON(sizeof(a->value) < INFINIBAND_ALEN); | ||
55 | memcpy(a->value, mac, INFINIBAND_ALEN); | ||
56 | a->media_id = TIPC_MEDIA_TYPE_IB; | ||
57 | a->broadcast = !memcmp(mac, tb_ptr->bcast_addr.value, INFINIBAND_ALEN); | ||
58 | } | ||
59 | |||
60 | /** | ||
61 | * send_msg - send a TIPC message out over an InfiniBand interface | ||
62 | */ | ||
63 | static int send_msg(struct sk_buff *buf, struct tipc_bearer *tb_ptr, | ||
64 | struct tipc_media_addr *dest) | ||
65 | { | ||
66 | struct sk_buff *clone; | ||
67 | int delta; | ||
68 | struct net_device *dev = tb_ptr->dev; | ||
69 | |||
70 | clone = skb_clone(buf, GFP_ATOMIC); | ||
71 | if (!clone) | ||
72 | return 0; | ||
73 | |||
74 | delta = dev->hard_header_len - skb_headroom(buf); | ||
75 | if ((delta > 0) && | ||
76 | pskb_expand_head(clone, SKB_DATA_ALIGN(delta), 0, GFP_ATOMIC)) { | ||
77 | kfree_skb(clone); | ||
78 | return 0; | ||
79 | } | ||
80 | |||
81 | skb_reset_network_header(clone); | ||
82 | clone->dev = dev; | ||
83 | clone->protocol = htons(ETH_P_TIPC); | ||
84 | dev_hard_header(clone, dev, ETH_P_TIPC, dest->value, | ||
85 | dev->dev_addr, clone->len); | ||
86 | dev_queue_xmit(clone); | ||
87 | return 0; | ||
88 | } | ||
89 | |||
90 | /** | ||
91 | * enable_media - attach TIPC bearer to an InfiniBand interface | ||
92 | */ | ||
93 | static int enable_media(struct tipc_bearer *tb_ptr) | ||
94 | { | ||
95 | struct net_device *dev; | ||
96 | char *driver_name = strchr((const char *)tb_ptr->name, ':') + 1; | ||
97 | |||
98 | /* Find device with specified name */ | ||
99 | dev = dev_get_by_name(&init_net, driver_name); | ||
100 | if (!dev) | ||
101 | return -ENODEV; | ||
102 | |||
103 | /* Associate TIPC bearer with InfiniBand bearer */ | ||
104 | tb_ptr->dev = dev; | ||
105 | tb_ptr->usr_handle = NULL; | ||
106 | memset(tb_ptr->bcast_addr.value, 0, sizeof(tb_ptr->bcast_addr.value)); | ||
107 | memcpy(tb_ptr->bcast_addr.value, dev->broadcast, INFINIBAND_ALEN); | ||
108 | tb_ptr->bcast_addr.media_id = TIPC_MEDIA_TYPE_IB; | ||
109 | tb_ptr->bcast_addr.broadcast = 1; | ||
110 | tb_ptr->mtu = dev->mtu; | ||
111 | ib_media_addr_set(tb_ptr, &tb_ptr->addr, (char *)dev->dev_addr); | ||
112 | rcu_assign_pointer(dev->tipc_ptr, tb_ptr); | ||
113 | return 0; | ||
114 | } | ||
115 | |||
116 | /** | ||
117 | * disable_media - detach TIPC bearer from an InfiniBand interface | ||
118 | * | ||
119 | * Mark InfiniBand bearer as inactive so that incoming buffers are thrown away, | ||
120 | * then get worker thread to complete bearer cleanup. (Can't do cleanup | ||
121 | * here because cleanup code needs to sleep and caller holds spinlocks.) | ||
122 | */ | ||
123 | static void disable_media(struct tipc_bearer *tb_ptr) | ||
124 | { | ||
125 | RCU_INIT_POINTER(tb_ptr->dev->tipc_ptr, NULL); | ||
126 | dev_put(tb_ptr->dev); | ||
127 | } | ||
128 | |||
129 | /** | ||
130 | * ib_addr2str - convert InfiniBand address to string | ||
131 | */ | ||
132 | static int ib_addr2str(struct tipc_media_addr *a, char *str_buf, int str_size) | ||
133 | { | 48 | { |
134 | if (str_size < 60) /* 60 = 19 * strlen("xx:") + strlen("xx\0") */ | 49 | if (str_size < 60) /* 60 = 19 * strlen("xx:") + strlen("xx\0") */ |
135 | return 1; | 50 | return 1; |
@@ -139,10 +54,8 @@ static int ib_addr2str(struct tipc_media_addr *a, char *str_buf, int str_size) | |||
139 | return 0; | 54 | return 0; |
140 | } | 55 | } |
141 | 56 | ||
142 | /** | 57 | /* convert InfiniBand address format to message header format */ |
143 | * ib_addr2msg - convert InfiniBand address format to message header format | 58 | static int tipc_ib_addr2msg(struct tipc_media_addr *a, char *msg_area) |
144 | */ | ||
145 | static int ib_addr2msg(struct tipc_media_addr *a, char *msg_area) | ||
146 | { | 59 | { |
147 | memset(msg_area, 0, TIPC_MEDIA_ADDR_SIZE); | 60 | memset(msg_area, 0, TIPC_MEDIA_ADDR_SIZE); |
148 | msg_area[TIPC_MEDIA_TYPE_OFFSET] = TIPC_MEDIA_TYPE_IB; | 61 | msg_area[TIPC_MEDIA_TYPE_OFFSET] = TIPC_MEDIA_TYPE_IB; |
@@ -150,30 +63,27 @@ static int ib_addr2msg(struct tipc_media_addr *a, char *msg_area) | |||
150 | return 0; | 63 | return 0; |
151 | } | 64 | } |
152 | 65 | ||
153 | /** | 66 | /* convert message header address format to InfiniBand format */ |
154 | * ib_msg2addr - convert message header address format to InfiniBand format | 67 | static int tipc_ib_msg2addr(const struct tipc_bearer *tb_ptr, |
155 | */ | 68 | struct tipc_media_addr *a, char *msg_area) |
156 | static int ib_msg2addr(const struct tipc_bearer *tb_ptr, | ||
157 | struct tipc_media_addr *a, char *msg_area) | ||
158 | { | 69 | { |
159 | ib_media_addr_set(tb_ptr, a, msg_area); | 70 | tipc_l2_media_addr_set(tb_ptr, a, msg_area); |
160 | return 0; | 71 | return 0; |
161 | } | 72 | } |
162 | 73 | ||
163 | /* | 74 | /* InfiniBand media registration info */ |
164 | * InfiniBand media registration info | ||
165 | */ | ||
166 | struct tipc_media ib_media_info = { | 75 | struct tipc_media ib_media_info = { |
167 | .send_msg = send_msg, | 76 | .send_msg = tipc_l2_send_msg, |
168 | .enable_media = enable_media, | 77 | .enable_media = tipc_enable_l2_media, |
169 | .disable_media = disable_media, | 78 | .disable_media = tipc_disable_l2_media, |
170 | .addr2str = ib_addr2str, | 79 | .addr2str = tipc_ib_addr2str, |
171 | .addr2msg = ib_addr2msg, | 80 | .addr2msg = tipc_ib_addr2msg, |
172 | .msg2addr = ib_msg2addr, | 81 | .msg2addr = tipc_ib_msg2addr, |
173 | .priority = TIPC_DEF_LINK_PRI, | 82 | .priority = TIPC_DEF_LINK_PRI, |
174 | .tolerance = TIPC_DEF_LINK_TOL, | 83 | .tolerance = TIPC_DEF_LINK_TOL, |
175 | .window = TIPC_DEF_LINK_WIN, | 84 | .window = TIPC_DEF_LINK_WIN, |
176 | .type_id = TIPC_MEDIA_TYPE_IB, | 85 | .type_id = TIPC_MEDIA_TYPE_IB, |
86 | .hwaddr_len = INFINIBAND_ALEN, | ||
177 | .name = "ib" | 87 | .name = "ib" |
178 | }; | 88 | }; |
179 | 89 | ||