summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/tipc/bearer.c106
-rw-r--r--net/tipc/bearer.h26
-rw-r--r--net/tipc/eth_media.c124
-rw-r--r--net/tipc/ib_media.c124
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 */
441void 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
457int 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 */
485void 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 */
498int 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 */
531void 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 */
89struct tipc_media { 90struct 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 */
130struct tipc_bearer { 132struct 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);
178int tipc_media_set_window(const char *name, u32 new_value); 179int tipc_media_set_window(const char *name, u32 new_value);
179void tipc_media_addr_printf(char *buf, int len, struct tipc_media_addr *a); 180void tipc_media_addr_printf(char *buf, int len, struct tipc_media_addr *a);
180struct sk_buff *tipc_media_get_names(void); 181struct sk_buff *tipc_media_get_names(void);
182void tipc_l2_media_addr_set(const struct tipc_bearer *b,
183 struct tipc_media_addr *a, char *mac);
184int tipc_enable_l2_media(struct tipc_bearer *b);
185void tipc_disable_l2_media(struct tipc_bearer *b);
186int tipc_l2_send_msg(struct sk_buff *buf, struct tipc_bearer *b,
187 struct tipc_media_addr *dest);
181 188
182struct sk_buff *tipc_bearer_get_names(void); 189struct sk_buff *tipc_bearer_get_names(void);
183void tipc_bearer_add_dest(struct tipc_bearer *b_ptr, u32 dest); 190void tipc_bearer_add_dest(struct tipc_bearer *b_ptr, u32 dest);
@@ -188,18 +195,7 @@ struct tipc_media *tipc_media_find(const char *name);
188int tipc_bearer_setup(void); 195int tipc_bearer_setup(void);
189void tipc_bearer_cleanup(void); 196void tipc_bearer_cleanup(void);
190void tipc_bearer_stop(void); 197void tipc_bearer_stop(void);
191 198void 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 */
199static 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 43static 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 */
48static 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 */
60static 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 */
90static 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 */
120static 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 */
129static 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 54static int tipc_eth_addr2msg(struct tipc_media_addr *a, char *msg_area)
140 */
141static 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 63static int tipc_eth_msg2addr(const struct tipc_bearer *tb_ptr,
151 */ 64 struct tipc_media_addr *a, char *msg_area)
152static 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 */
165struct tipc_media eth_media_info = { 74struct 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 46static 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 */
51static 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 */
63static 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 */
93static 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 */
123static 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 */
132static 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 58static int tipc_ib_addr2msg(struct tipc_media_addr *a, char *msg_area)
144 */
145static 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 67static int tipc_ib_msg2addr(const struct tipc_bearer *tb_ptr,
155 */ 68 struct tipc_media_addr *a, char *msg_area)
156static 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 */
166struct tipc_media ib_media_info = { 75struct 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