On Fri, Jun 13, 2014 at 04:45:05PM +0300, Patrik Flykt wrote: > Add functionality to parse DHCPv6 Identity Association for > Non-temporary (IA_NA) and Temporary Addresses (IA_TA) options. > Both of them contain one or more IA Address (IAADDR) options > and optinally a status code option. Only the IA_NA option > contains lease lifetimes. See RFC 3315, sections 22.4., 22.5., > 22.6., 22.13. and appendix B. for details. If the lease > timeouts are not set, use the ones recommended for servers in > section 22.4. > > Factor out common code in the form of an option header parsing > helper function. > --- > src/libsystemd-network/dhcp6-internal.h | 2 + > src/libsystemd-network/dhcp6-option.c | 182 > ++++++++++++++++++++++++++++++-- > 2 files changed, 175 insertions(+), 9 deletions(-) > > diff --git a/src/libsystemd-network/dhcp6-internal.h > b/src/libsystemd-network/dhcp6-internal.h > index 31f5bd2..ec1d82a 100644 > --- a/src/libsystemd-network/dhcp6-internal.h > +++ b/src/libsystemd-network/dhcp6-internal.h > @@ -66,6 +66,8 @@ int dhcp6_option_append(uint8_t **buf, size_t *buflen, > uint16_t code, > int dhcp6_option_append_ia(uint8_t **buf, size_t *buflen, DHCP6IA *ia); > 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_network_bind_udp_socket(int index, struct in6_addr *address); > int dhcp6_network_send_udp_socket(int s, struct in6_addr *address, > diff --git a/src/libsystemd-network/dhcp6-option.c > b/src/libsystemd-network/dhcp6-option.c > index cc4d261..55fd872 100644 > --- a/src/libsystemd-network/dhcp6-option.c > +++ b/src/libsystemd-network/dhcp6-option.c > @@ -129,22 +129,186 @@ int dhcp6_option_append_ia(uint8_t **buf, size_t > *buflen, DHCP6IA *ia) { > return 0; > } > > + > +static int option_parse_hdr(uint8_t **buf, size_t *buflen, uint16_t *opt, > + size_t *optlen) { > + uint16_t len; > + > + assert_return(buf, -EINVAL); > + assert_return(opt, -EINVAL); > + assert_return(optlen, -EINVAL); > + > + if (*buflen < 4) > + return -ENOMSG; > + > + len = (*buf)[2] << 8 | (*buf)[3]; > + > + if (len > *buflen) > + return -ENOMSG; > + > + *opt = (*buf)[0] << 8 | (*buf)[1]; > + *optlen = len; > + > + (*buf) += 4; > + (*buflen) -= 4; Unnecessary parens?
> - *optvalue = &(*buf)[4]; > - *buflen -= (*optlen + 4); > - (*buf) += (*optlen + 4); > + *optvalue = *buf; > + *buflen -= *optlen; > + (*buf) += *optlen; Zbyszek _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel