1 /* 2 * dhcpcd - DHCP client daemon 3 * Copyright (c) 2006-2015 Roy Marples <roy (at) marples.name> 4 * All rights reserved 5 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 */ 27 28 #include <asm/types.h> /* Needed for 2.4 kernels */ 29 30 #include <sys/types.h> 31 #include <sys/socket.h> 32 #include <sys/ioctl.h> 33 #include <sys/param.h> 34 35 #include <linux/if_addr.h> 36 #include <linux/if_link.h> 37 #include <linux/if_packet.h> 38 #include <linux/filter.h> 39 #include <linux/netlink.h> 40 #include <linux/rtnetlink.h> 41 42 #include <arpa/inet.h> 43 #include <net/if.h> 44 #include <netinet/if_ether.h> 45 #include <netinet/in_systm.h> 46 #include <netinet/in.h> 47 #include <net/route.h> 48 49 /* Support older kernels */ 50 #ifndef IFLA_WIRELESS 51 # define IFLA_WIRELESS (IFLA_MASTER + 1) 52 #endif 53 54 /* Linux has these in an enum and there is just no way to work 55 * out of they exist at compile time. Silly silly silly. */ 56 #define IFLA_AF_SPEC 26 57 #define IFLA_INET6_ADDR_GEN_MODE 8 58 #define IN6_ADDR_GEN_MODE_NONE 1 59 60 /* For some reason, glibc doesn't include newer flags from linux/if.h 61 * However, we cannot include linux/if.h directly as it conflicts 62 * with the glibc version. D'oh! */ 63 #ifndef IFF_LOWER_UP 64 #define IFF_LOWER_UP 0x10000 /* driver signals L1 up */ 65 #endif 66 67 #include <errno.h> 68 #include <fcntl.h> 69 #include <ctype.h> 70 #include <stddef.h> 71 #include <stdio.h> 72 #include <stdlib.h> 73 #include <string.h> 74 #include <time.h> 75 #include <unistd.h> 76 77 #include "config.h" 78 #include "common.h" 79 #include "dev.h" 80 #include "dhcp.h" 81 #include "if.h" 82 #include "ipv4.h" 83 #include "ipv6.h" 84 #include "ipv6nd.h" 85 86 #ifdef HAVE_NL80211_H 87 #include <linux/genetlink.h> 88 #include <linux/nl80211.h> 89 #endif 90 int if_getssid_wext(const char *ifname, uint8_t *ssid); 91 92 #define bpf_insn sock_filter 93 #define BPF_SKIPTYPE 94 #define BPF_ETHCOOK -ETH_HLEN 95 #define BPF_WHOLEPACKET 0x0fffffff /* work around buggy LPF filters */ 96 97 #include "bpf-filter.h" 98 99 /* Broadcast address for IPoIB */ 100 static const uint8_t ipv4_bcast_addr[] = { 101 0x00, 0xff, 0xff, 0xff, 102 0xff, 0x12, 0x40, 0x1b, 0x00, 0x00, 0x00, 0x00, 103 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff 104 }; 105 106 #define PROC_INET6 "/proc/net/if_inet6" 107 #define PROC_PROMOTE "/proc/sys/net/ipv4/conf/%s/promote_secondaries" 108 #define SYS_LAYER2 "/sys/class/net/%s/device/layer2" 109 110 static const char *mproc = 111 #if defined(__alpha__) 112 "system type" 113 #elif defined(__arm__) 114 "Hardware" 115 #elif defined(__avr32__) 116 "cpu family" 117 #elif defined(__bfin__) 118 "BOARD Name" 119 #elif defined(__cris__) 120 "cpu model" 121 #elif defined(__frv__) 122 "System" 123 #elif defined(__i386__) || defined(__x86_64__) 124 "vendor_id" 125 #elif defined(__ia64__) 126 "vendor" 127 #elif defined(__hppa__) 128 "model" 129 #elif defined(__m68k__) 130 "MMU" 131 #elif defined(__mips__) 132 "system type" 133 #elif defined(__powerpc__) || defined(__powerpc64__) 134 "machine" 135 #elif defined(__s390__) || defined(__s390x__) 136 "Manufacturer" 137 #elif defined(__sh__) 138 "machine" 139 #elif defined(sparc) || defined(__sparc__) 140 "cpu" 141 #elif defined(__vax__) 142 "cpu" 143 #else 144 NULL 145 #endif 146 ; 147 148 int 149 if_machinearch(char *str, size_t len) 150 { 151 FILE *fp; 152 char buf[256]; 153 154 if (mproc == NULL) { 155 errno = EINVAL; 156 return -1; 157 } 158 159 fp = fopen("/proc/cpuinfo", "r"); 160 if (fp == NULL) 161 return -1; 162 163 while (fscanf(fp, "%255s : ", buf) != EOF) { 164 if (strncmp(buf, mproc, strlen(mproc)) == 0 && 165 fscanf(fp, "%255s", buf) == 1) 166 { 167 fclose(fp); 168 return snprintf(str, len, ":%s", buf); 169 } 170 } 171 fclose(fp); 172 errno = ESRCH; 173 return -1; 174 } 175 176 static int 177 check_proc_int(const char *path) 178 { 179 FILE *fp; 180 int i; 181 182 fp = fopen(path, "r"); 183 if (fp == NULL) 184 return -1; 185 if (fscanf(fp, "%d", &i) != 1) 186 i = -1; 187 fclose(fp); 188 return i; 189 } 190 191 static ssize_t 192 write_path(const char *path, const char *val) 193 { 194 FILE *fp; 195 ssize_t r; 196 197 fp = fopen(path, "w"); 198 if (fp == NULL) 199 return -1; 200 r = fprintf(fp, "%s\n", val); 201 fclose(fp); 202 return r; 203 } 204 205 int 206 if_init(struct interface *ifp) 207 { 208 char path[sizeof(PROC_PROMOTE) + IF_NAMESIZE]; 209 int n; 210 211 /* We enable promote_secondaries so that we can do this 212 * add 192.168.1.2/24 213 * add 192.168.1.3/24 214 * del 192.168.1.2/24 215 * and the subnet mask moves onto 192.168.1.3/24 216 * This matches the behaviour of BSD which makes coding dhcpcd 217 * a little easier as there's just one behaviour. */ 218 snprintf(path, sizeof(path), PROC_PROMOTE, ifp->name); 219 n = check_proc_int(path); 220 if (n == -1) 221 return errno == ENOENT ? 0 : -1; 222 if (n == 1) 223 return 0; 224 return write_path(path, "1") == -1 ? -1 : 0; 225 } 226 227 int 228 if_conf(struct interface *ifp) 229 { 230 char path[sizeof(SYS_LAYER2) + IF_NAMESIZE]; 231 int n; 232 233 /* Some qeth setups require the use of the broadcast flag. */ 234 snprintf(path, sizeof(path), SYS_LAYER2, ifp->name); 235 n = check_proc_int(path); 236 if (n == -1) 237 return errno == ENOENT ? 0 : -1; 238 if (n == 0) 239 ifp->options->options |= DHCPCD_BROADCAST; 240 return 0; 241 } 242 243 /* XXX work out Virtal Interface Masters */ 244 int 245 if_vimaster(__unused const char *ifname) 246 { 247 248 return 0; 249 } 250 251 static int 252 _open_link_socket(struct sockaddr_nl *nl, int flags, int protocol) 253 { 254 int fd; 255 256 #ifdef SOCK_CLOEXEC 257 if (flags) 258 flags = SOCK_CLOEXEC; 259 fd = socket(AF_NETLINK, SOCK_RAW | flags, protocol); 260 if (fd == -1) 261 return -1; 262 #else 263 fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); 264 if (fd == -1) 265 return -1; 266 if (flags && 267 (flags = fcntl(fd, F_GETFD, 0)) == -1 || 268 fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) 269 { 270 close(fd); 271 return -1; 272 } 273 #endif 274 nl->nl_family = AF_NETLINK; 275 if (bind(fd, (struct sockaddr *)nl, sizeof(*nl)) == -1) { 276 close(fd); 277 return -1; 278 } 279 return fd; 280 } 281 282 int 283 if_openlinksocket(void) 284 { 285 struct sockaddr_nl snl; 286 287 memset(&snl, 0, sizeof(snl)); 288 snl.nl_groups = RTMGRP_LINK; 289 290 #ifdef INET 291 snl.nl_groups |= RTMGRP_IPV4_ROUTE | RTMGRP_IPV4_IFADDR; 292 #endif 293 #ifdef INET6 294 snl.nl_groups |= RTMGRP_IPV6_ROUTE | RTMGRP_IPV6_IFADDR | RTMGRP_NEIGH; 295 #endif 296 297 return _open_link_socket(&snl, 1, NETLINK_ROUTE); 298 } 299 300 static int 301 err_netlink(struct nlmsghdr *nlm) 302 { 303 struct nlmsgerr *err; 304 size_t len; 305 306 if (nlm->nlmsg_type != NLMSG_ERROR) 307 return 0; 308 len = nlm->nlmsg_len - sizeof(*nlm); 309 if (len < sizeof(*err)) { 310 errno = EBADMSG; 311 return -1; 312 } 313 err = (struct nlmsgerr *)NLMSG_DATA(nlm); 314 if (err->error == 0) 315 return (int)len; 316 errno = -err->error; 317 return -1; 318 } 319 320 static int 321 get_netlink(struct dhcpcd_ctx *ctx, struct interface *ifp, int fd, int flags, 322 int (*callback)(struct dhcpcd_ctx *, struct interface *, struct nlmsghdr *)) 323 { 324 char *buf = NULL, *nbuf; 325 ssize_t bytes; 326 size_t buflen; 327 struct nlmsghdr *nlm; 328 struct sockaddr_nl nladdr; 329 socklen_t nladdr_len; 330 int r; 331 332 buflen = 0; 333 r = -1; 334 for (;;) { 335 bytes = recv(fd, NULL, 0, 336 flags | MSG_PEEK | MSG_DONTWAIT | MSG_TRUNC); 337 if (bytes == -1) 338 goto eexit; 339 if ((size_t)bytes == buflen) { 340 /* Support kernels older than 2.6.22 */ 341 if (bytes == 0) 342 bytes = 512; 343 else 344 bytes *= 2; 345 } 346 if (buflen < (size_t)bytes) { 347 /* Alloc 1 more so we work with older kernels */ 348 buflen = (size_t)bytes + 1; 349 nbuf = realloc(buf, buflen); 350 if (nbuf == NULL) 351 goto eexit; 352 buf = nbuf; 353 } 354 nladdr_len = sizeof(nladdr); 355 bytes = recvfrom(fd, buf, buflen, flags, 356 (struct sockaddr *)&nladdr, &nladdr_len); 357 if (bytes == -1 || bytes == 0) 358 goto eexit; 359 360 /* Check sender */ 361 if (nladdr_len != sizeof(nladdr)) { 362 errno = EINVAL; 363 goto eexit; 364 } 365 /* Ignore message if it is not from kernel */ 366 if (nladdr.nl_pid != 0) { 367 r = 0; 368 continue; 369 } 370 371 for (nlm = (struct nlmsghdr *)(void *)buf; 372 nlm && NLMSG_OK(nlm, (size_t)bytes); 373 nlm = NLMSG_NEXT(nlm, bytes)) 374 { 375 r = err_netlink(nlm); 376 if (r == -1) 377 goto eexit; 378 if (r) 379 continue; 380 if (callback) { 381 r = callback(ctx, ifp, nlm); 382 if (r != 0) 383 goto eexit; 384 } 385 } 386 } 387 388 eexit: 389 free(buf); 390 return r; 391 } 392 393 #ifdef INET 394 static int 395 if_copyrt(struct dhcpcd_ctx *ctx, struct rt *rt, struct nlmsghdr *nlm) 396 { 397 size_t len; 398 struct rtmsg *rtm; 399 struct rtattr *rta; 400 struct in_addr prefsrc; 401 402 len = nlm->nlmsg_len - sizeof(*nlm); 403 if (len < sizeof(*rtm)) { 404 errno = EBADMSG; 405 return -1; 406 } 407 rtm = (struct rtmsg *)NLMSG_DATA(nlm); 408 if (rtm->rtm_table != RT_TABLE_MAIN || rtm->rtm_family != AF_INET) 409 return -1; 410 411 memset(rt, 0, sizeof(*rt)); 412 if (rtm->rtm_type == RTN_UNREACHABLE) 413 rt->flags = RTF_REJECT; 414 if (rtm->rtm_scope == RT_SCOPE_HOST) 415 rt->flags |= RTF_HOST; 416 417 prefsrc.s_addr = INADDR_ANY; 418 rta = (struct rtattr *)RTM_RTA(rtm); 419 len = RTM_PAYLOAD(nlm); 420 while (RTA_OK(rta, len)) { 421 switch (rta->rta_type) { 422 case RTA_DST: 423 memcpy(&rt->dest.s_addr, RTA_DATA(rta), 424 sizeof(rt->dest.s_addr)); 425 break; 426 case RTA_GATEWAY: 427 memcpy(&rt->gate.s_addr, RTA_DATA(rta), 428 sizeof(rt->gate.s_addr)); 429 break; 430 case RTA_PREFSRC: 431 memcpy(&prefsrc.s_addr, RTA_DATA(rta), 432 sizeof(prefsrc.s_addr)); 433 break; 434 case RTA_OIF: 435 rt->iface = if_findindex(ctx->ifaces, 436 *(unsigned int *)RTA_DATA(rta)); 437 break; 438 case RTA_PRIORITY: 439 rt->metric = *(unsigned int *)RTA_DATA(rta); 440 break; 441 } 442 rta = RTA_NEXT(rta, len); 443 } 444 445 inet_cidrtoaddr(rtm->rtm_dst_len, &rt->net); 446 if (rt->iface == NULL && prefsrc.s_addr != INADDR_ANY) { 447 struct ipv4_addr *ap; 448 449 /* For some reason the default route comes back with the 450 * loopback interface in RTA_OIF? Lets find it by 451 * preferred source address */ 452 if ((ap = ipv4_findaddr(ctx, &prefsrc))) 453 rt->iface = ap->iface; 454 } 455 return 0; 456 } 457 #endif 458 459 #ifdef INET6 460 static int 461 if_copyrt6(struct dhcpcd_ctx *ctx, struct rt6 *rt, struct nlmsghdr *nlm) 462 { 463 size_t len; 464 struct rtmsg *rtm; 465 struct rtattr *rta; 466 467 len = nlm->nlmsg_len - sizeof(*nlm); 468 if (len < sizeof(*rtm)) { 469 errno = EBADMSG; 470 return -1; 471 } 472 rtm = (struct rtmsg *)NLMSG_DATA(nlm); 473 if (rtm->rtm_table != RT_TABLE_MAIN || rtm->rtm_family != AF_INET6) 474 return -1; 475 476 memset(rt, 0, sizeof(*rt)); 477 if (rtm->rtm_type == RTN_UNREACHABLE) 478 rt->flags = RTF_REJECT; 479 if (rtm->rtm_scope == RT_SCOPE_HOST) 480 rt->flags |= RTF_HOST; 481 ipv6_mask(&rt->net, rtm->rtm_dst_len); 482 483 rta = (struct rtattr *)RTM_RTA(rtm); 484 len = RTM_PAYLOAD(nlm); 485 while (RTA_OK(rta, len)) { 486 switch (rta->rta_type) { 487 case RTA_DST: 488 memcpy(&rt->dest.s6_addr, RTA_DATA(rta), 489 sizeof(rt->dest.s6_addr)); 490 break; 491 case RTA_GATEWAY: 492 memcpy(&rt->gate.s6_addr, RTA_DATA(rta), 493 sizeof(rt->gate.s6_addr)); 494 break; 495 case RTA_OIF: 496 rt->iface = if_findindex(ctx->ifaces, 497 *(unsigned int *)RTA_DATA(rta)); 498 break; 499 case RTA_PRIORITY: 500 rt->metric = *(unsigned int *)RTA_DATA(rta); 501 break; 502 } 503 rta = RTA_NEXT(rta, len); 504 } 505 506 return 0; 507 } 508 #endif 509 510 /* Work out the maximum pid size */ 511 static inline long long 512 get_max_pid_t() 513 { 514 515 if (sizeof(pid_t) == sizeof(short)) return SHRT_MAX; 516 if (sizeof(pid_t) == sizeof(int)) return INT_MAX; 517 if (sizeof(pid_t) == sizeof(long)) return LONG_MAX; 518 if (sizeof(pid_t) == sizeof(long long)) return LLONG_MAX; 519 abort(); 520 } 521 522 static int 523 link_route(struct dhcpcd_ctx *ctx, __unused struct interface *ifp, 524 struct nlmsghdr *nlm) 525 { 526 size_t len; 527 struct rtmsg *rtm; 528 int cmd; 529 #ifdef INET 530 struct rt rt; 531 #endif 532 #ifdef INET6 533 struct rt6 rt6; 534 #endif 535 switch (nlm->nlmsg_type) { 536 case RTM_NEWROUTE: 537 cmd = RTM_ADD; 538 break; 539 case RTM_DELROUTE: 540 cmd = RTM_DELETE; 541 break; 542 default: 543 return 0; 544 } 545 546 len = nlm->nlmsg_len - sizeof(*nlm); 547 if (len < sizeof(*rtm)) { 548 errno = EBADMSG; 549 return -1; 550 } 551 552 /* Ignore messages generated by us. 553 * For some reason we get messages generated by us 554 * with a very large value in nlmsg_pid that seems to be 555 * sequentially changing. Is there a better test for this? */ 556 if (nlm->nlmsg_pid > get_max_pid_t()) 557 return 1; 558 559 rtm = NLMSG_DATA(nlm); 560 switch (rtm->rtm_family) { 561 #ifdef INET 562 case AF_INET: 563 if (if_copyrt(ctx, &rt, nlm) == 0) 564 ipv4_handlert(ctx, cmd, &rt); 565 break; 566 #endif 567 #ifdef INET6 568 case AF_INET6: 569 if (if_copyrt6(ctx, &rt6, nlm) == 0) 570 ipv6_handlert(ctx, cmd, &rt6); 571 break; 572 #endif 573 } 574 575 return 0; 576 } 577 578 static int 579 link_addr(struct dhcpcd_ctx *ctx, struct interface *ifp, struct nlmsghdr *nlm) 580 { 581 size_t len; 582 struct rtattr *rta; 583 struct ifaddrmsg *ifa; 584 #ifdef INET 585 struct in_addr addr, net, dest; 586 #endif 587 #ifdef INET6 588 struct in6_addr addr6; 589 #endif 590 591 if (nlm->nlmsg_type != RTM_DELADDR && nlm->nlmsg_type != RTM_NEWADDR) 592 return 0; 593 594 len = nlm->nlmsg_len - sizeof(*nlm); 595 if (len < sizeof(*ifa)) { 596 errno = EBADMSG; 597 return -1; 598 } 599 ifa = NLMSG_DATA(nlm); 600 if ((ifp = if_findindex(ctx->ifaces, ifa->ifa_index)) == NULL) { 601 /* We don't know about the interface the address is for 602 * so it's not really an error */ 603 return 1; 604 } 605 rta = (struct rtattr *)IFA_RTA(ifa); 606 len = NLMSG_PAYLOAD(nlm, sizeof(*ifa)); 607 switch (ifa->ifa_family) { 608 #ifdef INET 609 case AF_INET: 610 addr.s_addr = dest.s_addr = INADDR_ANY; 611 dest.s_addr = INADDR_ANY; 612 inet_cidrtoaddr(ifa->ifa_prefixlen, &net); 613 while (RTA_OK(rta, len)) { 614 switch (rta->rta_type) { 615 case IFA_ADDRESS: 616 if (ifp->flags & IFF_POINTOPOINT) { 617 memcpy(&dest.s_addr, RTA_DATA(rta), 618 sizeof(addr.s_addr)); 619 } 620 break; 621 case IFA_LOCAL: 622 memcpy(&addr.s_addr, RTA_DATA(rta), 623 sizeof(addr.s_addr)); 624 break; 625 } 626 rta = RTA_NEXT(rta, len); 627 } 628 ipv4_handleifa(ctx, nlm->nlmsg_type, NULL, ifp->name, 629 &addr, &net, &dest, ifa->ifa_flags); 630 break; 631 #endif 632 #ifdef INET6 633 case AF_INET6: 634 memset(&addr6, 0, sizeof(addr6)); 635 while (RTA_OK(rta, len)) { 636 switch (rta->rta_type) { 637 case IFA_ADDRESS: 638 memcpy(&addr6.s6_addr, RTA_DATA(rta), 639 sizeof(addr6.s6_addr)); 640 break; 641 } 642 rta = RTA_NEXT(rta, len); 643 } 644 ipv6_handleifa(ctx, nlm->nlmsg_type, NULL, ifp->name, 645 &addr6, ifa->ifa_prefixlen, ifa->ifa_flags); 646 break; 647 #endif 648 } 649 return 0; 650 } 651 652 static uint8_t 653 l2addr_len(unsigned short if_type) 654 { 655 656 switch (if_type) { 657 case ARPHRD_ETHER: /* FALLTHROUGH */ 658 case ARPHRD_IEEE802: /*FALLTHROUGH */ 659 case ARPHRD_IEEE80211: 660 return 6; 661 case ARPHRD_IEEE1394: 662 return 8; 663 case ARPHRD_INFINIBAND: 664 return 20; 665 } 666 667 /* Impossible */ 668 return 0; 669 } 670 671 static int 672 handle_rename(struct dhcpcd_ctx *ctx, unsigned int ifindex, const char *ifname) 673 { 674 struct interface *ifp; 675 676 TAILQ_FOREACH(ifp, ctx->ifaces, next) { 677 if (ifp->index == ifindex && strcmp(ifp->name, ifname)) { 678 dhcpcd_handleinterface(ctx, -1, ifp->name); 679 /* Let dev announce the interface for renaming */ 680 if (!dev_listening(ctx)) 681 dhcpcd_handleinterface(ctx, 1, ifname); 682 return 1; 683 } 684 } 685 return 0; 686 } 687 688 #ifdef INET6 689 static int 690 link_neigh(struct dhcpcd_ctx *ctx, __unused struct interface *ifp, 691 struct nlmsghdr *nlm) 692 { 693 struct ndmsg *r; 694 struct rtattr *rta; 695 size_t len; 696 struct in6_addr addr6; 697 int flags; 698 699 if (nlm->nlmsg_type != RTM_NEWNEIGH && nlm->nlmsg_type != RTM_DELNEIGH) 700 return 0; 701 if (nlm->nlmsg_len < sizeof(*r)) 702 return -1; 703 704 r = NLMSG_DATA(nlm); 705 rta = (struct rtattr *)RTM_RTA(r); 706 len = RTM_PAYLOAD(nlm); 707 if (r->ndm_family == AF_INET6) { 708 flags = 0; 709 if (r->ndm_flags & NTF_ROUTER) 710 flags |= IPV6ND_ROUTER; 711 if (nlm->nlmsg_type == RTM_NEWNEIGH && 712 r->ndm_state & 713 (NUD_REACHABLE | NUD_STALE | NUD_DELAY | NUD_PROBE | 714 NUD_PERMANENT)) 715 flags |= IPV6ND_REACHABLE; 716 memset(&addr6, 0, sizeof(addr6)); 717 while (RTA_OK(rta, len)) { 718 switch (rta->rta_type) { 719 case NDA_DST: 720 memcpy(&addr6.s6_addr, RTA_DATA(rta), 721 sizeof(addr6.s6_addr)); 722 break; 723 } 724 rta = RTA_NEXT(rta, len); 725 } 726 ipv6nd_neighbour(ctx, &addr6, flags); 727 } 728 729 return 0; 730 } 731 #endif 732 733 static int 734 link_netlink(struct dhcpcd_ctx *ctx, struct interface *ifp, 735 struct nlmsghdr *nlm) 736 { 737 int r; 738 size_t len; 739 struct rtattr *rta, *hwaddr; 740 struct ifinfomsg *ifi; 741 char ifn[IF_NAMESIZE + 1]; 742 743 r = link_route(ctx, ifp, nlm); 744 if (r != 0) 745 return r; 746 r = link_addr(ctx, ifp, nlm); 747 if (r != 0) 748 return r; 749 #ifdef INET6 750 r = link_neigh(ctx, ifp, nlm); 751 if (r != 0) 752 return r; 753 #endif 754 755 if (nlm->nlmsg_type != RTM_NEWLINK && nlm->nlmsg_type != RTM_DELLINK) 756 return 0; 757 len = nlm->nlmsg_len - sizeof(*nlm); 758 if ((size_t)len < sizeof(*ifi)) { 759 errno = EBADMSG; 760 return -1; 761 } 762 ifi = NLMSG_DATA(nlm); 763 if (ifi->ifi_flags & IFF_LOOPBACK) 764 return 0; 765 rta = (struct rtattr *)(void *)((char *)ifi +NLMSG_ALIGN(sizeof(*ifi))); 766 len = NLMSG_PAYLOAD(nlm, sizeof(*ifi)); 767 *ifn = '\0'; 768 hwaddr = NULL; 769 770 while (RTA_OK(rta, len)) { 771 switch (rta->rta_type) { 772 case IFLA_WIRELESS: 773 /* Ignore wireless messages */ 774 if (nlm->nlmsg_type == RTM_NEWLINK && 775 ifi->ifi_change == 0) 776 return 0; 777 break; 778 case IFLA_IFNAME: 779 strlcpy(ifn, RTA_DATA(rta), sizeof(ifn)); 780 break; 781 case IFLA_ADDRESS: 782 hwaddr = rta; 783 break; 784 } 785 rta = RTA_NEXT(rta, len); 786 } 787 788 if (nlm->nlmsg_type == RTM_DELLINK) { 789 dhcpcd_handleinterface(ctx, -1, ifn); 790 return 0; 791 } 792 793 /* Virtual interfaces may not get a valid hardware address 794 * at this point. 795 * To trigger a valid hardware address pickup we need to pretend 796 * that that don't exist until they have one. */ 797 if (ifi->ifi_flags & IFF_MASTER && !hwaddr) { 798 dhcpcd_handleinterface(ctx, -1, ifn); 799 return 0; 800 } 801 802 /* Check for interface name change */ 803 if (handle_rename(ctx, (unsigned int)ifi->ifi_index, ifn)) 804 return 0; 805 806 /* Check for a new interface */ 807 if ((ifp = if_find(ctx->ifaces, ifn)) == NULL) { 808 /* If are listening to a dev manager, let that announce 809 * the interface rather than the kernel. */ 810 if (dev_listening(ctx) < 1) 811 dhcpcd_handleinterface(ctx, 1, ifn); 812 return 0; 813 } 814 815 /* Re-read hardware address and friends */ 816 if (!(ifi->ifi_flags & IFF_UP) && hwaddr) { 817 uint8_t l; 818 819 l = l2addr_len(ifi->ifi_type); 820 if (hwaddr->rta_len == RTA_LENGTH(l)) 821 dhcpcd_handlehwaddr(ctx, ifn, RTA_DATA(hwaddr), l); 822 } 823 824 dhcpcd_handlecarrier(ctx, 825 ifi->ifi_flags & IFF_RUNNING ? LINK_UP : LINK_DOWN, 826 ifi->ifi_flags, ifn); 827 return 0; 828 } 829 830 int 831 if_managelink(struct dhcpcd_ctx *ctx) 832 { 833 834 return get_netlink(ctx, NULL, 835 ctx->link_fd, MSG_DONTWAIT, &link_netlink); 836 } 837 838 static int 839 send_netlink(struct dhcpcd_ctx *ctx, struct interface *ifp, 840 int protocol, struct nlmsghdr *hdr, 841 int (*callback)(struct dhcpcd_ctx *, struct interface *, struct nlmsghdr *)) 842 { 843 int s, r; 844 struct sockaddr_nl snl; 845 struct iovec iov; 846 struct msghdr msg; 847 static unsigned int seq; 848 849 memset(&snl, 0, sizeof(snl)); 850 if ((s = _open_link_socket(&snl, 0, protocol)) == -1) 851 return -1; 852 memset(&iov, 0, sizeof(iov)); 853 iov.iov_base = hdr; 854 iov.iov_len = hdr->nlmsg_len; 855 memset(&msg, 0, sizeof(msg)); 856 msg.msg_name = &snl; 857 msg.msg_namelen = sizeof(snl); 858 msg.msg_iov = &iov; 859 msg.msg_iovlen = 1; 860 /* Request a reply */ 861 hdr->nlmsg_flags |= NLM_F_ACK; 862 hdr->nlmsg_seq = ++seq; 863 864 if (sendmsg(s, &msg, 0) != -1) 865 r = get_netlink(ctx, ifp, s, 0, callback); 866 else 867 r = -1; 868 close(s); 869 return r; 870 } 871 872 #define NLMSG_TAIL(nmsg) \ 873 ((struct rtattr *)(((ptrdiff_t)(nmsg))+NLMSG_ALIGN((nmsg)->nlmsg_len))) 874 875 static int 876 add_attr_l(struct nlmsghdr *n, unsigned short maxlen, unsigned short type, 877 const void *data, unsigned short alen) 878 { 879 unsigned short len = (unsigned short)RTA_LENGTH(alen); 880 struct rtattr *rta; 881 882 if (NLMSG_ALIGN(n->nlmsg_len) + RTA_ALIGN(len) > maxlen) { 883 errno = ENOBUFS; 884 return -1; 885 } 886 887 rta = NLMSG_TAIL(n); 888 rta->rta_type = type; 889 rta->rta_len = len; 890 if (alen) 891 memcpy(RTA_DATA(rta), data, alen); 892 n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + RTA_ALIGN(len); 893 894 return 0; 895 } 896 897 static int 898 add_attr_32(struct nlmsghdr *n, unsigned short maxlen, unsigned short type, 899 uint32_t data) 900 { 901 unsigned short len = RTA_LENGTH(sizeof(data)); 902 struct rtattr *rta; 903 904 if (NLMSG_ALIGN(n->nlmsg_len) + len > maxlen) { 905 errno = ENOBUFS; 906 return -1; 907 } 908 909 rta = NLMSG_TAIL(n); 910 rta->rta_type = type; 911 rta->rta_len = len; 912 memcpy(RTA_DATA(rta), &data, sizeof(data)); 913 n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + len; 914 915 return 0; 916 } 917 918 #ifdef HAVE_NL80211_H 919 static struct nlattr * 920 nla_next(struct nlattr *nla, size_t *rem) 921 { 922 923 *rem -= NLA_ALIGN(nla->nla_len); 924 return (struct nlattr *)(void *)((char *)nla + NLA_ALIGN(nla->nla_len)); 925 } 926 927 #define NLA_TYPE(nla) ((nla)->nla_type & NLA_TYPE_MASK) 928 #define NLA_LEN(nla) (unsigned int)((nla)->nla_len - NLA_HDRLEN) 929 #define NLA_OK(nla, rem) \ 930 ((rem) >= sizeof(struct nlattr) && \ 931 (nla)->nla_len >= sizeof(struct nlattr) && \ 932 (nla)->nla_len <= rem) 933 #define NLA_DATA(nla) ((char *)(nla) + NLA_HDRLEN) 934 #define NLA_FOR_EACH_ATTR(pos, head, len, rem) \ 935 for (pos = head, rem = len; NLA_OK(pos, rem); pos = nla_next(pos, &(rem))) 936 937 struct nlmg 938 { 939 struct nlmsghdr hdr; 940 struct genlmsghdr ghdr; 941 char buffer[64]; 942 }; 943 944 static int 945 nla_put_32(struct nlmsghdr *n, unsigned short maxlen, 946 unsigned short type, uint32_t data) 947 { 948 unsigned short len; 949 struct nlattr *nla; 950 951 len = NLA_ALIGN(NLA_HDRLEN + sizeof(data)); 952 if (NLMSG_ALIGN(n->nlmsg_len) + len > maxlen) { 953 errno = ENOBUFS; 954 return -1; 955 } 956 957 nla = (struct nlattr *)NLMSG_TAIL(n); 958 nla->nla_type = type; 959 nla->nla_len = len; 960 memcpy(NLA_DATA(nla), &data, sizeof(data)); 961 n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + len; 962 963 return 0; 964 } 965 966 static int 967 nla_put_string(struct nlmsghdr *n, unsigned short maxlen, 968 unsigned short type, const char *data) 969 { 970 struct nlattr *nla; 971 size_t len, sl; 972 973 sl = strlen(data) + 1; 974 len = NLA_ALIGN(NLA_HDRLEN + sl); 975 if (NLMSG_ALIGN(n->nlmsg_len) + len > maxlen) { 976 errno = ENOBUFS; 977 return -1; 978 } 979 980 nla = (struct nlattr *)NLMSG_TAIL(n); 981 nla->nla_type = type; 982 nla->nla_len = (unsigned short)len; 983 memcpy(NLA_DATA(nla), data, sl); 984 n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + (unsigned short)len; 985 return 0; 986 } 987 988 static int 989 gnl_parse(struct nlmsghdr *nlm, struct nlattr *tb[], int maxtype) 990 { 991 struct genlmsghdr *ghdr; 992 struct nlattr *head, *nla; 993 size_t len, rem; 994 int type; 995 996 memset(tb, 0, sizeof(*tb) * ((unsigned int)maxtype + 1)); 997 ghdr = NLMSG_DATA(nlm); 998 head = (struct nlattr *)(void *)((char *) ghdr + GENL_HDRLEN); 999 len = nlm->nlmsg_len - GENL_HDRLEN - NLMSG_HDRLEN; 1000 NLA_FOR_EACH_ATTR(nla, head, len, rem) { 1001 type = NLA_TYPE(nla); 1002 if (type > maxtype) 1003 continue; 1004 tb[type] = nla; 1005 } 1006 return 0; 1007 } 1008 1009 static int 1010 _gnl_getfamily(__unused struct dhcpcd_ctx *ctx, __unused struct interface *ifp, 1011 struct nlmsghdr *nlm) 1012 { 1013 struct nlattr *tb[CTRL_ATTR_FAMILY_ID + 1]; 1014 uint16_t family; 1015 1016 if (gnl_parse(nlm, tb, CTRL_ATTR_FAMILY_ID) == -1) 1017 return -1; 1018 if (tb[CTRL_ATTR_FAMILY_ID] == NULL) { 1019 errno = ENOENT; 1020 return -1; 1021 } 1022 family = *(uint16_t *)(void *)NLA_DATA(tb[CTRL_ATTR_FAMILY_ID]); 1023 return (int)family; 1024 } 1025 1026 static int 1027 gnl_getfamily(struct dhcpcd_ctx *ctx, const char *name) 1028 { 1029 struct nlmg nlm; 1030 1031 memset(&nlm, 0, sizeof(nlm)); 1032 nlm.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct genlmsghdr)); 1033 nlm.hdr.nlmsg_type = GENL_ID_CTRL; 1034 nlm.hdr.nlmsg_flags = NLM_F_REQUEST; 1035 nlm.ghdr.cmd = CTRL_CMD_GETFAMILY; 1036 nlm.ghdr.version = 1; 1037 if (nla_put_string(&nlm.hdr, sizeof(nlm), 1038 CTRL_ATTR_FAMILY_NAME, name) == -1) 1039 return -1; 1040 return send_netlink(ctx, NULL, NETLINK_GENERIC, &nlm.hdr, 1041 &_gnl_getfamily); 1042 } 1043 1044 static int 1045 _if_getssid(__unused struct dhcpcd_ctx *ctx, struct interface *ifp, 1046 struct nlmsghdr *nlm) 1047 { 1048 struct nlattr *tb[NL80211_ATTR_SSID + 1]; 1049 1050 if (gnl_parse(nlm, tb, NL80211_ATTR_SSID) == -1) 1051 return -1; 1052 1053 if (tb[NL80211_ATTR_SSID] == NULL) { 1054 /* If the SSID is not found then it means that 1055 * we're not associated to an AP. */ 1056 ifp->ssid_len = 0; 1057 goto out; 1058 } 1059 1060 ifp->ssid_len = NLA_LEN(tb[NL80211_ATTR_SSID]); 1061 if (ifp->ssid_len > sizeof(ifp->ssid)) { 1062 errno = ENOBUFS; 1063 ifp->ssid_len = 0; 1064 return -1; 1065 } 1066 memcpy(ifp->ssid, NLA_DATA(tb[NL80211_ATTR_SSID]), ifp->ssid_len); 1067 1068 out: 1069 ifp->ssid[ifp->ssid_len] = '\0'; 1070 return (int)ifp->ssid_len; 1071 } 1072 1073 static int 1074 if_getssid_nl80211(struct interface *ifp) 1075 { 1076 int family; 1077 struct nlmg nlm; 1078 1079 errno = 0; 1080 family = gnl_getfamily(ifp->ctx, "nl80211"); 1081 if (family == -1) 1082 return -1; 1083 memset(&nlm, 0, sizeof(nlm)); 1084 nlm.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct genlmsghdr)); 1085 nlm.hdr.nlmsg_type = (unsigned short)family; 1086 nlm.hdr.nlmsg_flags = NLM_F_REQUEST; 1087 nlm.ghdr.cmd = NL80211_CMD_GET_INTERFACE; 1088 nla_put_32(&nlm.hdr, sizeof(nlm), NL80211_ATTR_IFINDEX, ifp->index); 1089 1090 return send_netlink(ifp->ctx, ifp, 1091 NETLINK_GENERIC, &nlm.hdr, &_if_getssid); 1092 } 1093 #endif 1094 1095 int 1096 if_getssid(struct interface *ifp) 1097 { 1098 int r; 1099 1100 r = if_getssid_wext(ifp->name, ifp->ssid); 1101 if (r != -1) 1102 ifp->ssid_len = (unsigned int)r; 1103 #ifdef HAVE_NL80211_H 1104 else if (r == -1) 1105 r = if_getssid_nl80211(ifp); 1106 #endif 1107 return r; 1108 } 1109 1110 struct nlma 1111 { 1112 struct nlmsghdr hdr; 1113 struct ifaddrmsg ifa; 1114 char buffer[64]; 1115 }; 1116 1117 struct nlmr 1118 { 1119 struct nlmsghdr hdr; 1120 struct rtmsg rt; 1121 char buffer[256]; 1122 }; 1123 1124 #ifdef INET 1125 const char *if_pfname = "Packet Socket"; 1126 1127 int 1128 if_openrawsocket(struct interface *ifp, uint16_t protocol) 1129 { 1130 int s; 1131 union sockunion { 1132 struct sockaddr sa; 1133 struct sockaddr_ll sll; 1134 struct sockaddr_storage ss; 1135 } su; 1136 struct sock_fprog pf; 1137 #ifdef PACKET_AUXDATA 1138 int n; 1139 #endif 1140 1141 #ifdef SOCK_CLOEXEC 1142 if ((s = socket(PF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 1143 htons(protocol))) == -1) 1144 return -1; 1145 #else 1146 int flags; 1147 1148 if ((s = socket(PF_PACKET, SOCK_DGRAM, htons(protocol))) == -1) 1149 return -1; 1150 if ((flags = fcntl(s, F_GETFD, 0)) == -1 || 1151 fcntl(s, F_SETFD, flags | FD_CLOEXEC) == -1) 1152 { 1153 close(s); 1154 return -1; 1155 } 1156 if ((flags = fcntl(s, F_GETFL, 0)) == -1 || 1157 fcntl(s, F_SETFL, flags | O_NONBLOCK) == -1) 1158 { 1159 close(s); 1160 return -1; 1161 } 1162 #endif 1163 /* Install the DHCP filter */ 1164 memset(&pf, 0, sizeof(pf)); 1165 if (protocol == ETHERTYPE_ARP) { 1166 pf.filter = UNCONST(arp_bpf_filter); 1167 pf.len = arp_bpf_filter_len; 1168 } else { 1169 pf.filter = UNCONST(dhcp_bpf_filter); 1170 pf.len = dhcp_bpf_filter_len; 1171 } 1172 if (setsockopt(s, SOL_SOCKET, SO_ATTACH_FILTER, &pf, sizeof(pf)) != 0) 1173 goto eexit; 1174 #ifdef PACKET_AUXDATA 1175 n = 1; 1176 if (setsockopt(s, SOL_PACKET, PACKET_AUXDATA, &n, sizeof(n)) != 0) { 1177 if (errno != ENOPROTOOPT) 1178 goto eexit; 1179 } 1180 #endif 1181 1182 memset(&su, 0, sizeof(su)); 1183 su.sll.sll_family = PF_PACKET; 1184 su.sll.sll_protocol = htons(protocol); 1185 su.sll.sll_ifindex = (int)ifp->index; 1186 if (bind(s, &su.sa, sizeof(su.sll)) == -1) 1187 goto eexit; 1188 return s; 1189 1190 eexit: 1191 close(s); 1192 return -1; 1193 } 1194 1195 ssize_t 1196 if_sendrawpacket(const struct interface *ifp, uint16_t protocol, 1197 const void *data, size_t len, const uint8_t *dest_hw_addr) 1198 { 1199 const struct dhcp_state *state; 1200 union sockunion { 1201 struct sockaddr sa; 1202 struct sockaddr_ll sll; 1203 struct sockaddr_storage ss; 1204 } su; 1205 int fd; 1206 1207 memset(&su, 0, sizeof(su)); 1208 su.sll.sll_family = AF_PACKET; 1209 su.sll.sll_protocol = htons(protocol); 1210 su.sll.sll_ifindex = (int)ifp->index; 1211 su.sll.sll_hatype = htons(ifp->family); 1212 su.sll.sll_halen = (unsigned char)ifp->hwlen; 1213 if (ifp->family == ARPHRD_INFINIBAND) 1214 memcpy(&su.sll.sll_addr, 1215 &ipv4_bcast_addr, sizeof(ipv4_bcast_addr)); 1216 else { 1217 if (dest_hw_addr) 1218 memcpy(&su.sll.sll_addr, dest_hw_addr, ifp->hwlen); 1219 else 1220 memset(&su.sll.sll_addr, 0xff, ifp->hwlen); 1221 } 1222 state = D_CSTATE(ifp); 1223 if (protocol == ETHERTYPE_ARP) 1224 fd = state->arp_fd; 1225 else 1226 fd = state->raw_fd; 1227 1228 return sendto(fd, data, len, 0, &su.sa, sizeof(su.sll)); 1229 } 1230 1231 ssize_t 1232 if_readrawpacket(struct interface *ifp, uint16_t protocol, 1233 void *data, size_t len, int *flags) 1234 { 1235 struct iovec iov = { 1236 .iov_base = data, 1237 .iov_len = len, 1238 }; 1239 struct msghdr msg = { 1240 .msg_iov = &iov, 1241 .msg_iovlen = 1, 1242 }; 1243 struct dhcp_state *state; 1244 #ifdef PACKET_AUXDATA 1245 unsigned char cmsgbuf[CMSG_LEN(sizeof(struct tpacket_auxdata))]; 1246 struct cmsghdr *cmsg; 1247 struct tpacket_auxdata *aux; 1248 #endif 1249 1250 ssize_t bytes; 1251 int fd = -1; 1252 1253 #ifdef PACKET_AUXDATA 1254 msg.msg_control = cmsgbuf; 1255 msg.msg_controllen = sizeof(cmsgbuf); 1256 #endif 1257 1258 state = D_STATE(ifp); 1259 if (protocol == ETHERTYPE_ARP) 1260 fd = state->arp_fd; 1261 else 1262 fd = state->raw_fd; 1263 bytes = recvmsg(fd, &msg, 0); 1264 if (bytes == -1) 1265 return -1; 1266 *flags = RAW_EOF; /* We only ever read one packet */ 1267 if (bytes) { 1268 #ifdef PACKET_AUXDATA 1269 for (cmsg = CMSG_FIRSTHDR(&msg); 1270 cmsg; 1271 cmsg = CMSG_NXTHDR(&msg, cmsg)) 1272 { 1273 if (cmsg->cmsg_level == SOL_PACKET && 1274 cmsg->cmsg_type == PACKET_AUXDATA) { 1275 aux = (void *)CMSG_DATA(cmsg); 1276 if (aux->tp_status & TP_STATUS_CSUMNOTREADY) 1277 *flags |= RAW_PARTIALCSUM; 1278 } 1279 } 1280 #endif 1281 } 1282 return bytes; 1283 } 1284 1285 int 1286 if_address(const struct interface *iface, 1287 const struct in_addr *address, const struct in_addr *netmask, 1288 const struct in_addr *broadcast, int action) 1289 { 1290 struct nlma nlm; 1291 int retval = 0; 1292 1293 memset(&nlm, 0, sizeof(nlm)); 1294 nlm.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg)); 1295 nlm.hdr.nlmsg_flags = NLM_F_REQUEST; 1296 if (action >= 0) { 1297 nlm.hdr.nlmsg_flags |= NLM_F_CREATE | NLM_F_REPLACE; 1298 nlm.hdr.nlmsg_type = RTM_NEWADDR; 1299 } else 1300 nlm.hdr.nlmsg_type = RTM_DELADDR; 1301 nlm.ifa.ifa_index = iface->index; 1302 nlm.ifa.ifa_family = AF_INET; 1303 nlm.ifa.ifa_prefixlen = inet_ntocidr(*netmask); 1304 /* This creates the aliased interface */ 1305 add_attr_l(&nlm.hdr, sizeof(nlm), IFA_LABEL, 1306 iface->alias, (unsigned short)(strlen(iface->alias) + 1)); 1307 add_attr_l(&nlm.hdr, sizeof(nlm), IFA_LOCAL, 1308 &address->s_addr, sizeof(address->s_addr)); 1309 if (action >= 0 && broadcast) 1310 add_attr_l(&nlm.hdr, sizeof(nlm), IFA_BROADCAST, 1311 &broadcast->s_addr, sizeof(broadcast->s_addr)); 1312 1313 if (send_netlink(iface->ctx, NULL, NETLINK_ROUTE, &nlm.hdr, NULL) == -1) 1314 retval = -1; 1315 return retval; 1316 } 1317 1318 int 1319 if_route(unsigned char cmd, const struct rt *rt) 1320 { 1321 struct nlmr nlm; 1322 int retval = 0; 1323 struct dhcp_state *state; 1324 1325 memset(&nlm, 0, sizeof(nlm)); 1326 nlm.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); 1327 switch (cmd) { 1328 case RTM_CHANGE: 1329 nlm.hdr.nlmsg_type = RTM_NEWROUTE; 1330 nlm.hdr.nlmsg_flags = NLM_F_CREATE | NLM_F_REPLACE; 1331 break; 1332 case RTM_ADD: 1333 nlm.hdr.nlmsg_type = RTM_NEWROUTE; 1334 nlm.hdr.nlmsg_flags = NLM_F_CREATE | NLM_F_EXCL; 1335 break; 1336 case RTM_DELETE: 1337 nlm.hdr.nlmsg_type = RTM_DELROUTE; 1338 break; 1339 } 1340 nlm.hdr.nlmsg_flags |= NLM_F_REQUEST; 1341 nlm.rt.rtm_family = AF_INET; 1342 nlm.rt.rtm_table = RT_TABLE_MAIN; 1343 1344 state = D_STATE(rt->iface); 1345 if (cmd == RTM_DELETE) 1346 nlm.rt.rtm_scope = RT_SCOPE_NOWHERE; 1347 else { 1348 /* We only change route metrics for kernel routes */ 1349 if (rt->dest.s_addr == 1350 (state->addr.s_addr & state->net.s_addr) && 1351 rt->net.s_addr == state->net.s_addr) 1352 nlm.rt.rtm_protocol = RTPROT_KERNEL; 1353 else 1354 nlm.rt.rtm_protocol = RTPROT_BOOT; 1355 if (rt->iface->flags & IFF_LOOPBACK) 1356 nlm.rt.rtm_scope = RT_SCOPE_HOST; 1357 else if (rt->gate.s_addr == INADDR_ANY || 1358 (rt->gate.s_addr == rt->dest.s_addr && 1359 rt->net.s_addr == INADDR_BROADCAST)) 1360 nlm.rt.rtm_scope = RT_SCOPE_LINK; 1361 else 1362 nlm.rt.rtm_scope = RT_SCOPE_UNIVERSE; 1363 nlm.rt.rtm_type = RTN_UNICAST; 1364 } 1365 1366 nlm.rt.rtm_dst_len = inet_ntocidr(rt->net); 1367 add_attr_l(&nlm.hdr, sizeof(nlm), RTA_DST, 1368 &rt->dest.s_addr, sizeof(rt->dest.s_addr)); 1369 if (nlm.rt.rtm_protocol == RTPROT_KERNEL) { 1370 add_attr_l(&nlm.hdr, sizeof(nlm), RTA_PREFSRC, 1371 &state->addr.s_addr, sizeof(state->addr.s_addr)); 1372 } 1373 /* If a host route then don't add the gateway */ 1374 if ((cmd == RTM_ADD || cmd == RTM_CHANGE) && 1375 rt->net.s_addr != INADDR_BROADCAST) 1376 add_attr_l(&nlm.hdr, sizeof(nlm), RTA_GATEWAY, 1377 &rt->gate.s_addr, sizeof(rt->gate.s_addr)); 1378 1379 if (rt->gate.s_addr != htonl(INADDR_LOOPBACK)) 1380 add_attr_32(&nlm.hdr, sizeof(nlm), RTA_OIF, rt->iface->index); 1381 if (rt->metric) 1382 add_attr_32(&nlm.hdr, sizeof(nlm), RTA_PRIORITY, rt->metric); 1383 1384 if (send_netlink(rt->iface->ctx, NULL, 1385 NETLINK_ROUTE, &nlm.hdr, NULL) == -1) 1386 retval = -1; 1387 return retval; 1388 } 1389 1390 static int 1391 _if_initrt(struct dhcpcd_ctx *ctx, __unused struct interface *ifp, 1392 struct nlmsghdr *nlm) 1393 { 1394 struct rt rt; 1395 1396 if (if_copyrt(ctx, &rt, nlm) == 0) 1397 ipv4_handlert(ctx, RTM_ADD, &rt); 1398 return 0; 1399 } 1400 1401 int 1402 if_initrt(struct interface *ifp) 1403 { 1404 struct nlmr nlm; 1405 1406 ipv4_freerts(ifp->ctx->ipv4_kroutes); 1407 1408 memset(&nlm, 0, sizeof(nlm)); 1409 nlm.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); 1410 nlm.hdr.nlmsg_type = RTM_GETROUTE; 1411 nlm.hdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_MATCH; 1412 nlm.hdr.nlmsg_flags |= NLM_F_REQUEST; 1413 nlm.rt.rtm_family = AF_INET; 1414 nlm.rt.rtm_table = RT_TABLE_MAIN; 1415 add_attr_32(&nlm.hdr, sizeof(nlm), RTA_OIF, ifp->index); 1416 1417 return send_netlink(ifp->ctx, ifp, 1418 NETLINK_ROUTE, &nlm.hdr, &_if_initrt); 1419 } 1420 1421 int 1422 if_addrflags(__unused const struct in_addr *addr, 1423 __unused const struct interface *ifp) 1424 { 1425 1426 /* Linux has no support for IPv4 address flags */ 1427 return 0; 1428 } 1429 #endif 1430 1431 #ifdef INET6 1432 int 1433 if_address6(const struct ipv6_addr *ap, int action) 1434 { 1435 struct nlma nlm; 1436 struct ifa_cacheinfo cinfo; 1437 int retval = 0; 1438 /* IFA_FLAGS is not a define, but is was added at the same time 1439 * IFA_F_NOPREFIXROUTE was do use that. */ 1440 #if defined(IFA_F_NOPREFIXROUTE) || defined(IFA_F_MANAGETEMPADDR) 1441 uint32_t flags = 0; 1442 #endif 1443 1444 memset(&nlm, 0, sizeof(nlm)); 1445 nlm.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg)); 1446 nlm.hdr.nlmsg_flags = NLM_F_REQUEST; 1447 if (action >= 0) { 1448 nlm.hdr.nlmsg_flags |= NLM_F_CREATE | NLM_F_REPLACE; 1449 nlm.hdr.nlmsg_type = RTM_NEWADDR; 1450 } else 1451 nlm.hdr.nlmsg_type = RTM_DELADDR; 1452 nlm.ifa.ifa_index = ap->iface->index; 1453 nlm.ifa.ifa_family = AF_INET6; 1454 if (ap->addr_flags & IFA_F_TEMPORARY) { 1455 #ifdef IFA_F_NOPREFIXROUTE 1456 flags |= IFA_F_TEMPORARY; 1457 #else 1458 nlm.ifa.ifa_flags |= IFA_F_TEMPORARY; 1459 #endif 1460 } 1461 #ifdef IFA_F_MANAGETEMPADDR 1462 else if (ap->flags & IPV6_AF_AUTOCONF && 1463 ip6_use_tempaddr(ap->iface->name)) 1464 flags |= IFA_F_MANAGETEMPADDR; 1465 #endif 1466 1467 /* Add as /128 if no IFA_F_NOPREFIXROUTE ? */ 1468 nlm.ifa.ifa_prefixlen = ap->prefix_len; 1469 /* This creates the aliased interface */ 1470 add_attr_l(&nlm.hdr, sizeof(nlm), IFA_LABEL, 1471 ap->iface->alias, (unsigned short)(strlen(ap->iface->alias) + 1)); 1472 add_attr_l(&nlm.hdr, sizeof(nlm), IFA_LOCAL, 1473 &ap->addr.s6_addr, sizeof(ap->addr.s6_addr)); 1474 1475 if (action >= 0) { 1476 memset(&cinfo, 0, sizeof(cinfo)); 1477 cinfo.ifa_prefered = ap->prefix_pltime; 1478 cinfo.ifa_valid = ap->prefix_vltime; 1479 add_attr_l(&nlm.hdr, sizeof(nlm), IFA_CACHEINFO, 1480 &cinfo, sizeof(cinfo)); 1481 } 1482 1483 #ifdef IFA_F_NOPREFIXROUTE 1484 if (!IN6_IS_ADDR_LINKLOCAL(&ap->addr)) 1485 flags |= IFA_F_NOPREFIXROUTE; 1486 #endif 1487 #if defined(IFA_F_NOPREFIXROUTE) || defined(IFA_F_MANAGETEMPADDR) 1488 if (flags) 1489 add_attr_32(&nlm.hdr, sizeof(nlm), IFA_FLAGS, flags); 1490 #endif 1491 1492 if (send_netlink(ap->iface->ctx, NULL, NETLINK_ROUTE, &nlm.hdr, 1493 NULL) == -1) 1494 retval = -1; 1495 return retval; 1496 } 1497 1498 static int 1499 rta_add_attr_32(struct rtattr *rta, unsigned short maxlen, 1500 unsigned short type, uint32_t data) 1501 { 1502 unsigned short len = RTA_LENGTH(sizeof(data)); 1503 struct rtattr *subrta; 1504 1505 if (RTA_ALIGN(rta->rta_len) + len > maxlen) { 1506 errno = ENOBUFS; 1507 return -1; 1508 } 1509 1510 subrta = (struct rtattr*)(void *) 1511 (((char*)rta) + RTA_ALIGN(rta->rta_len)); 1512 subrta->rta_type = type; 1513 subrta->rta_len = len; 1514 memcpy(RTA_DATA(subrta), &data, sizeof(data)); 1515 rta->rta_len = (unsigned short)(NLMSG_ALIGN(rta->rta_len) + len); 1516 return 0; 1517 } 1518 1519 int 1520 if_route6(unsigned char cmd, const struct rt6 *rt) 1521 { 1522 struct nlmr nlm; 1523 int retval = 0; 1524 1525 memset(&nlm, 0, sizeof(nlm)); 1526 nlm.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); 1527 switch (cmd) { 1528 case RTM_CHANGE: 1529 nlm.hdr.nlmsg_type = RTM_NEWROUTE; 1530 nlm.hdr.nlmsg_flags = NLM_F_CREATE | NLM_F_REPLACE; 1531 break; 1532 case RTM_ADD: 1533 nlm.hdr.nlmsg_type = RTM_NEWROUTE; 1534 nlm.hdr.nlmsg_flags = NLM_F_CREATE | NLM_F_EXCL; 1535 break; 1536 case RTM_DELETE: 1537 nlm.hdr.nlmsg_type = RTM_DELROUTE; 1538 break; 1539 } 1540 nlm.hdr.nlmsg_flags |= NLM_F_REQUEST; 1541 nlm.rt.rtm_family = AF_INET6; 1542 nlm.rt.rtm_table = RT_TABLE_MAIN; 1543 1544 if (cmd == RTM_DELETE) 1545 nlm.rt.rtm_scope = RT_SCOPE_NOWHERE; 1546 else { 1547 /* None interface subnet routes are static. */ 1548 if (rt->iface->flags & IFF_LOOPBACK) 1549 nlm.rt.rtm_scope = RT_SCOPE_HOST; 1550 else if (IN6_IS_ADDR_UNSPECIFIED(&rt->gate)) { 1551 nlm.rt.rtm_protocol = RTPROT_KERNEL; 1552 nlm.rt.rtm_scope = RT_SCOPE_LINK; 1553 } else 1554 nlm.rt.rtm_protocol = RTPROT_BOOT; 1555 if (rt->flags & RTF_REJECT) 1556 nlm.rt.rtm_type = RTN_UNREACHABLE; 1557 else 1558 nlm.rt.rtm_type = RTN_UNICAST; 1559 } 1560 1561 nlm.rt.rtm_dst_len = ipv6_prefixlen(&rt->net); 1562 add_attr_l(&nlm.hdr, sizeof(nlm), RTA_DST, 1563 &rt->dest.s6_addr, sizeof(rt->dest.s6_addr)); 1564 1565 if (cmd == RTM_ADD && !IN6_IS_ADDR_UNSPECIFIED(&rt->gate)) 1566 add_attr_l(&nlm.hdr, sizeof(nlm), RTA_GATEWAY, 1567 &rt->gate.s6_addr, sizeof(rt->gate.s6_addr)); 1568 1569 if (!(rt->flags & RTF_REJECT)) { 1570 add_attr_32(&nlm.hdr, sizeof(nlm), RTA_OIF, rt->iface->index); 1571 if (rt->metric) 1572 add_attr_32(&nlm.hdr, sizeof(nlm), 1573 RTA_PRIORITY, rt->metric); 1574 } 1575 if (cmd == RTM_ADD && rt->mtu) { 1576 char metricsbuf[32]; 1577 struct rtattr *metrics = (void *)metricsbuf; 1578 1579 metrics->rta_type = RTA_METRICS; 1580 metrics->rta_len = RTA_LENGTH(0); 1581 rta_add_attr_32(metrics, sizeof(metricsbuf), RTAX_MTU, rt->mtu); 1582 add_attr_l(&nlm.hdr, sizeof(nlm), RTA_METRICS, 1583 RTA_DATA(metrics), (unsigned short)RTA_PAYLOAD(metrics)); 1584 } 1585 1586 if (send_netlink(rt->iface->ctx, NULL, 1587 NETLINK_ROUTE, &nlm.hdr, NULL) == -1) 1588 retval = -1; 1589 return retval; 1590 } 1591 1592 static int 1593 _if_initrt6(struct dhcpcd_ctx *ctx, __unused struct interface *ifp, 1594 struct nlmsghdr *nlm) 1595 { 1596 struct rt6 rt; 1597 1598 if (if_copyrt6(ctx, &rt, nlm) == 0) 1599 ipv6_handlert(ctx, RTM_ADD, &rt); 1600 return 0; 1601 } 1602 1603 int 1604 if_initrt6(struct interface *ifp) 1605 { 1606 struct nlmr nlm; 1607 1608 ipv6_freerts(&ifp->ctx->ipv6->kroutes); 1609 1610 memset(&nlm, 0, sizeof(nlm)); 1611 nlm.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); 1612 nlm.hdr.nlmsg_type = RTM_GETROUTE; 1613 nlm.hdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_MATCH; 1614 nlm.hdr.nlmsg_flags |= NLM_F_REQUEST; 1615 nlm.rt.rtm_family = AF_INET6; 1616 nlm.rt.rtm_table = RT_TABLE_MAIN; 1617 add_attr_32(&nlm.hdr, sizeof(nlm), RTA_OIF, ifp->index); 1618 1619 return send_netlink(ifp->ctx, ifp, 1620 NETLINK_ROUTE, &nlm.hdr, &_if_initrt6); 1621 } 1622 1623 int 1624 if_addrflags6(const struct in6_addr *addr, const struct interface *ifp) 1625 { 1626 FILE *fp; 1627 char *p, ifaddress[33], address[33], name[IF_NAMESIZE + 1]; 1628 unsigned int ifindex; 1629 int prefix, scope, flags, i; 1630 1631 fp = fopen(PROC_INET6, "r"); 1632 if (fp == NULL) 1633 return -1; 1634 1635 p = ifaddress; 1636 for (i = 0; i < (int)sizeof(addr->s6_addr); i++) { 1637 p += snprintf(p, 3, "%.2x", addr->s6_addr[i]); 1638 } 1639 *p = '\0'; 1640 1641 while (fscanf(fp, "%32[a-f0-9] %x %x %x %x %"TOSTRING(IF_NAMESIZE)"s\n", 1642 address, &ifindex, &prefix, &scope, &flags, name) == 6) 1643 { 1644 if (strlen(address) != 32) { 1645 fclose(fp); 1646 errno = ENOTSUP; 1647 return -1; 1648 } 1649 if (strcmp(name, ifp->name) == 0 && 1650 strcmp(ifaddress, address) == 0) 1651 { 1652 fclose(fp); 1653 return flags; 1654 } 1655 } 1656 1657 fclose(fp); 1658 errno = ESRCH; 1659 return -1; 1660 } 1661 1662 int 1663 if_getlifetime6(__unused struct ipv6_addr *ia) 1664 { 1665 1666 /* God knows how to work out address lifetimes on Linux */ 1667 errno = ENOTSUP; 1668 return -1; 1669 } 1670 1671 struct nlml 1672 { 1673 struct nlmsghdr hdr; 1674 struct ifinfomsg i; 1675 char buffer[32]; 1676 }; 1677 1678 static int 1679 add_attr_8(struct nlmsghdr *n, unsigned short maxlen, unsigned short type, 1680 uint8_t data) 1681 { 1682 1683 return add_attr_l(n, maxlen, type, &data, sizeof(data)); 1684 } 1685 1686 static struct rtattr * 1687 add_attr_nest(struct nlmsghdr *n, unsigned short maxlen, unsigned short type) 1688 { 1689 struct rtattr *nest; 1690 1691 nest = NLMSG_TAIL(n); 1692 add_attr_l(n, maxlen, type, NULL, 0); 1693 return nest; 1694 } 1695 1696 static void 1697 add_attr_nest_end(struct nlmsghdr *n, struct rtattr *nest) 1698 { 1699 1700 nest->rta_len = (unsigned short)((char *)NLMSG_TAIL(n) - (char *)nest); 1701 } 1702 1703 static int 1704 if_disable_autolinklocal(struct dhcpcd_ctx *ctx, int ifindex) 1705 { 1706 struct nlml nlm; 1707 struct rtattr *afs, *afs6; 1708 1709 memset(&nlm, 0, sizeof(nlm)); 1710 nlm.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)); 1711 nlm.hdr.nlmsg_type = RTM_NEWLINK; 1712 nlm.hdr.nlmsg_flags = NLM_F_REQUEST; 1713 nlm.i.ifi_family = AF_INET6; 1714 nlm.i.ifi_index = ifindex; 1715 afs = add_attr_nest(&nlm.hdr, sizeof(nlm), IFLA_AF_SPEC); 1716 afs6 = add_attr_nest(&nlm.hdr, sizeof(nlm), AF_INET6); 1717 add_attr_8(&nlm.hdr, sizeof(nlm), IFLA_INET6_ADDR_GEN_MODE, 1718 IN6_ADDR_GEN_MODE_NONE); 1719 add_attr_nest_end(&nlm.hdr, afs6); 1720 add_attr_nest_end(&nlm.hdr, afs); 1721 1722 return send_netlink(ctx, NULL, NETLINK_ROUTE, &nlm.hdr, NULL); 1723 } 1724 1725 static const char *prefix = "/proc/sys/net/ipv6/conf"; 1726 1727 int 1728 if_checkipv6(struct dhcpcd_ctx *ctx, const struct interface *ifp, int own) 1729 { 1730 const char *ifname; 1731 int ra; 1732 char path[256]; 1733 1734 if (ifp == NULL) 1735 ifname = "all"; 1736 else if (own) { 1737 if (if_disable_autolinklocal(ctx, (int)ifp->index) == -1) 1738 logger(ctx, LOG_DEBUG, 1739 "%s: if_disable_autolinklocal: %m", ifp->name); 1740 } 1741 if (ifp) 1742 ifname = ifp->name; 1743 1744 snprintf(path, sizeof(path), "%s/%s/autoconf", prefix, ifname); 1745 ra = check_proc_int(path); 1746 if (ra != 1) { 1747 if (!own) 1748 logger(ctx, LOG_WARNING, 1749 "%s: IPv6 kernel autoconf disabled", ifname); 1750 } else if (ra != -1 && own) { 1751 if (write_path(path, "0") == -1) { 1752 logger(ctx, LOG_ERR, "write_path: %s: %m", path); 1753 return -1; 1754 } 1755 } 1756 1757 snprintf(path, sizeof(path), "%s/%s/accept_ra", prefix, ifname); 1758 ra = check_proc_int(path); 1759 if (ra == -1) 1760 /* The sysctl probably doesn't exist, but this isn't an 1761 * error as such so just log it and continue */ 1762 logger(ctx, errno == ENOENT ? LOG_DEBUG : LOG_WARNING, 1763 "%s: %m", path); 1764 else if (ra != 0 && own) { 1765 logger(ctx, LOG_DEBUG, "%s: disabling kernel IPv6 RA support", 1766 ifname); 1767 if (write_path(path, "0") == -1) { 1768 logger(ctx, LOG_ERR, "write_path: %s: %m", path); 1769 return ra; 1770 } 1771 return 0; 1772 } 1773 1774 return ra; 1775 } 1776 1777 #ifdef IPV6_MANAGETEMPADDR 1778 int 1779 ip6_use_tempaddr(const char *ifname) 1780 { 1781 char path[256]; 1782 int val; 1783 1784 if (ifname == NULL) 1785 ifname = "all"; 1786 snprintf(path, sizeof(path), "%s/%s/use_tempaddr", prefix, ifname); 1787 val = check_proc_int(path); 1788 return val == -1 ? 0 : val; 1789 } 1790 1791 int 1792 ip6_temp_preferred_lifetime(const char *ifname) 1793 { 1794 char path[256]; 1795 int val; 1796 1797 if (ifname == NULL) 1798 ifname = "all"; 1799 snprintf(path, sizeof(path), "%s/%s/temp_prefered_lft", prefix, 1800 ifname); 1801 val = check_proc_int(path); 1802 return val < 0 ? TEMP_PREFERRED_LIFETIME : val; 1803 } 1804 1805 int 1806 ip6_temp_valid_lifetime(const char *ifname) 1807 { 1808 char path[256]; 1809 int val; 1810 1811 if (ifname == NULL) 1812 ifname = "all"; 1813 snprintf(path, sizeof(path), "%s/%s/temp_valid_lft", prefix, ifname); 1814 val = check_proc_int(path); 1815 return val < 0 ? TEMP_VALID_LIFETIME : val; 1816 } 1817 #endif /* IPV6_MANAGETEMPADDR */ 1818 #endif /* INET6 */ 1819