]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
dhcp6-option: Add helper function for fetching IPv6 addresses
authorPatrik Flykt <patrik.flykt@linux.intel.com>
Thu, 2 Apr 2015 07:35:30 +0000 (10:35 +0300)
committerPatrik Flykt <patrik.flykt@linux.intel.com>
Fri, 21 Aug 2015 08:23:21 +0000 (11:23 +0300)
Add a helper function that extracts a block of IPv6 addresses from
the provided option data.

src/libsystemd-network/dhcp6-internal.h
src/libsystemd-network/dhcp6-option.c

index 4f54ad89a6758eb05c066f329fa2f3cf5f507656..87a3588db7804f679e4f0cbdf8317534b085cebf 100644 (file)
@@ -5,7 +5,7 @@
 /***
   This file is part of systemd.
 
-  Copyright (C) 2014 Intel Corporation. All rights reserved.
+  Copyright (C) 2014-2015 Intel Corporation. All rights reserved.
 
   systemd is free software; you can redistribute it and/or modify it
   under the terms of the GNU Lesser General Public License as published by
@@ -68,6 +68,9 @@ int dhcp6_option_parse(uint8_t **buf, size_t *buflen, uint16_t *optcode,
                        size_t *optlen, uint8_t **optvalue);
 int dhcp6_option_parse_ia(uint8_t **buf, size_t *buflen, uint16_t iatype,
                           DHCP6IA *ia);
+int dhcp6_option_parse_ip6addrs(uint8_t *optval, uint16_t optlen,
+                                struct in6_addr **addrs, size_t count,
+                                size_t *allocated);
 
 int dhcp6_network_bind_udp_socket(int index, struct in6_addr *address);
 int dhcp6_network_send_udp_socket(int s, struct in6_addr *address,
index ea863f45e4ea13a400461949a62cbce71c913379..693170bf0c78ce88685d729a587bf092acd0ae7e 100644 (file)
@@ -3,7 +3,7 @@
 /***
   This file is part of systemd.
 
-  Copyright (C) 2014 Intel Corporation. All rights reserved.
+  Copyright (C) 2014-2015 Intel Corporation. All rights reserved.
 
   systemd is free software; you can redistribute it and/or modify it
   under the terms of the GNU Lesser General Public License as published by
@@ -317,3 +317,21 @@ error:
 
         return r;
 }
+
+int dhcp6_option_parse_ip6addrs(uint8_t *optval, uint16_t optlen,
+                                struct in6_addr **addrs, size_t count,
+                                size_t *allocated) {
+
+        if (optlen == 0 || optlen % sizeof(struct in6_addr) != 0)
+                return -EINVAL;
+
+        if (!GREEDY_REALLOC(*addrs, *allocated,
+                            count * sizeof(struct in6_addr) + optlen))
+                return -ENOMEM;
+
+        memcpy(*addrs + count, optval, optlen);
+
+        count += optlen / sizeof(struct in6_addr);
+
+        return count;
+}