diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/tipc/bearer.h | 19 | ||||
| -rw-r--r-- | net/tipc/eth_media.c | 63 |
2 files changed, 79 insertions, 3 deletions
diff --git a/net/tipc/bearer.h b/net/tipc/bearer.h index 4e9367f956a4..41a61d219c38 100644 --- a/net/tipc/bearer.h +++ b/net/tipc/bearer.h | |||
| @@ -43,6 +43,17 @@ | |||
| 43 | #define MAX_MEDIA 2 | 43 | #define MAX_MEDIA 2 |
| 44 | 44 | ||
| 45 | /* | 45 | /* |
| 46 | * Identifiers associated with TIPC message header media address info | ||
| 47 | * | ||
| 48 | * - address info field is 20 bytes long | ||
| 49 | * - media type identifier located at offset 3 | ||
| 50 | * - remaining bytes vary according to media type | ||
| 51 | */ | ||
| 52 | |||
| 53 | #define TIPC_MEDIA_ADDR_SIZE 20 | ||
| 54 | #define TIPC_MEDIA_TYPE_OFFSET 3 | ||
| 55 | |||
| 56 | /* | ||
| 46 | * Identifiers of supported TIPC media types | 57 | * Identifiers of supported TIPC media types |
| 47 | */ | 58 | */ |
| 48 | #define TIPC_MEDIA_TYPE_ETH 1 | 59 | #define TIPC_MEDIA_TYPE_ETH 1 |
| @@ -68,7 +79,10 @@ struct tipc_bearer; | |||
| 68 | * @send_msg: routine which handles buffer transmission | 79 | * @send_msg: routine which handles buffer transmission |
| 69 | * @enable_bearer: routine which enables a bearer | 80 | * @enable_bearer: routine which enables a bearer |
| 70 | * @disable_bearer: routine which disables a bearer | 81 | * @disable_bearer: routine which disables a bearer |
| 71 | * @addr2str: routine which converts bearer's address to string form | 82 | * @addr2str: routine which converts media address to string |
| 83 | * @str2addr: routine which converts media address from string | ||
| 84 | * @addr2msg: routine which converts media address to protocol message area | ||
| 85 | * @msg2addr: routine which converts media address from protocol message area | ||
| 72 | * @bcast_addr: media address used in broadcasting | 86 | * @bcast_addr: media address used in broadcasting |
| 73 | * @priority: default link (and bearer) priority | 87 | * @priority: default link (and bearer) priority |
| 74 | * @tolerance: default time (in ms) before declaring link failure | 88 | * @tolerance: default time (in ms) before declaring link failure |
| @@ -84,6 +98,9 @@ struct media { | |||
| 84 | int (*enable_bearer)(struct tipc_bearer *b_ptr); | 98 | int (*enable_bearer)(struct tipc_bearer *b_ptr); |
| 85 | void (*disable_bearer)(struct tipc_bearer *b_ptr); | 99 | void (*disable_bearer)(struct tipc_bearer *b_ptr); |
| 86 | int (*addr2str)(struct tipc_media_addr *a, char *str_buf, int str_size); | 100 | int (*addr2str)(struct tipc_media_addr *a, char *str_buf, int str_size); |
| 101 | int (*str2addr)(struct tipc_media_addr *a, char *str_buf); | ||
| 102 | int (*addr2msg)(struct tipc_media_addr *a, char *msg_area); | ||
| 103 | int (*msg2addr)(struct tipc_media_addr *a, char *msg_area); | ||
| 87 | struct tipc_media_addr bcast_addr; | 104 | struct tipc_media_addr bcast_addr; |
| 88 | u32 priority; | 105 | u32 priority; |
| 89 | u32 tolerance; | 106 | u32 tolerance; |
diff --git a/net/tipc/eth_media.c b/net/tipc/eth_media.c index 67f616aa5dbb..ebba0fcd937e 100644 --- a/net/tipc/eth_media.c +++ b/net/tipc/eth_media.c | |||
| @@ -39,6 +39,8 @@ | |||
| 39 | 39 | ||
| 40 | #define MAX_ETH_BEARERS MAX_BEARERS | 40 | #define MAX_ETH_BEARERS MAX_BEARERS |
| 41 | 41 | ||
| 42 | #define ETH_ADDR_OFFSET 4 /* message header offset of MAC address */ | ||
| 43 | |||
| 42 | /** | 44 | /** |
| 43 | * struct eth_bearer - Ethernet bearer data structure | 45 | * struct eth_bearer - Ethernet bearer data structure |
| 44 | * @bearer: ptr to associated "generic" bearer structure | 46 | * @bearer: ptr to associated "generic" bearer structure |
| @@ -57,6 +59,16 @@ static int eth_started; | |||
| 57 | static struct notifier_block notifier; | 59 | static struct notifier_block notifier; |
| 58 | 60 | ||
| 59 | /** | 61 | /** |
| 62 | * eth_media_addr_set - initialize Ethernet media address structure | ||
| 63 | */ | ||
| 64 | |||
| 65 | static void eth_media_addr_set(struct tipc_media_addr *a, char *mac) | ||
| 66 | { | ||
| 67 | a->type = htonl(TIPC_MEDIA_TYPE_ETH); | ||
| 68 | memcpy(&a->dev_addr.eth_addr, mac, ETH_ALEN); | ||
| 69 | } | ||
| 70 | |||
| 71 | /** | ||
| 60 | * send_msg - send a TIPC message out over an Ethernet interface | 72 | * send_msg - send a TIPC message out over an Ethernet interface |
| 61 | */ | 73 | */ |
| 62 | 74 | ||
| @@ -169,8 +181,7 @@ static int enable_bearer(struct tipc_bearer *tb_ptr) | |||
| 169 | tb_ptr->usr_handle = (void *)eb_ptr; | 181 | tb_ptr->usr_handle = (void *)eb_ptr; |
| 170 | tb_ptr->mtu = dev->mtu; | 182 | tb_ptr->mtu = dev->mtu; |
| 171 | tb_ptr->blocked = 0; | 183 | tb_ptr->blocked = 0; |
| 172 | tb_ptr->addr.type = htonl(TIPC_MEDIA_TYPE_ETH); | 184 | eth_media_addr_set(&tb_ptr->addr, (char *)dev->dev_addr); |
| 173 | memcpy(&tb_ptr->addr.dev_addr, dev->dev_addr, ETH_ALEN); | ||
| 174 | return 0; | 185 | return 0; |
| 175 | } | 186 | } |
| 176 | 187 | ||
| @@ -254,6 +265,51 @@ static int eth_addr2str(struct tipc_media_addr *a, char *str_buf, int str_size) | |||
| 254 | return 0; | 265 | return 0; |
| 255 | } | 266 | } |
| 256 | 267 | ||
| 268 | /** | ||
| 269 | * eth_str2addr - convert string to Ethernet address | ||
| 270 | */ | ||
| 271 | |||
| 272 | static int eth_str2addr(struct tipc_media_addr *a, char *str_buf) | ||
| 273 | { | ||
| 274 | char mac[ETH_ALEN]; | ||
| 275 | int r; | ||
| 276 | |||
| 277 | r = sscanf(str_buf, "%02x:%02x:%02x:%02x:%02x:%02x", | ||
| 278 | (u32 *)&mac[0], (u32 *)&mac[1], (u32 *)&mac[2], | ||
| 279 | (u32 *)&mac[3], (u32 *)&mac[4], (u32 *)&mac[5]); | ||
| 280 | |||
| 281 | if (r != ETH_ALEN) | ||
| 282 | return 1; | ||
| 283 | |||
| 284 | eth_media_addr_set(a, mac); | ||
| 285 | return 0; | ||
| 286 | } | ||
| 287 | |||
| 288 | /** | ||
| 289 | * eth_str2addr - convert Ethernet address format to message header format | ||
| 290 | */ | ||
| 291 | |||
| 292 | static int eth_addr2msg(struct tipc_media_addr *a, char *msg_area) | ||
| 293 | { | ||
| 294 | memset(msg_area, 0, TIPC_MEDIA_ADDR_SIZE); | ||
| 295 | msg_area[TIPC_MEDIA_TYPE_OFFSET] = TIPC_MEDIA_TYPE_ETH; | ||
| 296 | memcpy(msg_area + ETH_ADDR_OFFSET, a->dev_addr.eth_addr, ETH_ALEN); | ||
| 297 | return 0; | ||
| 298 | } | ||
| 299 | |||
| 300 | /** | ||
| 301 | * eth_str2addr - convert message header address format to Ethernet format | ||
| 302 | */ | ||
| 303 | |||
| 304 | static int eth_msg2addr(struct tipc_media_addr *a, char *msg_area) | ||
| 305 | { | ||
| 306 | if (msg_area[TIPC_MEDIA_TYPE_OFFSET] != TIPC_MEDIA_TYPE_ETH) | ||
| 307 | return 1; | ||
| 308 | |||
| 309 | eth_media_addr_set(a, msg_area + ETH_ADDR_OFFSET); | ||
| 310 | return 0; | ||
| 311 | } | ||
| 312 | |||
| 257 | /* | 313 | /* |
| 258 | * Ethernet media registration info | 314 | * Ethernet media registration info |
| 259 | */ | 315 | */ |
| @@ -263,6 +319,9 @@ static struct media eth_media_info = { | |||
| 263 | .enable_bearer = enable_bearer, | 319 | .enable_bearer = enable_bearer, |
| 264 | .disable_bearer = disable_bearer, | 320 | .disable_bearer = disable_bearer, |
| 265 | .addr2str = eth_addr2str, | 321 | .addr2str = eth_addr2str, |
| 322 | .str2addr = eth_str2addr, | ||
| 323 | .addr2msg = eth_addr2msg, | ||
| 324 | .msg2addr = eth_msg2addr, | ||
| 266 | .bcast_addr = { htonl(TIPC_MEDIA_TYPE_ETH), | 325 | .bcast_addr = { htonl(TIPC_MEDIA_TYPE_ETH), |
| 267 | { {0xff, 0xff, 0xff, 0xff, 0xff, 0xff} } }, | 326 | { {0xff, 0xff, 0xff, 0xff, 0xff, 0xff} } }, |
| 268 | .priority = TIPC_DEF_LINK_PRI, | 327 | .priority = TIPC_DEF_LINK_PRI, |
