summaryrefslogtreecommitdiff
path: root/trafgen_proto.c
diff options
context:
space:
mode:
Diffstat (limited to 'trafgen_proto.c')
-rw-r--r--trafgen_proto.c33
1 files changed, 29 insertions, 4 deletions
diff --git a/trafgen_proto.c b/trafgen_proto.c
index e3704d8..1babba5 100644
--- a/trafgen_proto.c
+++ b/trafgen_proto.c
@@ -348,7 +348,6 @@ static void __proto_field_set_dev_ipv4(struct proto_hdr *hdr, uint32_t fid,
{
struct sockaddr_storage ss = { };
struct sockaddr_in *ss4;
- uint32_t ip_addr;
int ret;
if (proto_field_is_set(hdr, fid))
@@ -359,9 +358,7 @@ static void __proto_field_set_dev_ipv4(struct proto_hdr *hdr, uint32_t fid,
panic("Could not get device IPv4 address\n");
ss4 = (struct sockaddr_in *) &ss;
- ip_addr = ss4->sin_addr.s_addr;
-
- __proto_field_set_bytes(hdr, fid, (uint8_t *)&ip_addr, is_default, false);
+ __proto_field_set_bytes(hdr, fid, (uint8_t *)&ss4->sin_addr.s_addr, is_default, false);
}
void proto_field_set_dev_ipv4(struct proto_hdr *hdr, uint32_t fid)
@@ -374,6 +371,34 @@ void proto_field_set_default_dev_ipv4(struct proto_hdr *hdr, uint32_t fid)
__proto_field_set_dev_ipv4(hdr, fid, true);
}
+static void __proto_field_set_dev_ipv6(struct proto_hdr *hdr, uint32_t fid,
+ bool is_default)
+{
+ struct sockaddr_storage ss = { };
+ struct sockaddr_in6 *ss6;
+ int ret;
+
+ if (proto_field_is_set(hdr, fid))
+ return;
+
+ ret = device_address(hdr->ctx->dev, AF_INET6, &ss);
+ if (ret < 0)
+ panic("Could not get device IPv6 address\n");
+
+ ss6 = (struct sockaddr_in6 *) &ss;
+ __proto_field_set_bytes(hdr, fid, (uint8_t *)&ss6->sin6_addr.s6_addr, is_default, false);
+}
+
+void proto_field_set_dev_ipv6(struct proto_hdr *hdr, uint32_t fid)
+{
+ __proto_field_set_dev_ipv6(hdr, fid, false);
+}
+
+void proto_field_set_default_dev_ipv6(struct proto_hdr *hdr, uint32_t fid)
+{
+ __proto_field_set_dev_ipv6(hdr, fid, true);
+}
+
void protos_init(const char *dev)
{
struct proto_hdr *p;