summaryrefslogtreecommitdiff
path: root/src/script.c
diff options
context:
space:
mode:
authorSteven Barth <steven@midlink.org>2014-04-28 19:39:10 +0200
committerSteven Barth <steven@midlink.org>2014-04-28 19:39:10 +0200
commitfd9801a99fa0d3eea8aad5d19c5c8db8cb779a82 (patch)
treed74f82f8ef50ce8e2273fcf2a363f87e14a88714 /src/script.c
parent76c4797e82ec820d488e41ffe37adc107b5d0218 (diff)
downloadodhcp6c-fd9801a99fa0d3eea8aad5d19c5c8db8cb779a82.tar.gz
Ignore multiple MAP-E instances for now and output DMR / BR for every rule
Diffstat (limited to 'src/script.c')
-rw-r--r--src/script.c35
1 files changed, 22 insertions, 13 deletions
diff --git a/src/script.c b/src/script.c
index 847e4d7..44ce80e 100644
--- a/src/script.c
+++ b/src/script.c
@@ -264,6 +264,21 @@ static void s46_to_env(enum odhcp6c_state state, const uint8_t *data, size_t len
s46_to_env_portparams(&rule->ipv6_prefix[rule->prefix6_len],
olen - sizeof(*rule) - rule->prefix6_len, fp);
+
+ dhcpv6_for_each_option(data, &data[len], otype, olen, odata) {
+ if (state != STATE_S46_MAPT && otype == DHCPV6_OPT_S46_BR &&
+ olen == sizeof(struct in6_addr)) {
+ inet_ntop(AF_INET6, odata, buf6, sizeof(buf6));
+ fprintf(fp, "br=%s,", buf6);
+ } else if (state == STATE_S46_MAPT && otype == DHCPV6_OPT_S46_DMR &&
+ olen >= sizeof(struct dhcpv6_s46_dmr) && olen >=
+ sizeof(struct dhcpv6_s46_dmr) + dmr->dmr_prefix6_len) {
+ memset(&in6, 0, sizeof(in6));
+ memcpy(&in6, dmr->dmr_ipv6_prefix, dmr->dmr_prefix6_len);
+ inet_ntop(AF_INET6, &in6, buf6, sizeof(buf6));
+ fprintf(fp, "dmr=%s/%d,", buf6, dmr->dmr_prefix6_len);
+ }
+ }
} else if (state == STATE_S46_LW && otype == DHCPV6_OPT_S46_V4V6BIND &&
olen >= sizeof(struct dhcpv6_s46_v4v6bind) && olen >=
sizeof(struct dhcpv6_s46_v4v6bind) + bind->bindprefix6_len) {
@@ -280,19 +295,13 @@ static void s46_to_env(enum odhcp6c_state state, const uint8_t *data, size_t len
s46_to_env_portparams(&bind->bind_ipv6_prefix[bind->bindprefix6_len],
olen - sizeof(*bind) - bind->bindprefix6_len, fp);
- } else if (state != STATE_S46_MAPT && otype == DHCPV6_OPT_S46_BR
- && olen == sizeof(struct in6_addr)) {
- char buf6[INET6_ADDRSTRLEN];
- inet_ntop(AF_INET6, odata, buf6, sizeof(buf6));
- fprintf(fp, "br=%s,", buf6);
- } else if (state == STATE_S46_MAPT && otype == DHCPV6_OPT_S46_DMR &&
- olen >= sizeof(struct dhcpv6_s46_dmr) && olen >=
- sizeof(struct dhcpv6_s46_dmr) + dmr->dmr_prefix6_len) {
- struct in6_addr in6 = IN6ADDR_ANY_INIT;
- memcpy(&in6, dmr->dmr_ipv6_prefix, dmr->dmr_prefix6_len);
- char buf6[INET6_ADDRSTRLEN];
- inet_ntop(AF_INET6, &in6, buf6, sizeof(buf6));
- fprintf(fp, "dmr=%s/%d,", buf6, dmr->dmr_prefix6_len);
+
+ dhcpv6_for_each_option(data, &data[len], otype, olen, odata) {
+ if (otype == DHCPV6_OPT_S46_BR && olen == sizeof(struct in6_addr)) {
+ inet_ntop(AF_INET6, odata, buf6, sizeof(buf6));
+ fprintf(fp, "br=%s,", buf6);
+ }
+ }
}
fputc(' ', fp);