aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc
diff options
context:
space:
mode:
authorAllan Stephens <allan.stephens@windriver.com>2011-10-07 15:19:11 -0400
committerPaul Gortmaker <paul.gortmaker@windriver.com>2011-12-27 11:33:36 -0500
commit3d749a6a26b0811b4b2bb4ec2c47cd630a6bbf88 (patch)
tree57616bd9e10a70b9146cb46ccd8905ee2a75475d /net/tipc
parent4d163a326fa4868cce1bb75dd95855d40e5497c6 (diff)
tipc: Hide media-specific addressing details from generic bearer code
Reworks TIPC's media address data structure and associated processing routines to transfer all media-specific details of address conversion to the associated TIPC media adaptation code. TIPC's generic bearer code now only needs to know which media type an address is associated with and whether or not it is a broadcast address, and totally ignores the "value" field that contains the actual media-specific addressing info. These changes eliminate the need for a number of endianness conversion operations and will make it easier for TIPC to support new media types in the future. Signed-off-by: Allan Stephens <allan.stephens@windriver.com> Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
Diffstat (limited to 'net/tipc')
-rw-r--r--net/tipc/bearer.c14
-rw-r--r--net/tipc/bearer.h17
-rw-r--r--net/tipc/discover.c4
-rw-r--r--net/tipc/eth_media.c22
-rw-r--r--net/tipc/msg.c9
-rw-r--r--net/tipc/msg.h16
6 files changed, 41 insertions, 41 deletions
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c
index 17652f20a35..aa37261626d 100644
--- a/net/tipc/bearer.c
+++ b/net/tipc/bearer.c
@@ -108,7 +108,8 @@ int tipc_register_media(struct media *m_ptr)
108 108
109 if (!media_name_valid(m_ptr->name)) 109 if (!media_name_valid(m_ptr->name))
110 goto exit; 110 goto exit;
111 if (m_ptr->bcast_addr.type != htonl(m_ptr->type_id)) 111 if ((m_ptr->bcast_addr.media_id != m_ptr->type_id) ||
112 !m_ptr->bcast_addr.broadcast)
112 goto exit; 113 goto exit;
113 if (m_ptr->priority > TIPC_MAX_LINK_PRI) 114 if (m_ptr->priority > TIPC_MAX_LINK_PRI)
114 goto exit; 115 goto exit;
@@ -138,20 +139,17 @@ void tipc_media_addr_printf(struct print_buf *pb, struct tipc_media_addr *a)
138{ 139{
139 char addr_str[MAX_ADDR_STR]; 140 char addr_str[MAX_ADDR_STR];
140 struct media *m_ptr; 141 struct media *m_ptr;
141 u32 media_type;
142 142
143 media_type = ntohl(a->type); 143 m_ptr = media_find_id(a->media_id);
144 m_ptr = media_find_id(media_type);
145 144
146 if (m_ptr && !m_ptr->addr2str(a, addr_str, sizeof(addr_str))) 145 if (m_ptr && !m_ptr->addr2str(a, addr_str, sizeof(addr_str)))
147 tipc_printf(pb, "%s(%s)", m_ptr->name, addr_str); 146 tipc_printf(pb, "%s(%s)", m_ptr->name, addr_str);
148 else { 147 else {
149 unchar *addr = (unchar *)&a->dev_addr;
150 u32 i; 148 u32 i;
151 149
152 tipc_printf(pb, "UNKNOWN(%u)", media_type); 150 tipc_printf(pb, "UNKNOWN(%u)", a->media_id);
153 for (i = 0; i < (sizeof(*a) - sizeof(a->type)); i++) 151 for (i = 0; i < sizeof(a->value); i++)
154 tipc_printf(pb, "-%02x", addr[i]); 152 tipc_printf(pb, "-%02x", a->value[i]);
155 } 153 }
156} 154}
157 155
diff --git a/net/tipc/bearer.h b/net/tipc/bearer.h
index 41a61d219c3..54a5a575d69 100644
--- a/net/tipc/bearer.h
+++ b/net/tipc/bearer.h
@@ -59,17 +59,16 @@
59#define TIPC_MEDIA_TYPE_ETH 1 59#define TIPC_MEDIA_TYPE_ETH 1
60 60
61/* 61/*
62 * Destination address structure used by TIPC bearers when sending messages 62 * struct tipc_media_addr - destination address used by TIPC bearers
63 * 63 * @value: address info (format defined by media)
64 * IMPORTANT: The fields of this structure MUST be stored using the specified 64 * @media_id: TIPC media type identifier
65 * byte order indicated below, as the structure is exchanged between nodes 65 * @broadcast: non-zero if address is a broadcast address
66 * as part of a link setup process.
67 */ 66 */
67
68struct tipc_media_addr { 68struct tipc_media_addr {
69 __be32 type; /* bearer type (network byte order) */ 69 u8 value[TIPC_MEDIA_ADDR_SIZE];
70 union { 70 u8 media_id;
71 __u8 eth_addr[6]; /* 48 bit Ethernet addr (byte array) */ 71 u8 broadcast;
72 } dev_addr;
73}; 72};
74 73
75struct tipc_bearer; 74struct tipc_bearer;
diff --git a/net/tipc/discover.c b/net/tipc/discover.c
index f2fb96e86ee..1ea2d44bbc3 100644
--- a/net/tipc/discover.c
+++ b/net/tipc/discover.c
@@ -84,7 +84,7 @@ static struct sk_buff *tipc_disc_init_msg(u32 type,
84 msg_set_non_seq(msg, 1); 84 msg_set_non_seq(msg, 1);
85 msg_set_dest_domain(msg, dest_domain); 85 msg_set_dest_domain(msg, dest_domain);
86 msg_set_bc_netid(msg, tipc_net_id); 86 msg_set_bc_netid(msg, tipc_net_id);
87 msg_set_media_addr(msg, &b_ptr->addr); 87 b_ptr->media->addr2msg(&b_ptr->addr, msg_media_addr(msg));
88 } 88 }
89 return buf; 89 return buf;
90} 90}
@@ -130,7 +130,7 @@ void tipc_disc_recv_msg(struct sk_buff *buf, struct tipc_bearer *b_ptr)
130 u32 type = msg_type(msg); 130 u32 type = msg_type(msg);
131 int link_fully_up; 131 int link_fully_up;
132 132
133 msg_get_media_addr(msg, &media_addr); 133 b_ptr->media->msg2addr(&media_addr, msg_media_addr(msg));
134 buf_discard(buf); 134 buf_discard(buf);
135 135
136 /* Validate discovery message from requesting node */ 136 /* Validate discovery message from requesting node */
diff --git a/net/tipc/eth_media.c b/net/tipc/eth_media.c
index ebba0fcd937..3b75c0d656d 100644
--- a/net/tipc/eth_media.c
+++ b/net/tipc/eth_media.c
@@ -54,18 +54,24 @@ struct eth_bearer {
54 struct packet_type tipc_packet_type; 54 struct packet_type tipc_packet_type;
55}; 55};
56 56
57static struct media eth_media_info;
57static struct eth_bearer eth_bearers[MAX_ETH_BEARERS]; 58static struct eth_bearer eth_bearers[MAX_ETH_BEARERS];
58static int eth_started; 59static int eth_started;
59static struct notifier_block notifier; 60static struct notifier_block notifier;
60 61
61/** 62/**
62 * eth_media_addr_set - initialize Ethernet media address structure 63 * eth_media_addr_set - initialize Ethernet media address structure
64 *
65 * Media-dependent "value" field stores MAC address in first 6 bytes
66 * and zeroes out the remaining bytes.
63 */ 67 */
64 68
65static void eth_media_addr_set(struct tipc_media_addr *a, char *mac) 69static void eth_media_addr_set(struct tipc_media_addr *a, char *mac)
66{ 70{
67 a->type = htonl(TIPC_MEDIA_TYPE_ETH); 71 memcpy(a->value, mac, ETH_ALEN);
68 memcpy(&a->dev_addr.eth_addr, mac, ETH_ALEN); 72 memset(a->value + ETH_ALEN, 0, sizeof(a->value) - ETH_ALEN);
73 a->media_id = TIPC_MEDIA_TYPE_ETH;
74 a->broadcast = !memcmp(mac, eth_media_info.bcast_addr.value, ETH_ALEN);
69} 75}
70 76
71/** 77/**
@@ -94,7 +100,7 @@ static int send_msg(struct sk_buff *buf, struct tipc_bearer *tb_ptr,
94 100
95 skb_reset_network_header(clone); 101 skb_reset_network_header(clone);
96 clone->dev = dev; 102 clone->dev = dev;
97 dev_hard_header(clone, dev, ETH_P_TIPC, &dest->dev_addr.eth_addr, 103 dev_hard_header(clone, dev, ETH_P_TIPC, dest->value,
98 dev->dev_addr, clone->len); 104 dev->dev_addr, clone->len);
99 dev_queue_xmit(clone); 105 dev_queue_xmit(clone);
100 return 0; 106 return 0;
@@ -256,12 +262,10 @@ static int recv_notification(struct notifier_block *nb, unsigned long evt,
256 262
257static int eth_addr2str(struct tipc_media_addr *a, char *str_buf, int str_size) 263static int eth_addr2str(struct tipc_media_addr *a, char *str_buf, int str_size)
258{ 264{
259 unchar *addr = (unchar *)&a->dev_addr;
260
261 if (str_size < 18) /* 18 = strlen("aa:bb:cc:dd:ee:ff\0") */ 265 if (str_size < 18) /* 18 = strlen("aa:bb:cc:dd:ee:ff\0") */
262 return 1; 266 return 1;
263 267
264 sprintf(str_buf, "%pM", addr); 268 sprintf(str_buf, "%pM", a->value);
265 return 0; 269 return 0;
266} 270}
267 271
@@ -293,7 +297,7 @@ static int eth_addr2msg(struct tipc_media_addr *a, char *msg_area)
293{ 297{
294 memset(msg_area, 0, TIPC_MEDIA_ADDR_SIZE); 298 memset(msg_area, 0, TIPC_MEDIA_ADDR_SIZE);
295 msg_area[TIPC_MEDIA_TYPE_OFFSET] = TIPC_MEDIA_TYPE_ETH; 299 msg_area[TIPC_MEDIA_TYPE_OFFSET] = TIPC_MEDIA_TYPE_ETH;
296 memcpy(msg_area + ETH_ADDR_OFFSET, a->dev_addr.eth_addr, ETH_ALEN); 300 memcpy(msg_area + ETH_ADDR_OFFSET, a->value, ETH_ALEN);
297 return 0; 301 return 0;
298} 302}
299 303
@@ -322,8 +326,8 @@ static struct media eth_media_info = {
322 .str2addr = eth_str2addr, 326 .str2addr = eth_str2addr,
323 .addr2msg = eth_addr2msg, 327 .addr2msg = eth_addr2msg,
324 .msg2addr = eth_msg2addr, 328 .msg2addr = eth_msg2addr,
325 .bcast_addr = { htonl(TIPC_MEDIA_TYPE_ETH), 329 .bcast_addr = { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
326 { {0xff, 0xff, 0xff, 0xff, 0xff, 0xff} } }, 330 TIPC_MEDIA_TYPE_ETH, 1 },
327 .priority = TIPC_DEF_LINK_PRI, 331 .priority = TIPC_DEF_LINK_PRI,
328 .tolerance = TIPC_DEF_LINK_TOL, 332 .tolerance = TIPC_DEF_LINK_TOL,
329 .window = TIPC_DEF_LINK_WIN, 333 .window = TIPC_DEF_LINK_WIN,
diff --git a/net/tipc/msg.c b/net/tipc/msg.c
index 83d50967910..3e4d3e29be6 100644
--- a/net/tipc/msg.c
+++ b/net/tipc/msg.c
@@ -333,11 +333,14 @@ void tipc_msg_dbg(struct print_buf *buf, struct tipc_msg *msg, const char *str)
333 } 333 }
334 334
335 if (msg_user(msg) == LINK_CONFIG) { 335 if (msg_user(msg) == LINK_CONFIG) {
336 u32 *raw = (u32 *)msg; 336 struct tipc_media_addr orig;
337 struct tipc_media_addr *orig = (struct tipc_media_addr *)&raw[5]; 337
338 tipc_printf(buf, ":DDOM(%x):", msg_dest_domain(msg)); 338 tipc_printf(buf, ":DDOM(%x):", msg_dest_domain(msg));
339 tipc_printf(buf, ":NETID(%u):", msg_bc_netid(msg)); 339 tipc_printf(buf, ":NETID(%u):", msg_bc_netid(msg));
340 tipc_media_addr_printf(buf, orig); 340 memcpy(orig.value, msg_media_addr(msg), sizeof(orig.value));
341 orig.media_id = 0;
342 orig.broadcast = 0;
343 tipc_media_addr_printf(buf, &orig);
341 } 344 }
342 if (msg_user(msg) == BCAST_PROTOCOL) { 345 if (msg_user(msg) == BCAST_PROTOCOL) {
343 tipc_printf(buf, "BCNACK:AFTER(%u):", msg_bcgap_after(msg)); 346 tipc_printf(buf, "BCNACK:AFTER(%u):", msg_bcgap_after(msg));
diff --git a/net/tipc/msg.h b/net/tipc/msg.h
index d93178f2e85..7b0cda16710 100644
--- a/net/tipc/msg.h
+++ b/net/tipc/msg.h
@@ -78,6 +78,8 @@
78 78
79#define MAX_MSG_SIZE (MAX_H_SIZE + TIPC_MAX_USER_MSG_SIZE) 79#define MAX_MSG_SIZE (MAX_H_SIZE + TIPC_MAX_USER_MSG_SIZE)
80 80
81#define TIPC_MEDIA_ADDR_OFFSET 5
82
81 83
82struct tipc_msg { 84struct tipc_msg {
83 __be32 hdr[15]; 85 __be32 hdr[15];
@@ -682,6 +684,10 @@ static inline void msg_set_redundant_link(struct tipc_msg *m, u32 r)
682 msg_set_bits(m, 5, 12, 0x1, r); 684 msg_set_bits(m, 5, 12, 0x1, r);
683} 685}
684 686
687static inline char *msg_media_addr(struct tipc_msg *m)
688{
689 return (char *)&m->hdr[TIPC_MEDIA_ADDR_OFFSET];
690}
685 691
686/* 692/*
687 * Word 9 693 * Word 9
@@ -734,14 +740,4 @@ int tipc_msg_build(struct tipc_msg *hdr, struct iovec const *msg_sect,
734 u32 num_sect, unsigned int total_len, 740 u32 num_sect, unsigned int total_len,
735 int max_size, int usrmem, struct sk_buff **buf); 741 int max_size, int usrmem, struct sk_buff **buf);
736 742
737static inline void msg_set_media_addr(struct tipc_msg *m, struct tipc_media_addr *a)
738{
739 memcpy(&((int *)m)[5], a, sizeof(*a));
740}
741
742static inline void msg_get_media_addr(struct tipc_msg *m, struct tipc_media_addr *a)
743{
744 memcpy(a, &((int *)m)[5], sizeof(*a));
745}
746
747#endif 743#endif