[prev in list] [next in list] [prev in thread] [next in thread]
List: busybox
Subject: [PATCH 6/6] udhcpc6: Set -x options in request
From: Samuel Mendoza-Jonas <sam () mendozajonas ! com>
Date: 2018-05-08 6:30:25
Message-ID: 20180508063025.1978-7-sam () mendozajonas ! com
[Download RAW message or body]
Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
---
networking/udhcp/common.c | 19 +++++++++++++++----
networking/udhcp/common.h | 4 ++++
networking/udhcp/d6_dhcpc.c | 10 +++++++++-
3 files changed, 28 insertions(+), 5 deletions(-)
diff --git a/networking/udhcp/common.c b/networking/udhcp/common.c
index 2fdec1d55..771c3df75 100644
--- a/networking/udhcp/common.c
+++ b/networking/udhcp/common.c
@@ -411,10 +411,21 @@ static NOINLINE void attach_option(
/* make a new option */
log2("attaching option %02x to list", optflag->code);
new = xmalloc(sizeof(*new));
- new->data = xmalloc(length + OPT_DATA);
- new->data[OPT_CODE] = optflag->code;
- new->data[OPT_LEN] = length;
- memcpy(new->data + OPT_DATA, (allocated ? allocated : buffer), length);
+ if (addr_type == CLIENT_CONFIG_DHCPV6) {
+ new->data = xmalloc(length + D6_OPT_DATA);
+ new->data[D6_OPT_CODE] = optflag->code >> 8;
+ new->data[D6_OPT_CODE + 1] = optflag->code & 0xff;
+ new->data[D6_OPT_LEN] = length >> 8;
+ new->data[D6_OPT_LEN + 1] = length & 0xff;
+ memcpy(new->data + D6_OPT_DATA, (allocated ? allocated : buffer),
+ length);
+ } else {
+ new->data = xmalloc(length + OPT_DATA);
+ new->data[OPT_CODE] = optflag->code;
+ new->data[OPT_LEN] = length;
+ memcpy(new->data + OPT_DATA, (allocated ? allocated : buffer),
+ length);
+ }
curr = opt_list;
while (*curr && (*curr)->data[OPT_CODE] < optflag->code)
diff --git a/networking/udhcp/common.h b/networking/udhcp/common.h
index e8c3dc2af..15499197c 100644
--- a/networking/udhcp/common.h
+++ b/networking/udhcp/common.h
@@ -164,6 +164,10 @@ enum {
#define OPT_CODE 0
#define OPT_LEN 1
#define OPT_DATA 2
+/* Offsets in option byte sequence for DHCPv6 */
+#define D6_OPT_CODE 0
+#define D6_OPT_LEN 2
+#define D6_OPT_DATA 4
/* Bits in "overload" option */
#define OPTION_FIELD 0
#define FILE_FIELD 1
diff --git a/networking/udhcp/d6_dhcpc.c b/networking/udhcp/d6_dhcpc.c
index 0b6c4b28a..f021cd1c2 100644
--- a/networking/udhcp/d6_dhcpc.c
+++ b/networking/udhcp/d6_dhcpc.c
@@ -486,8 +486,11 @@ static uint8_t *init_d6_packet(struct d6_packet *packet, char type, uint32_t xid
static uint8_t *add_d6_client_options(uint8_t *ptr)
{
+ struct option_set *curr;
uint8_t *start = ptr;
unsigned option;
+ uint16_t len;
+
ptr += 4;
for (option = 1; option < 256; option++) {
@@ -510,7 +513,12 @@ static uint8_t *add_d6_client_options(uint8_t *ptr)
ptr = mempcpy(ptr, &opt_fqdn_req, sizeof(opt_fqdn_req));
#endif
/* Add -x options if any */
- //...
+ curr = client_config.options;
+ while (curr) {
+ len = curr->data[D6_OPT_LEN] << 8 | (curr->data[D6_OPT_LEN + 1] & 0xff);
+ ptr = mempcpy(ptr, curr->data, D6_OPT_DATA + len);
+ curr = curr->next;
+ }
return ptr;
}
--
2.17.0
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic