d05c2b80e5f6bbe4fbc54fbdd29a0a30d180b719
[openwrt/staging/ldir.git] /
1 From f8c77edbdffb8ada7753ea9fa104f0f6da70cfe3 Mon Sep 17 00:00:00 2001
2 From: Simon Kelley <simon@thekelleys.org.uk>
3 Date: Thu, 10 Jan 2019 21:58:18 +0000
4 Subject: [PATCH 29/57] Fix removal of DHCP_CLIENT_MAC options from DHCPv6
5 relay replies.
6
7 Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
8 ---
9 src/rfc3315.c | 30 +++++++++++++++++-------------
10 1 file changed, 17 insertions(+), 13 deletions(-)
11
12 --- a/src/rfc3315.c
13 +++ b/src/rfc3315.c
14 @@ -219,21 +219,25 @@ static int dhcp6_maybe_relay(struct stat
15 if (opt6_ptr(opt, 0) + opt6_len(opt) > end)
16 return 0;
17
18 - int o = new_opt6(opt6_type(opt));
19 - if (opt6_type(opt) == OPTION6_RELAY_MSG)
20 + /* Don't copy MAC address into reply. */
21 + if (opt6_type(opt) != OPTION6_CLIENT_MAC)
22 {
23 - struct in6_addr align;
24 - /* the packet data is unaligned, copy to aligned storage */
25 - memcpy(&align, inbuff + 2, IN6ADDRSZ);
26 - state->link_address = &align;
27 - /* zero is_unicast since that is now known to refer to the
28 - relayed packet, not the original sent by the client */
29 - if (!dhcp6_maybe_relay(state, opt6_ptr(opt, 0), opt6_len(opt), client_addr, 0, now))
30 - return 0;
31 + int o = new_opt6(opt6_type(opt));
32 + if (opt6_type(opt) == OPTION6_RELAY_MSG)
33 + {
34 + struct in6_addr align;
35 + /* the packet data is unaligned, copy to aligned storage */
36 + memcpy(&align, inbuff + 2, IN6ADDRSZ);
37 + state->link_address = &align;
38 + /* zero is_unicast since that is now known to refer to the
39 + relayed packet, not the original sent by the client */
40 + if (!dhcp6_maybe_relay(state, opt6_ptr(opt, 0), opt6_len(opt), client_addr, 0, now))
41 + return 0;
42 + }
43 + else
44 + put_opt6(opt6_ptr(opt, 0), opt6_len(opt));
45 + end_opt6(o);
46 }
47 - else if (opt6_type(opt) != OPTION6_CLIENT_MAC)
48 - put_opt6(opt6_ptr(opt, 0), opt6_len(opt));
49 - end_opt6(o);
50 }
51
52 return 1;