summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2013-04-15 16:16:04 +0200
committerPatrick McHardy <kaber@trash.net>2013-04-18 15:28:13 +0200
commita711ab22a58504e52c33f5fd939643002d7e6a81 (patch)
tree1ca81a9f77b5ffef348e49964f68cafbd1023317
parent2d148c5311cc4fa5d2f7b0c439dd051abcafa9ab (diff)
types: add ethernet address type
Add a new type for ethernet addresses. This is needed since for concatenations we need fixed sized data types, the generic link layer address doesn't have a fixed length. Signed-off-by: Patrick McHardy <kaber@trash.net>
-rw-r--r--include/datatype.h3
-rw-r--r--src/datatype.c1
-rw-r--r--src/payload.c11
3 files changed, 14 insertions, 1 deletions
diff --git a/include/datatype.h b/include/datatype.h
index aa270c0e..53889934 100644
--- a/include/datatype.h
+++ b/include/datatype.h
@@ -12,6 +12,7 @@
* @TYPE_LLADDR: link layer address (integer subtype)
* @TYPE_IPADDR: IPv4 address (integer subtype)
* @TYPE_IP6ADDR: IPv6 address (integer subtype)
+ * @TYPE_ETHERADDR: Ethernet address (lladdr subtype)
* @TYPE_ETHERTYPE: EtherType (integer subtype)
* @TYPE_ARPOP: ARP operation (integer subtype)
* @TYPE_INET_PROTOCOL: internet protocol (integer subtype)
@@ -41,6 +42,7 @@ enum datatypes {
TYPE_LLADDR,
TYPE_IPADDR,
TYPE_IP6ADDR,
+ TYPE_ETHERADDR,
TYPE_ETHERTYPE,
TYPE_ARPOP,
TYPE_INET_PROTOCOL,
@@ -158,6 +160,7 @@ extern const struct datatype string_type;
extern const struct datatype lladdr_type;
extern const struct datatype ipaddr_type;
extern const struct datatype ip6addr_type;
+extern const struct datatype etheraddr_type;
extern const struct datatype ethertype_type;
extern const struct datatype arphrd_type;
extern const struct datatype inet_protocol_type;
diff --git a/src/datatype.c b/src/datatype.c
index c687edd4..e87de418 100644
--- a/src/datatype.c
+++ b/src/datatype.c
@@ -30,6 +30,7 @@ static const struct datatype *datatypes[TYPE_MAX + 1] = {
[TYPE_LLADDR] = &lladdr_type,
[TYPE_IPADDR] = &ipaddr_type,
[TYPE_IP6ADDR] = &ip6addr_type,
+ [TYPE_ETHERADDR] = &etheraddr_type,
[TYPE_ETHERTYPE] = &ethertype_type,
[TYPE_INET_PROTOCOL] = &inet_protocol_type,
[TYPE_INET_SERVICE] = &inet_service_type,
diff --git a/src/payload.c b/src/payload.c
index 611697ec..bcbc0d43 100644
--- a/src/payload.c
+++ b/src/payload.c
@@ -911,6 +911,15 @@ const struct payload_desc payload_vlan = {
* Ethernet
*/
+const struct datatype etheraddr_type = {
+ .type = TYPE_ETHERADDR,
+ .name = "etheraddr",
+ .desc = "Ethernet address",
+ .byteorder = BYTEORDER_HOST_ENDIAN,
+ .size = ETH_ALEN * BITS_PER_BYTE,
+ .basetype = &lladdr_type,
+};
+
static const struct symbol_table ethertype_tbl = {
.symbols = {
SYMBOL("ip", ETH_P_IP),
@@ -936,7 +945,7 @@ const struct datatype ethertype_type = {
#define ETHHDR_TYPE(__name, __member) \
ETHHDR_TEMPLATE(__name, &ethertype_type, __member)
#define ETHHDR_ADDR(__name, __member) \
- ETHHDR_TEMPLATE(__name, &lladdr_type, __member)
+ ETHHDR_TEMPLATE(__name, &etheraddr_type, __member)
const struct payload_desc payload_eth = {
.name = "eth",