|
@@ -1,7 +1,7 @@
|
|
/*
|
|
/*
|
|
* net/tipc/eth_media.c: Ethernet bearer support for TIPC
|
|
* net/tipc/eth_media.c: Ethernet bearer support for TIPC
|
|
*
|
|
*
|
|
- * Copyright (c) 2001-2007, 2013, Ericsson AB
|
|
|
|
|
|
+ * Copyright (c) 2001-2007, 2013-2014, Ericsson AB
|
|
* Copyright (c) 2005-2008, 2011-2013, Wind River Systems
|
|
* Copyright (c) 2005-2008, 2011-2013, Wind River Systems
|
|
* All rights reserved.
|
|
* All rights reserved.
|
|
*
|
|
*
|
|
@@ -37,39 +37,52 @@
|
|
#include "core.h"
|
|
#include "core.h"
|
|
#include "bearer.h"
|
|
#include "bearer.h"
|
|
|
|
|
|
-#define ETH_ADDR_OFFSET 4 /* message header offset of MAC address */
|
|
|
|
|
|
+#define ETH_ADDR_OFFSET 4 /* MAC addr position inside address field */
|
|
|
|
|
|
-/* convert Ethernet address to string */
|
|
|
|
-static int tipc_eth_addr2str(struct tipc_media_addr *a, char *str_buf,
|
|
|
|
- int str_size)
|
|
|
|
|
|
+/* Convert Ethernet address (media address format) to string */
|
|
|
|
+static int tipc_eth_addr2str(struct tipc_media_addr *addr,
|
|
|
|
+ char *strbuf, int bufsz)
|
|
{
|
|
{
|
|
- if (str_size < 18) /* 18 = strlen("aa:bb:cc:dd:ee:ff\0") */
|
|
|
|
|
|
+ if (bufsz < 18) /* 18 = strlen("aa:bb:cc:dd:ee:ff\0") */
|
|
return 1;
|
|
return 1;
|
|
|
|
|
|
- sprintf(str_buf, "%pM", a->value);
|
|
|
|
|
|
+ sprintf(strbuf, "%pM", addr->value);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-/* convert Ethernet address format to message header format */
|
|
|
|
-static int tipc_eth_addr2msg(struct tipc_media_addr *a, char *msg_area)
|
|
|
|
|
|
+/* Convert from media address format to discovery message addr format */
|
|
|
|
+static int tipc_eth_addr2msg(char *msg, struct tipc_media_addr *addr)
|
|
{
|
|
{
|
|
- memset(msg_area, 0, TIPC_MEDIA_ADDR_SIZE);
|
|
|
|
- msg_area[TIPC_MEDIA_TYPE_OFFSET] = TIPC_MEDIA_TYPE_ETH;
|
|
|
|
- memcpy(msg_area + ETH_ADDR_OFFSET, a->value, ETH_ALEN);
|
|
|
|
|
|
+ memset(msg, 0, TIPC_MEDIA_ADDR_SIZE);
|
|
|
|
+ msg[TIPC_MEDIA_TYPE_OFFSET] = TIPC_MEDIA_TYPE_ETH;
|
|
|
|
+ memcpy(msg + ETH_ADDR_OFFSET, addr->value, ETH_ALEN);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-/* convert message header address format to Ethernet format */
|
|
|
|
-static int tipc_eth_msg2addr(const struct tipc_bearer *tb_ptr,
|
|
|
|
- struct tipc_media_addr *a, char *msg_area)
|
|
|
|
|
|
+/* Convert raw mac address format to media addr format */
|
|
|
|
+static int tipc_eth_raw2addr(struct tipc_bearer *b,
|
|
|
|
+ struct tipc_media_addr *addr,
|
|
|
|
+ char *msg)
|
|
{
|
|
{
|
|
- if (msg_area[TIPC_MEDIA_TYPE_OFFSET] != TIPC_MEDIA_TYPE_ETH)
|
|
|
|
- return 1;
|
|
|
|
|
|
+ char bcast_mac[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
|
|
|
|
|
|
- tipc_l2_media_addr_set(tb_ptr, a, msg_area + ETH_ADDR_OFFSET);
|
|
|
|
|
|
+ memset(addr, 0, sizeof(*addr));
|
|
|
|
+ ether_addr_copy(addr->value, msg);
|
|
|
|
+ addr->media_id = TIPC_MEDIA_TYPE_ETH;
|
|
|
|
+ addr->broadcast = !memcmp(addr->value, bcast_mac, ETH_ALEN);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/* Convert discovery msg addr format to Ethernet media addr format */
|
|
|
|
+static int tipc_eth_msg2addr(struct tipc_bearer *b,
|
|
|
|
+ struct tipc_media_addr *addr,
|
|
|
|
+ char *msg)
|
|
|
|
+{
|
|
|
|
+ /* Skip past preamble: */
|
|
|
|
+ msg += ETH_ADDR_OFFSET;
|
|
|
|
+ return tipc_eth_raw2addr(b, addr, msg);
|
|
|
|
+}
|
|
|
|
+
|
|
/* Ethernet media registration info */
|
|
/* Ethernet media registration info */
|
|
struct tipc_media eth_media_info = {
|
|
struct tipc_media eth_media_info = {
|
|
.send_msg = tipc_l2_send_msg,
|
|
.send_msg = tipc_l2_send_msg,
|
|
@@ -78,6 +91,7 @@ struct tipc_media eth_media_info = {
|
|
.addr2str = tipc_eth_addr2str,
|
|
.addr2str = tipc_eth_addr2str,
|
|
.addr2msg = tipc_eth_addr2msg,
|
|
.addr2msg = tipc_eth_addr2msg,
|
|
.msg2addr = tipc_eth_msg2addr,
|
|
.msg2addr = tipc_eth_msg2addr,
|
|
|
|
+ .raw2addr = tipc_eth_raw2addr,
|
|
.priority = TIPC_DEF_LINK_PRI,
|
|
.priority = TIPC_DEF_LINK_PRI,
|
|
.tolerance = TIPC_DEF_LINK_TOL,
|
|
.tolerance = TIPC_DEF_LINK_TOL,
|
|
.window = TIPC_DEF_LINK_WIN,
|
|
.window = TIPC_DEF_LINK_WIN,
|
|
@@ -85,4 +99,3 @@ struct tipc_media eth_media_info = {
|
|
.hwaddr_len = ETH_ALEN,
|
|
.hwaddr_len = ETH_ALEN,
|
|
.name = "eth"
|
|
.name = "eth"
|
|
};
|
|
};
|
|
-
|
|
|