summaryrefslogtreecommitdiff
path: root/src/libsystemd-network/dhcp-option.c
diff options
context:
space:
mode:
authorSusant Sahani <145210+ssahani@users.noreply.github.com>2018-05-07 17:51:02 +0530
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2018-05-07 14:21:02 +0200
commitaf1c0de0e124c22858fce99534d4de1f7ed340a7 (patch)
tree1e52269cedc62d3293f1b127ee09e60d1bacb8e8 /src/libsystemd-network/dhcp-option.c
parent348b44372f36010d48d9a7dda14ef67155753a71 (diff)
downloadsystemd-af1c0de0e124c22858fce99534d4de1f7ed340a7.tar.gz
networkd: add support to send DHCP user class option (#7499)
This patch add support to enables to send User Class option code 77 RFC 3004. This option MAY carry multiple User Classes. The format of this option is as follows: Code Len Value +-----+-----+--------------------- . . . --+ | 77 | N | User Class Data ('Len' octets) | +-----+-----+--------------------- . . . --+ where Value consists of one or more instances of User Class Data. Each instance of User Class Data is formatted as follows: UC_Len_i User_Class_Data_i +--------+------------------------ . . . --+ | L_i | Opaque-Data ('UC_Len_i' octets) | +--------+------------------------ . . . --+ UserClass= A DHCPv4 client can use UserClass option to identify the type or category of user or applications it represents. The information contained in this option is an string that represents the user class of which the client is a member. Each class sets an identifying string of information to be used by the DHCP service to classify clients. Takes a whitespace-separated list. UserClass= hello world how are you Closes: RFC: #5134
Diffstat (limited to 'src/libsystemd-network/dhcp-option.c')
-rw-r--r--src/libsystemd-network/dhcp-option.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/libsystemd-network/dhcp-option.c b/src/libsystemd-network/dhcp-option.c
index c95597a00b..4832ee6a2c 100644
--- a/src/libsystemd-network/dhcp-option.c
+++ b/src/libsystemd-network/dhcp-option.c
@@ -12,6 +12,7 @@
#include "alloc-util.h"
#include "utf8.h"
+#include "strv.h"
#include "dhcp-internal.h"
@@ -35,6 +36,34 @@ static int option_append(uint8_t options[], size_t size, size_t *offset,
*offset += 1;
break;
+ case SD_DHCP_OPTION_USER_CLASS: {
+ size_t len = 0;
+ char **s;
+
+ STRV_FOREACH(s, (char **) optval)
+ len += strlen(*s) + 1;
+
+ if (size < *offset + len + 2)
+ return -ENOBUFS;
+
+ options[*offset] = code;
+ options[*offset + 1] = len;
+ *offset += 2;
+
+ STRV_FOREACH(s, (char **) optval) {
+ len = strlen(*s);
+
+ if (len > 255)
+ return -ENAMETOOLONG;
+
+ options[*offset] = len;
+
+ memcpy_safe(&options[*offset + 1], *s, len);
+ *offset += len + 1;
+ }
+
+ break;
+ }
default:
if (size < *offset + optlen + 2)
return -ENOBUFS;