]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/network/networkd-dhcp-common.h
859c174f977bbc086d779dbea50e73cac5a30464
[thirdparty/systemd.git] / src / network / networkd-dhcp-common.h
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2 #pragma once
3
4 #include <netinet/in.h>
5
6 #include "dhcp-duid-internal.h"
7 #include "in-addr-util.h"
8 #include "networkd-forward.h"
9
10 /* Special values for *_uplink_index. */
11 #define UPLINK_INDEX_AUTO 0 /* uplink will be selected automatically */
12 #define UPLINK_INDEX_NONE -1 /* uplink will not be selected automatically */
13 #define UPLINK_INDEX_SELF -2 /* the interface itself is uplink */
14
15 #define DHCP_ROUTE_METRIC 1024
16 #define IPV6RA_ROUTE_METRIC_HIGH 512
17 #define IPV6RA_ROUTE_METRIC_MEDIUM 1024
18 #define IPV6RA_ROUTE_METRIC_LOW 2048
19 #define DHCP6PD_ROUTE_METRIC 256
20
21 typedef enum DHCPOptionDataType {
22 DHCP_OPTION_DATA_UINT8,
23 DHCP_OPTION_DATA_UINT16,
24 DHCP_OPTION_DATA_UINT32,
25 DHCP_OPTION_DATA_STRING,
26 DHCP_OPTION_DATA_IPV4ADDRESS,
27 DHCP_OPTION_DATA_IPV6ADDRESS,
28 _DHCP_OPTION_DATA_MAX,
29 _DHCP_OPTION_DATA_INVALID,
30 } DHCPOptionDataType;
31
32 typedef struct DUID {
33 /* Value of Type in [DHCP] section */
34 DUIDType type;
35
36 uint8_t raw_data_len;
37 uint8_t raw_data[MAX_DUID_DATA_LEN];
38 usec_t llt_time;
39 bool set;
40 } DUID;
41
42 uint32_t link_get_dhcp4_route_table(Link *link);
43 uint32_t link_get_ndisc_route_table(Link *link);
44
45 bool link_dhcp_enabled(Link *link, int family);
46 static inline bool link_dhcp4_enabled(Link *link) {
47 return link_dhcp_enabled(link, AF_INET);
48 }
49 static inline bool link_dhcp6_enabled(Link *link) {
50 return link_dhcp_enabled(link, AF_INET6);
51 }
52
53 void network_adjust_dhcp(Network *network);
54
55 const DUID *link_get_duid(Link *link, int family);
56 static inline const DUID *link_get_dhcp4_duid(Link *link) {
57 return link_get_duid(link, AF_INET);
58 }
59 static inline const DUID *link_get_dhcp6_duid(Link *link) {
60 return link_get_duid(link, AF_INET6);
61 }
62
63 int dhcp_configure_duid(Link *link, const DUID *duid);
64 int manager_request_product_uuid(Manager *m);
65
66 bool address_is_filtered(int family, const union in_addr_union *address, uint8_t prefixlen, Set *allow_list, Set *deny_list);
67 static inline bool in4_address_is_filtered(const struct in_addr *address, Set *allow_list, Set *deny_list) {
68 return address_is_filtered(AF_INET, &(union in_addr_union) { .in = *address }, 32, allow_list, deny_list);
69 }
70 static inline bool in6_prefix_is_filtered(const struct in6_addr *prefix, uint8_t prefixlen, Set *allow_list, Set *deny_list) {
71 return address_is_filtered(AF_INET6, &(union in_addr_union) { .in6 = *prefix }, prefixlen, allow_list, deny_list);
72 }
73
74 int link_get_captive_portal(Link *link, const char **ret);
75
76 const char* dhcp_option_data_type_to_string(DHCPOptionDataType d) _const_;
77 DHCPOptionDataType dhcp_option_data_type_from_string(const char *d) _pure_;
78
79 CONFIG_PARSER_PROTOTYPE(config_parse_dhcp);
80 CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_route_metric);
81 CONFIG_PARSER_PROTOTYPE(config_parse_ndisc_route_metric);
82 CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_send_hostname);
83 CONFIG_PARSER_PROTOTYPE(config_parse_iaid);
84 CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_or_ra_route_table);
85 CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_user_or_vendor_class);
86 CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_send_option);
87 CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_request_options);
88 CONFIG_PARSER_PROTOTYPE(config_parse_duid_type);
89 CONFIG_PARSER_PROTOTYPE(config_parse_manager_duid_type);
90 CONFIG_PARSER_PROTOTYPE(config_parse_network_duid_type);
91 CONFIG_PARSER_PROTOTYPE(config_parse_duid_rawdata);
92 CONFIG_PARSER_PROTOTYPE(config_parse_manager_duid_rawdata);
93 CONFIG_PARSER_PROTOTYPE(config_parse_network_duid_rawdata);
94 CONFIG_PARSER_PROTOTYPE(config_parse_uplink);