diff options
author | Vadim Kochan <vadim4j@gmail.com> | 2016-01-26 22:25:01 +0200 |
---|---|---|
committer | Tobias Klauser <tklauser@distanz.ch> | 2016-01-28 16:14:53 +0100 |
commit | 2ab562f1a46ffbc459146420caa86e400fa1b9e2 (patch) | |
tree | bd96bda5a66f3ff92cff417fa267577dde0b970b /trafgen_proto.c | |
parent | b5100e276763a03c255dd1e7a4147c55c901419c (diff) |
trafgen: proto: Add function to set field from device MAC
Add helper function to set device's MAC address to protocol field which may
be used by Ethernet & ARP protocol header generation functions.
Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
Diffstat (limited to 'trafgen_proto.c')
-rw-r--r-- | trafgen_proto.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/trafgen_proto.c b/trafgen_proto.c index 15c48d4..cf2541f 100644 --- a/trafgen_proto.c +++ b/trafgen_proto.c @@ -5,7 +5,9 @@ #include <stddef.h> #include <string.h> +#include <linux/if_ether.h> +#include "dev.h" #include "xmalloc.h" #include "trafgen_conf.h" #include "trafgen_proto.h" @@ -289,6 +291,35 @@ void proto_field_set_default_be32(struct proto_hdr *hdr, uint32_t fid, uint32_t __proto_field_set_bytes(hdr, fid, (uint8_t *)&val, true, true); } +static void __proto_field_set_dev_mac(struct proto_hdr *hdr, uint32_t fid, + bool is_default) +{ + uint8_t mac[ETH_ALEN]; + int ret; + + if (proto_field_is_set(hdr, fid)) + return; + + if (!hdr->ctx->dev) + panic("Device is not specified\n"); + + ret = device_hw_address(hdr->ctx->dev, mac, sizeof(mac)); + if (ret < 0) + panic("Could not get device hw adress\n"); + + __proto_field_set_bytes(hdr, fid, mac, is_default, false); +} + +void proto_field_set_dev_mac(struct proto_hdr *hdr, uint32_t fid) +{ + __proto_field_set_dev_mac(hdr, fid, false); +} + +void proto_field_set_default_dev_mac(struct proto_hdr *hdr, uint32_t fid) +{ + __proto_field_set_dev_mac(hdr, fid, true); +} + void protos_init(const char *dev) { struct proto_hdr *p; |