e3169126793f43be3d840874ffb3935a51097001Patrik Flykt#pragma once
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt/***
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt This file is part of systemd.
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
b553817ccfc950df53b9d9870799919824945de5Patrik Flykt Copyright (C) 2014-2015 Intel Corporation. All rights reserved.
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt systemd is free software; you can redistribute it and/or modify it
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt under the terms of the GNU Lesser General Public License as published by
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt the Free Software Foundation; either version 2.1 of the License, or
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt (at your option) any later version.
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt systemd is distributed in the hope that it will be useful, but
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt WITHOUT ANY WARRANTY; without even the implied warranty of
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt Lesser General Public License for more details.
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt You should have received a copy of the GNU Lesser General Public License
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt along with systemd; If not, see <http://www.gnu.org/licenses/>.
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt***/
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt#include <net/ethernet.h>
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt#include <netinet/in.h>
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt#include "sd-event.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt#include "list.h"
a9aff3615b430f86bd0a824214d95f634efaf894Patrik Flykt#include "macro.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering#include "sparse-endian.h"
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykttypedef struct DHCP6Address DHCP6Address;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flyktstruct DHCP6Address {
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt LIST_FIELDS(DHCP6Address, addresses);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt struct {
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt struct in6_addr address;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt be32_t lifetime_preferred;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt be32_t lifetime_valid;
ee3a5027f7c56df2ef47a774970433d7045c9e9fPatrik Flykt } iaaddr _packed_;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt};
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flyktstruct DHCP6IA {
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt uint16_t type;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt struct {
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt be32_t id;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt be32_t lifetime_t1;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt be32_t lifetime_t2;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt } _packed_;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt sd_event_source *timeout_t1;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt sd_event_source *timeout_t2;
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt LIST_HEAD(DHCP6Address, addresses);
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt};
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykttypedef struct DHCP6IA DHCP6IA;
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
79008bddf679a5e0900369950eb346c9fa687107Lennart Poettering#define log_dhcp6_client(p, fmt, ...) log_internal(LOG_DEBUG, 0, __FILE__, __LINE__, __func__, "DHCPv6 CLIENT: " fmt, ##__VA_ARGS__)
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt
f12ed3bf0b315fc88d5fbdf5bdca14b218c86e0cPatrik Flyktint dhcp6_option_append(uint8_t **buf, size_t *buflen, uint16_t code,
f12ed3bf0b315fc88d5fbdf5bdca14b218c86e0cPatrik Flykt size_t optlen, const void *optval);
f12ed3bf0b315fc88d5fbdf5bdca14b218c86e0cPatrik Flyktint dhcp6_option_append_ia(uint8_t **buf, size_t *buflen, DHCP6IA *ia);
f12ed3bf0b315fc88d5fbdf5bdca14b218c86e0cPatrik Flyktint dhcp6_option_parse(uint8_t **buf, size_t *buflen, uint16_t *optcode,
f12ed3bf0b315fc88d5fbdf5bdca14b218c86e0cPatrik Flykt size_t *optlen, uint8_t **optvalue);
c6affce8740bb0cee42eebf6d1d44dd518035e88Patrik Flyktint dhcp6_option_parse_ia(uint8_t **buf, size_t *buflen, uint16_t iatype,
c6affce8740bb0cee42eebf6d1d44dd518035e88Patrik Flykt DHCP6IA *ia);
b553817ccfc950df53b9d9870799919824945de5Patrik Flyktint dhcp6_option_parse_ip6addrs(uint8_t *optval, uint16_t optlen,
b553817ccfc950df53b9d9870799919824945de5Patrik Flykt struct in6_addr **addrs, size_t count,
b553817ccfc950df53b9d9870799919824945de5Patrik Flykt size_t *allocated);
f96ccab7e0e6cb96851010682abbc1ac0909264dPatrik Flyktint dhcp6_option_parse_domainname(const uint8_t *optval, uint16_t optlen,
f96ccab7e0e6cb96851010682abbc1ac0909264dPatrik Flykt char ***str_arr);
34e8c5a23cd1c53ef3c1169388dabe1f6dfd7319Patrik Flykt
34e8c5a23cd1c53ef3c1169388dabe1f6dfd7319Patrik Flyktint dhcp6_network_bind_udp_socket(int index, struct in6_addr *address);
34e8c5a23cd1c53ef3c1169388dabe1f6dfd7319Patrik Flyktint dhcp6_network_send_udp_socket(int s, struct in6_addr *address,
34e8c5a23cd1c53ef3c1169388dabe1f6dfd7319Patrik Flykt const void *packet, size_t len);
a9aff3615b430f86bd0a824214d95f634efaf894Patrik Flykt
a9aff3615b430f86bd0a824214d95f634efaf894Patrik Flyktconst char *dhcp6_message_type_to_string(int s) _const_;
a9aff3615b430f86bd0a824214d95f634efaf894Patrik Flyktint dhcp6_message_type_from_string(const char *s) _pure_;
631bbe71298ec892f77f44f94feb612646fe6853Patrik Flyktconst char *dhcp6_message_status_to_string(int s) _const_;
631bbe71298ec892f77f44f94feb612646fe6853Patrik Flyktint dhcp6_message_status_from_string(const char *s) _pure_;