1 /** 2 * Copyright (C) 2012-2013 Steven Barth <steven@midlink.org> 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License v2 as published by 6 * the Free Software Foundation. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 * 13 */ 14 15 #pragma once 16 #include <netinet/in.h> 17 #include <netinet/icmp6.h> 18 #include <netinet/ether.h> 19 #include <stdbool.h> 20 #include <syslog.h> 21 22 #include <libubox/blobmsg.h> 23 #include <libubox/list.h> 24 #include <libubox/uloop.h> 25 #include <libubox/avl.h> 26 #include <libubox/ustream.h> 27 #include <libubox/vlist.h> 28 29 #define min(a, b) (((a) < (b)) ? (a) : (b)) 30 #define max(a, b) (((a) > (b)) ? (a) : (b)) 31 32 // RFC 6106 defines this router advertisement option 33 #define ND_OPT_ROUTE_INFO 24 34 #define ND_OPT_RECURSIVE_DNS 25 35 #define ND_OPT_DNS_SEARCH 31 36 37 // RFC 8781 defines PREF64 option 38 #define ND_OPT_PREF64 38 39 40 #define INFINITE_VALID(x) ((x) == 0) 41 42 #define _unused __attribute__((unused)) 43 #define _packed __attribute__((packed)) 44 45 #define ALL_IPV6_NODES "ff02::1" 46 #define ALL_IPV6_ROUTERS "ff02::2" 47 48 #define NTP_SUBOPTION_SRV_ADDR 1 49 #define NTP_SUBOPTION_MC_ADDR 2 50 #define NTP_SUBOPTION_SRV_FQDN 3 51 #define IPV6_ADDR_LEN 16 52 53 #define IN6_IS_ADDR_ULA(a) (((a)->s6_addr32[0] & htonl(0xfe000000)) == htonl(0xfc000000)) 54 55 #define ADDR_MATCH_PIO_FILTER(_addr, iface) (odhcpd_bmemcmp(&(_addr)->addr, \ 56 &(iface)->pio_filter_addr, \ 57 (iface)->pio_filter_length) != 0 || \ 58 (_addr)->prefix < (iface)->pio_filter_length) 59 60 struct interface; 61 struct nl_sock; 62 extern struct vlist_tree leases; 63 extern struct config config; 64 65 struct odhcpd_event { 66 struct uloop_fd uloop; 67 void (*handle_dgram)(void *addr, void *data, size_t len, 68 struct interface *iface, void *dest_addr); 69 void (*handle_error)(struct odhcpd_event *e, int error); 70 void (*recv_msgs)(struct odhcpd_event *e); 71 }; 72 73 typedef int (*send_reply_cb_t)(const void *buf, size_t len, 74 const struct sockaddr *dest, socklen_t dest_len, 75 void *opaque); 76 77 typedef void (*dhcpv6_binding_cb_handler_t)(struct in6_addr *addr, int prefix, 78 uint32_t pref, uint32_t valid, 79 void *arg); 80 81 union if_addr { 82 struct in_addr in; 83 struct in6_addr in6; 84 }; 85 86 struct netevent_handler_info { 87 struct interface *iface; 88 union { 89 struct { 90 union if_addr dst; 91 uint8_t dst_len; 92 union if_addr gateway; 93 } rt; 94 struct { 95 union if_addr dst; 96 uint16_t state; 97 uint8_t flags; 98 } neigh; 99 struct { 100 struct odhcpd_ipaddr *addrs; 101 size_t len; 102 } addrs_old; 103 union if_addr addr; 104 }; 105 }; 106 107 enum netevents { 108 NETEV_IFINDEX_CHANGE, 109 NETEV_ADDR_ADD, 110 NETEV_ADDR_DEL, 111 NETEV_ADDRLIST_CHANGE, 112 NETEV_ADDR6_ADD, 113 NETEV_ADDR6_DEL, 114 NETEV_ADDR6LIST_CHANGE, 115 NETEV_ROUTE6_ADD, 116 NETEV_ROUTE6_DEL, 117 NETEV_NEIGH6_ADD, 118 NETEV_NEIGH6_DEL, 119 }; 120 121 struct netevent_handler { 122 struct list_head head; 123 void (*cb) (unsigned long event, struct netevent_handler_info *info); 124 }; 125 126 struct odhcpd_ipaddr { 127 union if_addr addr; 128 uint8_t prefix; 129 uint32_t preferred; 130 uint32_t valid; 131 132 union { 133 /* ipv6 only */ 134 struct { 135 uint8_t dprefix; 136 uint8_t invalid_advertisements; 137 bool tentative; 138 }; 139 140 /* ipv4 only */ 141 struct in_addr broadcast; 142 }; 143 }; 144 145 enum odhcpd_mode { 146 MODE_DISABLED, 147 MODE_SERVER, 148 MODE_RELAY, 149 MODE_HYBRID 150 }; 151 152 153 enum odhcpd_assignment_flags { 154 OAF_TENTATIVE = (1 << 0), 155 OAF_BOUND = (1 << 1), 156 OAF_STATIC = (1 << 2), 157 OAF_BROKEN_HOSTNAME = (1 << 3), 158 OAF_DHCPV4 = (1 << 4), 159 OAF_DHCPV6_NA = (1 << 5), 160 OAF_DHCPV6_PD = (1 << 6), 161 }; 162 163 struct config { 164 bool legacy; 165 bool main_dhcpv4; 166 char *dhcp_cb; 167 char *dhcp_statefile; 168 int log_level; 169 }; 170 171 172 struct lease { 173 struct vlist_node node; 174 struct list_head assignments; 175 uint32_t ipaddr; 176 uint64_t hostid; 177 struct ether_addr mac; 178 uint16_t duid_len; 179 uint8_t *duid; 180 uint32_t leasetime; 181 char *hostname; 182 }; 183 184 enum { 185 LEASE_ATTR_IP, 186 LEASE_ATTR_MAC, 187 LEASE_ATTR_DUID, 188 LEASE_ATTR_HOSTID, 189 LEASE_ATTR_LEASETIME, 190 LEASE_ATTR_NAME, 191 LEASE_ATTR_MAX 192 }; 193 194 struct odhcpd_ref_ip; 195 196 struct dhcp_assignment { 197 struct list_head head; 198 struct list_head lease_list; 199 200 void (*dhcp_free_cb)(struct dhcp_assignment *a); 201 202 struct interface *iface; 203 struct lease *lease; 204 205 struct sockaddr_in6 peer; 206 time_t valid_until; 207 time_t preferred_until; 208 209 #define fr_timer reconf_timer 210 struct uloop_timeout reconf_timer; 211 #define accept_fr_nonce accept_reconf 212 bool accept_reconf; 213 #define fr_cnt reconf_cnt 214 int reconf_cnt; 215 uint8_t key[16]; 216 struct odhcpd_ref_ip *fr_ip; 217 218 uint32_t addr; 219 union { 220 uint64_t assigned_host_id; 221 uint32_t assigned_subnet_id; 222 }; 223 uint32_t iaid; 224 uint8_t length; // length == 128 -> IA_NA, length <= 64 -> IA_PD 225 226 struct odhcpd_ipaddr *managed; 227 ssize_t managed_size; 228 struct ustream_fd managed_sock; 229 230 unsigned int flags; 231 uint32_t leasetime; 232 char *hostname; 233 char *reqopts; 234 #define hwaddr mac 235 uint8_t mac[6]; 236 237 uint16_t clid_len; 238 uint8_t clid_data[]; 239 }; 240 241 242 struct interface { 243 struct avl_node avl; 244 245 int ifflags; 246 int ifindex; 247 char *ifname; 248 const char *name; 249 250 // IPv6 runtime data 251 struct odhcpd_ipaddr *addr6; 252 size_t addr6_len; 253 struct odhcpd_ipaddr *invalid_addr6; 254 size_t invalid_addr6_len; 255 256 // RA runtime data 257 struct odhcpd_event router_event; 258 struct uloop_timeout timer_rs; 259 uint32_t ra_sent; 260 261 // DHCPv6 runtime data 262 struct odhcpd_event dhcpv6_event; 263 struct list_head ia_assignments; 264 265 // NDP runtime data 266 struct odhcpd_event ndp_event; 267 int ndp_ping_fd; 268 269 // IPv4 runtime data 270 struct odhcpd_ipaddr *addr4; 271 size_t addr4_len; 272 273 // DHCPv4 runtime data 274 struct odhcpd_event dhcpv4_event; 275 struct list_head dhcpv4_assignments; 276 struct list_head dhcpv4_fr_ips; 277 278 // Managed PD 279 char dhcpv6_pd_manager[128]; 280 struct in6_addr dhcpv6_pd_cer; 281 282 // Services 283 enum odhcpd_mode ra; 284 enum odhcpd_mode dhcpv6; 285 enum odhcpd_mode ndp; 286 enum odhcpd_mode dhcpv4; 287 288 // Config 289 bool inuse; 290 bool external; 291 bool master; 292 bool ignore; 293 bool always_rewrite_dns; 294 bool dns_service; 295 296 // NDP 297 int learn_routes; 298 299 // RA 300 uint8_t ra_flags; 301 bool ra_slaac; 302 bool ra_not_onlink; 303 bool ra_advrouter; 304 bool ra_useleasetime; 305 bool ra_dns; 306 uint8_t pref64_length; 307 struct in6_addr pref64_addr; 308 bool no_dynamic_dhcp; 309 bool have_link_local; 310 uint8_t pio_filter_length; 311 struct in6_addr pio_filter_addr; 312 int default_router; 313 int route_preference; 314 int ra_maxinterval; 315 int ra_mininterval; 316 int ra_lifetime; 317 uint32_t ra_reachabletime; 318 uint32_t ra_retranstime; 319 uint32_t ra_hoplimit; 320 int ra_mtu; 321 uint32_t preferred_lifetime; 322 323 // DHCP 324 uint32_t dhcp_leasetime; 325 326 // DHCPv4 327 struct in_addr dhcpv4_start; 328 struct in_addr dhcpv4_end; 329 struct in_addr dhcpv4_start_ip; 330 struct in_addr dhcpv4_end_ip; 331 struct in_addr dhcpv4_local; 332 struct in_addr dhcpv4_bcast; 333 struct in_addr dhcpv4_mask; 334 struct in_addr *dhcpv4_router; 335 size_t dhcpv4_router_cnt; 336 struct in_addr *dhcpv4_dns; 337 size_t dhcpv4_dns_cnt; 338 bool dhcpv4_forcereconf; 339 340 // DNS 341 struct in6_addr *dns; 342 size_t dns_cnt; 343 uint8_t *search; 344 size_t search_len; 345 346 // DHCPV6 347 void *dhcpv6_raw; 348 size_t dhcpv6_raw_len; 349 bool dhcpv6_assignall; 350 bool dhcpv6_pd; 351 bool dhcpv6_na; 352 uint32_t dhcpv6_hostid_len; 353 uint32_t dhcpv6_pd_min_len; // minimum delegated prefix length 354 355 char *upstream; 356 size_t upstream_len; 357 358 char *filter_class; 359 360 // NTP 361 struct in_addr *dhcpv4_ntp; 362 size_t dhcpv4_ntp_cnt; 363 uint8_t *dhcpv6_ntp; 364 uint16_t dhcpv6_ntp_len; 365 size_t dhcpv6_ntp_cnt; 366 367 // SNTP 368 struct in6_addr *dhcpv6_sntp; 369 size_t dhcpv6_sntp_cnt; 370 }; 371 372 extern struct avl_tree interfaces; 373 extern const struct blobmsg_policy lease_attrs[LEASE_ATTR_MAX]; 374 375 inline static void free_assignment(struct dhcp_assignment *a) 376 { 377 list_del(&a->head); 378 list_del(&a->lease_list); 379 380 if (a->dhcp_free_cb) 381 a->dhcp_free_cb(a); 382 383 free(a->hostname); 384 free(a->reqopts); 385 free(a); 386 } 387 388 inline static struct dhcp_assignment *alloc_assignment(size_t extra_len) 389 { 390 struct dhcp_assignment *a = calloc(1, sizeof(*a) + extra_len); 391 392 if (!a) 393 return NULL; 394 395 INIT_LIST_HEAD(&a->head); 396 INIT_LIST_HEAD(&a->lease_list); 397 398 return a; 399 } 400 401 // Exported main functions 402 int odhcpd_register(struct odhcpd_event *event); 403 int odhcpd_deregister(struct odhcpd_event *event); 404 void odhcpd_process(struct odhcpd_event *event); 405 406 ssize_t odhcpd_send(int socket, struct sockaddr_in6 *dest, 407 struct iovec *iov, size_t iov_len, 408 const struct interface *iface); 409 int odhcpd_get_interface_dns_addr(const struct interface *iface, 410 struct in6_addr *addr); 411 int odhcpd_get_interface_config(const char *ifname, const char *what); 412 int odhcpd_get_mac(const struct interface *iface, uint8_t mac[6]); 413 int odhcpd_get_flags(const struct interface *iface); 414 struct interface* odhcpd_get_interface_by_index(int ifindex); 415 int odhcpd_urandom(void *data, size_t len); 416 417 void odhcpd_run(void); 418 time_t odhcpd_time(void); 419 ssize_t odhcpd_unhexlify(uint8_t *dst, size_t len, const char *src); 420 void odhcpd_hexlify(char *dst, const uint8_t *src, size_t len); 421 const char *odhcpd_print_mac(const uint8_t *mac, const size_t len); 422 423 int odhcpd_bmemcmp(const void *av, const void *bv, size_t bits); 424 void odhcpd_bmemcpy(void *av, const void *bv, size_t bits); 425 426 int odhcpd_netmask2bitlen(bool v6, void *mask); 427 bool odhcpd_bitlen2netmask(bool v6, unsigned int bits, void *mask); 428 bool odhcpd_valid_hostname(const char *name); 429 430 int config_parse_interface(void *data, size_t len, const char *iname, bool overwrite); 431 struct lease *config_find_lease_by_duid(const uint8_t *duid, const uint16_t len); 432 struct lease *config_find_lease_by_mac(const uint8_t *mac); 433 struct lease *config_find_lease_by_hostid(const uint64_t hostid); 434 struct lease *config_find_lease_by_ipaddr(const uint32_t ipaddr); 435 int set_lease_from_blobmsg(struct blob_attr *ba); 436 437 #ifdef WITH_UBUS 438 int ubus_init(void); 439 const char* ubus_get_ifname(const char *name); 440 void ubus_apply_network(void); 441 bool ubus_has_prefix(const char *name, const char *ifname); 442 void ubus_bcast_dhcp_event(const char *type, const uint8_t *mac, const size_t mac_len, 443 const struct in_addr *addr, const char *name, const char *interface); 444 #endif 445 446 ssize_t dhcpv6_ia_handle_IAs(uint8_t *buf, size_t buflen, struct interface *iface, 447 const struct sockaddr_in6 *addr, const void *data, const uint8_t *end); 448 int dhcpv6_ia_init(void); 449 int dhcpv6_ia_setup_interface(struct interface *iface, bool enable); 450 void dhcpv6_ia_enum_addrs(struct interface *iface, struct dhcp_assignment *c, time_t now, 451 dhcpv6_binding_cb_handler_t func, void *arg); 452 void dhcpv6_ia_write_statefile(void); 453 454 int netlink_add_netevent_handler(struct netevent_handler *hdlr); 455 ssize_t netlink_get_interface_addrs(const int ifindex, bool v6, 456 struct odhcpd_ipaddr **addrs); 457 ssize_t netlink_get_interface_linklocal(int ifindex, struct odhcpd_ipaddr **addrs); 458 int netlink_get_interface_proxy_neigh(int ifindex, const struct in6_addr *addr); 459 int netlink_setup_route(const struct in6_addr *addr, const int prefixlen, 460 const int ifindex, const struct in6_addr *gw, 461 const uint32_t metric, const bool add); 462 int netlink_setup_proxy_neigh(const struct in6_addr *addr, 463 const int ifindex, const bool add); 464 int netlink_setup_addr(struct odhcpd_ipaddr *addr, 465 const int ifindex, const bool v6, const bool add); 466 void netlink_dump_neigh_table(const bool proxy); 467 void netlink_dump_addr_table(const bool v6); 468 469 // Exported module initializers 470 int netlink_init(void); 471 int router_init(void); 472 int dhcpv6_init(void); 473 int ndp_init(void); 474 #ifdef DHCPV4_SUPPORT 475 int dhcpv4_init(void); 476 477 int dhcpv4_setup_interface(struct interface *iface, bool enable); 478 void dhcpv4_handle_msg(void *addr, void *data, size_t len, 479 struct interface *iface, _unused void *dest_addr, 480 send_reply_cb_t send_reply, void *opaque); 481 #endif 482 int router_setup_interface(struct interface *iface, bool enable); 483 int dhcpv6_setup_interface(struct interface *iface, bool enable); 484 int ndp_setup_interface(struct interface *iface, bool enable); 485 void reload_services(struct interface *iface); 486 487 void odhcpd_reload(void); 488
This page was automatically generated by LXR 0.3.1. • OpenWrt