The DHCPv6 standard changes the encoding based on whether it's a struct field or an option, which is why it was a fixed length v6 address before. Unfortunately none of the modules in FreeRADIUS will work with a prefix value split into its components
ATTRIBUTE IA-PD-Prefix 26 struct
MEMBER IA-PD-Prefix-Preferred-Lifetime time_delta # time delta from "now" in seconds
MEMBER IA-PD-Prefix-Valid-Lifetime time_delta # time delta from "now" in seconds
-MEMBER IA-PD-Prefix-IPv6-Prefix-Length uint8
-MEMBER IA-PD-Prefix-IPv6-Prefix ipv6addr # MUST be 16 bytes
+MEMBER IA-PD-Prefix-IPv6-Prefix ipv6prefix
MEMBER IA-PD-Prefix-Options group # of other options associated with this prefix
* Address MAY be shorter than 16 bytes.
*/
case FR_TYPE_IPV6_PREFIX:
- if ((data_len == 0) || (data_len > 17)) {
+ if ((data_len == 0) || (data_len > (1 + sizeof(vp->vp_ipv6addr)))) {
raw:
return decode_raw(ctx, cursor, dict, parent, data, data_len, decoder_ctx);
};
+ /*
+ * Structs used fixed length fields
+ */
+ if (parent->parent->type == FR_TYPE_STRUCT) {
+ if (data_len != (1 + sizeof(vp->vp_ipv6addr))) goto raw;
+
+ vp = fr_pair_afrom_da(ctx, parent);
+ if (!vp) return PAIR_DECODE_OOM;
+
+ vp->vp_ip.af = AF_INET6;
+ vp->vp_ip.scope_id = 0;
+ vp->vp_ip.prefix = data[0];
+ memcpy(&vp->vp_ipv6addr, data + 1, data_len - 1);
+ break;
+ }
+
/*
* No address, the prefix length MUST be zero.
*/
{
size_t prefix_len;
- prefix_len = vp->vp_ip.prefix >> 3; /* Convert bits to whole bytes */
+ /*
+ * Structs have fixed length value fields.
+ */
+ if (da->parent->type == FR_TYPE_STRUCT) {
+ prefix_len = sizeof(vp->vp_ipv6addr);
+ } else {
+ prefix_len = vp->vp_ip.prefix >> 3; /* Convert bits to whole bytes */
+ }
FR_DBUFF_IN_BYTES_RETURN(&work_dbuff, vp->vp_ip.prefix);
FR_DBUFF_IN_MEMCPY_RETURN(&work_dbuff, (uint8_t const *)&vp->vp_ipv6addr, prefix_len); /* Only copy the minimum address bytes required */
*/
case FR_TYPE_IPV4_PREFIX:
{
- size_t prefix_len = vp->vp_ip.prefix >> 3; /* Convert bits to whole bytes */
+ size_t prefix_len;
+
+ /*
+ * Structs have fixed length value fields.
+ */
+ if (da->parent->type == FR_TYPE_STRUCT) {
+ prefix_len = sizeof(vp->vp_ipv4addr);
+ } else {
+ prefix_len = vp->vp_ip.prefix >> 3; /* Convert bits to whole bytes */
+ }
FR_DBUFF_IN_BYTES_RETURN(&work_dbuff, vp->vp_ip.prefix);
FR_DBUFF_IN_MEMCPY_RETURN(&work_dbuff, (uint8_t const *)&vp->vp_ipv4addr, prefix_len); /* Only copy the minimum address bytes required */
# data = '\taftr-name\x08mydomain\x03net\x00'
#
decode-proto 02 d8 1e b8 00 19 00 29 02 03 04 05 00 00 00 96 00 00 00 fa 00 1a 00 19 00 00 00 fa 00 00 01 2c 38 2a 00 00 01 00 01 01 00 00 00 00 00 00 00 00 00 00 01 00 0a 00 03 00 01 00 01 02 03 04 05 00 02 00 0e 00 01 00 01 18 3f 4e f0 00 11 22 33 44 55 00 07 00 01 0a 00 17 00 10 2a 01 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 40 00 18 09 61 66 74 72 2d 6e 61 6d 65 08 6d 79 64 6f 6d 61 69 6e 03 6e 65 74 00
-match Packet-Type = Advertise, Transaction-ID = 0xd81eb8, IA-PD-IAID = 33752069, IA-PD-T1 = 150, IA-PD-T2 = 250, IA-PD-Options = { IA-PD-Prefix-Preferred-Lifetime = 250, IA-PD-Prefix-Valid-Lifetime = 300, IA-PD-Prefix-IPv6-Prefix-Length = 56, IA-PD-Prefix-IPv6-Prefix = 2a00:1:1:100:: }, Client-ID-DUID = Client-ID-DUID-LL, Client-ID-DUID-LL-Hardware-Type = Client-ID-DUID-LL-Ethernet, Client-ID-DUID-LL-Ethernet-Address = 00:01:02:03:04:05, Server-ID-DUID = Server-ID-DUID-LLT, Server-ID-DUID-LLT-Hardware-Type = Server-ID-DUID-LLT-Ethernet, Server-ID-DUID-LLT-Time = "Nov 21 2012 08:36:00 UTC", Server-ID-DUID-LLT-Ethernet-Address = 00:11:22:33:44:55, Preference = 10, DNS-Servers = 2a01::1, AFTR-Name = "aftr-name.mydomain.net"
+match Packet-Type = Advertise, Transaction-ID = 0xd81eb8, IA-PD-IAID = 33752069, IA-PD-T1 = 150, IA-PD-T2 = 250, IA-PD-Options = { IA-PD-Prefix-Preferred-Lifetime = 250, IA-PD-Prefix-Valid-Lifetime = 300, IA-PD-Prefix-IPv6-Prefix = 2a00:1:1:100::/56 }, Client-ID-DUID = Client-ID-DUID-LL, Client-ID-DUID-LL-Hardware-Type = Client-ID-DUID-LL-Ethernet, Client-ID-DUID-LL-Ethernet-Address = 00:01:02:03:04:05, Server-ID-DUID = Server-ID-DUID-LLT, Server-ID-DUID-LLT-Hardware-Type = Server-ID-DUID-LLT-Ethernet, Server-ID-DUID-LLT-Time = "Nov 21 2012 08:36:00 UTC", Server-ID-DUID-LLT-Ethernet-Address = 00:11:22:33:44:55, Preference = 10, DNS-Servers = 2a01::1, AFTR-Name = "aftr-name.mydomain.net"
encode-proto -
match 02 d8 1e b8 00 19 00 29 02 03 04 05 00 00 00 96 00 00 00 fa 00 1a 00 19 00 00 00 fa 00 00 01 2c 38 2a 00 00 01 00 01 01 00 00 00 00 00 00 00 00 00 00 01 00 0a 00 03 00 01 00 01 02 03 04 05 00 02 00 0e 00 01 00 01 18 3f 4e f0 00 11 22 33 44 55 00 07 00 01 0a 00 17 00 10 2a 01 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 40 00 18 09 61 66 74 72 2d 6e 61 6d 65 08 6d 79 64 6f 6d 61 69 6e 03 6e 65 74 00
# | iaprefopts= ''
#
decode-proto 03 1e 29 1d 00 01 00 0a 00 03 00 01 00 01 02 03 04 05 00 02 00 0e 00 01 00 01 18 3f 4e f0 00 11 22 33 44 55 00 06 00 04 00 17 00 40 00 08 00 02 00 00 00 19 00 29 02 03 04 05 00 00 0e 10 00 00 15 18 00 1a 00 19 00 00 1c 20 00 00 1d 4c 38 2a 00 00 01 00 01 01 00 00 00 00 00 00 00 00 00
-match Packet-Type = Request, Transaction-ID = 0x1e291d, Client-ID-DUID = Client-ID-DUID-LL, Client-ID-DUID-LL-Hardware-Type = Client-ID-DUID-LL-Ethernet, Client-ID-DUID-LL-Ethernet-Address = 00:01:02:03:04:05, Server-ID-DUID = Server-ID-DUID-LLT, Server-ID-DUID-LLT-Hardware-Type = Server-ID-DUID-LLT-Ethernet, Server-ID-DUID-LLT-Time = "Nov 21 2012 08:36:00 UTC", Server-ID-DUID-LLT-Ethernet-Address = 00:11:22:33:44:55, Option-Request = DNS-Servers, Option-Request = AFTR-Name, Elapsed-Time = 0, IA-PD-IAID = 33752069, IA-PD-T1 = 3600, IA-PD-T2 = 5400, IA-PD-Options = { IA-PD-Prefix-Preferred-Lifetime = 7200, IA-PD-Prefix-Valid-Lifetime = 7500, IA-PD-Prefix-IPv6-Prefix-Length = 56, IA-PD-Prefix-IPv6-Prefix = 2a00:1:1:100:: }
+match Packet-Type = Request, Transaction-ID = 0x1e291d, Client-ID-DUID = Client-ID-DUID-LL, Client-ID-DUID-LL-Hardware-Type = Client-ID-DUID-LL-Ethernet, Client-ID-DUID-LL-Ethernet-Address = 00:01:02:03:04:05, Server-ID-DUID = Server-ID-DUID-LLT, Server-ID-DUID-LLT-Hardware-Type = Server-ID-DUID-LLT-Ethernet, Server-ID-DUID-LLT-Time = "Nov 21 2012 08:36:00 UTC", Server-ID-DUID-LLT-Ethernet-Address = 00:11:22:33:44:55, Option-Request = DNS-Servers, Option-Request = AFTR-Name, Elapsed-Time = 0, IA-PD-IAID = 33752069, IA-PD-T1 = 3600, IA-PD-T2 = 5400, IA-PD-Options = { IA-PD-Prefix-Preferred-Lifetime = 7200, IA-PD-Prefix-Valid-Lifetime = 7500, IA-PD-Prefix-IPv6-Prefix = 2a00:1:1:100::/56 }
encode-proto -
match 03 1e 29 1d 00 01 00 0a 00 03 00 01 00 01 02 03 04 05 00 02 00 0e 00 01 00 01 18 3f 4e f0 00 11 22 33 44 55 00 06 00 04 00 17 00 40 00 08 00 02 00 00 00 19 00 29 02 03 04 05 00 00 0e 10 00 00 15 18 00 1a 00 19 00 00 1c 20 00 00 1d 4c 38 2a 00 00 01 00 01 01 00 00 00 00 00 00 00 00 00
# data = '\taftr-name\x08mydomain\x03net\x00'
#
decode-proto 07 1e 29 1d 00 19 00 29 02 03 04 05 00 00 00 96 00 00 00 fa 00 1a 00 19 00 00 00 fa 00 00 01 2c 38 2a 00 00 01 00 01 01 00 00 00 00 00 00 00 00 00 00 01 00 0a 00 03 00 01 00 01 02 03 04 05 00 02 00 0e 00 01 00 01 18 3f 4e f0 00 11 22 33 44 55 00 07 00 01 0a 00 17 00 10 2a 01 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 40 00 18 09 61 66 74 72 2d 6e 61 6d 65 08 6d 79 64 6f 6d 61 69 6e 03 6e 65 74 00
-match Packet-Type = Reply, Transaction-ID = 0x1e291d, IA-PD-IAID = 33752069, IA-PD-T1 = 150, IA-PD-T2 = 250, IA-PD-Options = { IA-PD-Prefix-Preferred-Lifetime = 250, IA-PD-Prefix-Valid-Lifetime = 300, IA-PD-Prefix-IPv6-Prefix-Length = 56, IA-PD-Prefix-IPv6-Prefix = 2a00:1:1:100:: }, Client-ID-DUID = Client-ID-DUID-LL, Client-ID-DUID-LL-Hardware-Type = Client-ID-DUID-LL-Ethernet, Client-ID-DUID-LL-Ethernet-Address = 00:01:02:03:04:05, Server-ID-DUID = Server-ID-DUID-LLT, Server-ID-DUID-LLT-Hardware-Type = Server-ID-DUID-LLT-Ethernet, Server-ID-DUID-LLT-Time = "Nov 21 2012 08:36:00 UTC", Server-ID-DUID-LLT-Ethernet-Address = 00:11:22:33:44:55, Preference = 10, DNS-Servers = 2a01::1, AFTR-Name = "aftr-name.mydomain.net"
+match Packet-Type = Reply, Transaction-ID = 0x1e291d, IA-PD-IAID = 33752069, IA-PD-T1 = 150, IA-PD-T2 = 250, IA-PD-Options = { IA-PD-Prefix-Preferred-Lifetime = 250, IA-PD-Prefix-Valid-Lifetime = 300, IA-PD-Prefix-IPv6-Prefix = 2a00:1:1:100::/56 }, Client-ID-DUID = Client-ID-DUID-LL, Client-ID-DUID-LL-Hardware-Type = Client-ID-DUID-LL-Ethernet, Client-ID-DUID-LL-Ethernet-Address = 00:01:02:03:04:05, Server-ID-DUID = Server-ID-DUID-LLT, Server-ID-DUID-LLT-Hardware-Type = Server-ID-DUID-LLT-Ethernet, Server-ID-DUID-LLT-Time = "Nov 21 2012 08:36:00 UTC", Server-ID-DUID-LLT-Ethernet-Address = 00:11:22:33:44:55, Preference = 10, DNS-Servers = 2a01::1, AFTR-Name = "aftr-name.mydomain.net"
encode-proto -
match 07 1e 29 1d 00 19 00 29 02 03 04 05 00 00 00 96 00 00 00 fa 00 1a 00 19 00 00 00 fa 00 00 01 2c 38 2a 00 00 01 00 01 01 00 00 00 00 00 00 00 00 00 00 01 00 0a 00 03 00 01 00 01 02 03 04 05 00 02 00 0e 00 01 00 01 18 3f 4e f0 00 11 22 33 44 55 00 07 00 01 0a 00 17 00 10 2a 01 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 40 00 18 09 61 66 74 72 2d 6e 61 6d 65 08 6d 79 64 6f 6d 61 69 6e 03 6e 65 74 00
# | lladdr = 00:11:22:33:44:55
#
decode-proto 02 e1 e0 93 00 19 00 29 02 03 04 05 00 00 0e 10 00 00 15 18 00 1a 00 19 00 00 11 94 00 00 1c 20 38 2a 00 00 01 00 01 01 00 00 00 00 00 00 00 00 00 00 01 00 0a 00 03 00 01 00 01 02 03 04 05 00 02 00 0e 00 01 00 01 18 46 49 99 00 11 22 33 44 55
-match Packet-Type = Advertise, Transaction-ID = 0xe1e093, IA-PD-IAID = 33752069, IA-PD-T1 = 3600, IA-PD-T2 = 5400, IA-PD-Options = { IA-PD-Prefix-Preferred-Lifetime = 4500, IA-PD-Prefix-Valid-Lifetime = 7200, IA-PD-Prefix-IPv6-Prefix-Length = 56, IA-PD-Prefix-IPv6-Prefix = 2a00:1:1:100:: }, Client-ID-DUID = Client-ID-DUID-LL, Client-ID-DUID-LL-Hardware-Type = Client-ID-DUID-LL-Ethernet, Client-ID-DUID-LL-Ethernet-Address = 00:01:02:03:04:05, Server-ID-DUID = Server-ID-DUID-LLT, Server-ID-DUID-LLT-Hardware-Type = Server-ID-DUID-LLT-Ethernet, Server-ID-DUID-LLT-Time = "Nov 26 2012 15:39:05 UTC", Server-ID-DUID-LLT-Ethernet-Address = 00:11:22:33:44:55
+match Packet-Type = Advertise, Transaction-ID = 0xe1e093, IA-PD-IAID = 33752069, IA-PD-T1 = 3600, IA-PD-T2 = 5400, IA-PD-Options = { IA-PD-Prefix-Preferred-Lifetime = 4500, IA-PD-Prefix-Valid-Lifetime = 7200, IA-PD-Prefix-IPv6-Prefix = 2a00:1:1:100::/56 }, Client-ID-DUID = Client-ID-DUID-LL, Client-ID-DUID-LL-Hardware-Type = Client-ID-DUID-LL-Ethernet, Client-ID-DUID-LL-Ethernet-Address = 00:01:02:03:04:05, Server-ID-DUID = Server-ID-DUID-LLT, Server-ID-DUID-LLT-Hardware-Type = Server-ID-DUID-LLT-Ethernet, Server-ID-DUID-LLT-Time = "Nov 26 2012 15:39:05 UTC", Server-ID-DUID-LLT-Ethernet-Address = 00:11:22:33:44:55
#
# 3.
# | iaprefopts= ''
#
decode-proto 03 12 b0 8a 00 01 00 0a 00 03 00 01 00 01 02 03 04 05 00 02 00 0e 00 01 00 01 18 46 49 99 00 11 22 33 44 55 00 06 00 04 00 17 00 18 00 08 00 02 00 00 00 19 00 29 02 03 04 05 00 00 0e 10 00 00 15 18 00 1a 00 19 00 00 1c 20 00 00 1d 4c 38 2a 00 00 01 00 01 01 00 00 00 00 00 00 00 00 00
-match Packet-Type = Request, Transaction-ID = 0x12b08a, Client-ID-DUID = Client-ID-DUID-LL, Client-ID-DUID-LL-Hardware-Type = Client-ID-DUID-LL-Ethernet, Client-ID-DUID-LL-Ethernet-Address = 00:01:02:03:04:05, Server-ID-DUID = Server-ID-DUID-LLT, Server-ID-DUID-LLT-Hardware-Type = Server-ID-DUID-LLT-Ethernet, Server-ID-DUID-LLT-Time = "Nov 26 2012 15:39:05 UTC", Server-ID-DUID-LLT-Ethernet-Address = 00:11:22:33:44:55, Option-Request = DNS-Servers, Option-Request = Domain-List, Elapsed-Time = 0, IA-PD-IAID = 33752069, IA-PD-T1 = 3600, IA-PD-T2 = 5400, IA-PD-Options = { IA-PD-Prefix-Preferred-Lifetime = 7200, IA-PD-Prefix-Valid-Lifetime = 7500, IA-PD-Prefix-IPv6-Prefix-Length = 56, IA-PD-Prefix-IPv6-Prefix = 2a00:1:1:100:: }
+match Packet-Type = Request, Transaction-ID = 0x12b08a, Client-ID-DUID = Client-ID-DUID-LL, Client-ID-DUID-LL-Hardware-Type = Client-ID-DUID-LL-Ethernet, Client-ID-DUID-LL-Ethernet-Address = 00:01:02:03:04:05, Server-ID-DUID = Server-ID-DUID-LLT, Server-ID-DUID-LLT-Hardware-Type = Server-ID-DUID-LLT-Ethernet, Server-ID-DUID-LLT-Time = "Nov 26 2012 15:39:05 UTC", Server-ID-DUID-LLT-Ethernet-Address = 00:11:22:33:44:55, Option-Request = DNS-Servers, Option-Request = Domain-List, Elapsed-Time = 0, IA-PD-IAID = 33752069, IA-PD-T1 = 3600, IA-PD-T2 = 5400, IA-PD-Options = { IA-PD-Prefix-Preferred-Lifetime = 7200, IA-PD-Prefix-Valid-Lifetime = 7500, IA-PD-Prefix-IPv6-Prefix = 2a00:1:1:100::/56 }
#
# 4.
# | lladdr = 00:11:22:33:44:55
#
decode-proto 07 12 b0 8a 00 19 00 29 02 03 04 05 00 00 0e 10 00 00 15 18 00 1a 00 19 00 00 11 94 00 00 1c 20 38 2a 00 00 01 00 01 01 00 00 00 00 00 00 00 00 00 00 01 00 0a 00 03 00 01 00 01 02 03 04 05 00 02 00 0e 00 01 00 01 18 46 49 99 00 11 22 33 44 55
-match Packet-Type = Reply, Transaction-ID = 0x12b08a, IA-PD-IAID = 33752069, IA-PD-T1 = 3600, IA-PD-T2 = 5400, IA-PD-Options = { IA-PD-Prefix-Preferred-Lifetime = 4500, IA-PD-Prefix-Valid-Lifetime = 7200, IA-PD-Prefix-IPv6-Prefix-Length = 56, IA-PD-Prefix-IPv6-Prefix = 2a00:1:1:100:: }, Client-ID-DUID = Client-ID-DUID-LL, Client-ID-DUID-LL-Hardware-Type = Client-ID-DUID-LL-Ethernet, Client-ID-DUID-LL-Ethernet-Address = 00:01:02:03:04:05, Server-ID-DUID = Server-ID-DUID-LLT, Server-ID-DUID-LLT-Hardware-Type = Server-ID-DUID-LLT-Ethernet, Server-ID-DUID-LLT-Time = "Nov 26 2012 15:39:05 UTC", Server-ID-DUID-LLT-Ethernet-Address = 00:11:22:33:44:55
+match Packet-Type = Reply, Transaction-ID = 0x12b08a, IA-PD-IAID = 33752069, IA-PD-T1 = 3600, IA-PD-T2 = 5400, IA-PD-Options = { IA-PD-Prefix-Preferred-Lifetime = 4500, IA-PD-Prefix-Valid-Lifetime = 7200, IA-PD-Prefix-IPv6-Prefix = 2a00:1:1:100::/56 }, Client-ID-DUID = Client-ID-DUID-LL, Client-ID-DUID-LL-Hardware-Type = Client-ID-DUID-LL-Ethernet, Client-ID-DUID-LL-Ethernet-Address = 00:01:02:03:04:05, Server-ID-DUID = Server-ID-DUID-LLT, Server-ID-DUID-LLT-Hardware-Type = Server-ID-DUID-LLT-Ethernet, Server-ID-DUID-LLT-Time = "Nov 26 2012 15:39:05 UTC", Server-ID-DUID-LLT-Ethernet-Address = 00:11:22:33:44:55
count
match 10
# variable-length field (25 octets less than
# the value in the option-len field).
#
-encode-pair IA-PD-Prefix-Preferred-Lifetime = 29425646, IA-PD-Prefix-Valid-Lifetime = 46202862, IA-PD-Prefix-IPv6-Prefix-Length = 128, IA-PD-Prefix-IPv6-Prefix = ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff, IA-PD-Options = { Preference = 1 }
+encode-pair IA-PD-Prefix-Preferred-Lifetime = 29425646, IA-PD-Prefix-Valid-Lifetime = 46202862, IA-PD-Prefix-IPv6-Prefix = ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128, IA-PD-Options = { Preference = 1 }
match 00 1a 00 19 01 c0 ff ee 02 c0 ff ee 80 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 00 19 00 11 00 00 00 00 00 00 00 00 00 00 00 00 00 07 00 01 01
decode-pair -
-match IA-PD-Prefix-Preferred-Lifetime = 29425646, IA-PD-Prefix-Valid-Lifetime = 46202862, IA-PD-Prefix-IPv6-Prefix-Length = 128, IA-PD-Prefix-IPv6-Prefix = ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff, IA-PD-IAID = 0, IA-PD-T1 = 0, IA-PD-T2 = 0, IA-PD-Options = { Preference = 1 }
+match IA-PD-Prefix-Preferred-Lifetime = 29425646, IA-PD-Prefix-Valid-Lifetime = 46202862, IA-PD-Prefix-IPv6-Prefix = ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128, IA-PD-IAID = 0, IA-PD-T1 = 0, IA-PD-T2 = 0, IA-PD-Options = { Preference = 1 }
#
# 21.23. Information Refresh Time Option