From a711ab22a58504e52c33f5fd939643002d7e6a81 Mon Sep 17 00:00:00 2001 From: Patrick McHardy Date: Mon, 15 Apr 2013 16:16:04 +0200 Subject: 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 --- include/datatype.h | 3 +++ src/datatype.c | 1 + src/payload.c | 11 ++++++++++- 3 files changed, 14 insertions(+), 1 deletion(-) 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] = ðeraddr_type, [TYPE_ETHERTYPE] = ðertype_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, ðertype_type, __member) #define ETHHDR_ADDR(__name, __member) \ - ETHHDR_TEMPLATE(__name, &lladdr_type, __member) + ETHHDR_TEMPLATE(__name, ðeraddr_type, __member) const struct payload_desc payload_eth = { .name = "eth", -- cgit v1.2.3