1 /* 2 * Copyright (c) 1980, 1986, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. All advertising materials mentioning features or use of this software 14 * must display the following acknowledgement: 15 * This product includes software developed by the University of 16 * California, Berkeley and its contributors. 17 * 4. Neither the name of the University nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * @(#)if.c 8.3 (Berkeley) 1/4/94 34 * $FreeBSD$ 35 */ 36 37 #include "opt_compat.h" 38 #include "opt_inet6.h" 39 #include "opt_inet.h" 40 41 #include <sys/param.h> 42 #include <sys/malloc.h> 43 #include <sys/mbuf.h> 44 #include <sys/systm.h> 45 #include <sys/proc.h> 46 #include <sys/socket.h> 47 #include <sys/socketvar.h> 48 #include <sys/protosw.h> 49 #include <sys/kernel.h> 50 #include <sys/sockio.h> 51 #include <sys/syslog.h> 52 #include <sys/sysctl.h> 53 54 #include <net/if.h> 55 #include <net/if_arp.h> 56 #include <net/if_dl.h> 57 #include <net/radix.h> 58 #include <net/route.h> 59 60 #if defined(INET) || defined(INET6) 61 /*XXX*/ 62 #include <netinet/in.h> 63 #include <netinet/in_var.h> 64 #ifdef INET6 65 #include <machine/clock.h> /* XXX: temporal workaround for fxp issue */ 66 #endif 67 #endif 68 69 /* 70 * System initialization 71 */ 72 73 static int ifconf __P((u_long, caddr_t)); 74 static void ifinit __P((void *)); 75 static void if_qflush __P((struct ifqueue *)); 76 static void if_slowtimo __P((void *)); 77 static void link_rtrequest __P((int, struct rtentry *, struct sockaddr *)); 78 static int if_rtdel __P((struct radix_node *, void *)); 79 80 SYSINIT(interfaces, SI_SUB_PROTO_IF, SI_ORDER_FIRST, ifinit, NULL) 81 82 MALLOC_DEFINE(M_IFADDR, "ifaddr", "interface address"); 83 MALLOC_DEFINE(M_IFMADDR, "ether_multi", "link-level multicast address"); 84 85 int ifqmaxlen = IFQ_MAXLEN; 86 struct ifnethead ifnet; /* depend on static init XXX */ 87 88 #ifdef INET6 89 /* 90 * XXX: declare here to avoid to include many inet6 related files.. 91 * should be more generalized? 92 */ 93 extern void nd6_setmtu __P((struct ifnet *)); 94 #endif 95 96 /* 97 * Network interface utility routines. 98 * 99 * Routines with ifa_ifwith* names take sockaddr *'s as 100 * parameters. 101 */ 102 /* ARGSUSED*/ 103 void 104 ifinit(dummy) 105 void *dummy; 106 { 107 struct ifnet *ifp; 108 int s; 109 110 s = splimp(); 111 for (ifp = ifnet.tqh_first; ifp; ifp = ifp->if_link.tqe_next) 112 if (ifp->if_snd.ifq_maxlen == 0) { 113 printf("%s%d XXX: driver didn't set ifq_maxlen\n", 114 ifp->if_name, ifp->if_unit); 115 ifp->if_snd.ifq_maxlen = ifqmaxlen; 116 } 117 splx(s); 118 if_slowtimo(0); 119 } 120 121 int if_index = 0; 122 struct ifaddr **ifnet_addrs; 123 struct ifnet **ifindex2ifnet = NULL; 124 125 126 /* 127 * Attach an interface to the 128 * list of "active" interfaces. 129 */ 130 void 131 if_attach(ifp) 132 struct ifnet *ifp; 133 { 134 unsigned socksize, ifasize; 135 int namelen, masklen; 136 char workbuf[64]; 137 register struct sockaddr_dl *sdl; 138 register struct ifaddr *ifa; 139 static int if_indexlim = 8; 140 static int inited; 141 142 if (!inited) { 143 TAILQ_INIT(&ifnet); 144 inited = 1; 145 } 146 147 TAILQ_INSERT_TAIL(&ifnet, ifp, if_link); 148 ifp->if_index = ++if_index; 149 /* 150 * XXX - 151 * The old code would work if the interface passed a pre-existing 152 * chain of ifaddrs to this code. We don't trust our callers to 153 * properly initialize the tailq, however, so we no longer allow 154 * this unlikely case. 155 */ 156 TAILQ_INIT(&ifp->if_addrhead); 157 TAILQ_INIT(&ifp->if_prefixhead); 158 LIST_INIT(&ifp->if_multiaddrs); 159 getmicrotime(&ifp->if_lastchange); 160 if (ifnet_addrs == 0 || if_index >= if_indexlim) { 161 unsigned n = (if_indexlim <<= 1) * sizeof(ifa); 162 caddr_t q = malloc(n, M_IFADDR, M_WAITOK); 163 bzero(q, n); 164 if (ifnet_addrs) { 165 bcopy((caddr_t)ifnet_addrs, (caddr_t)q, n/2); 166 free((caddr_t)ifnet_addrs, M_IFADDR); 167 } 168 ifnet_addrs = (struct ifaddr **)q; 169 170 /* grow ifindex2ifnet */ 171 n = if_indexlim * sizeof(struct ifnet *); 172 q = malloc(n, M_IFADDR, M_WAITOK); 173 bzero(q, n); 174 if (ifindex2ifnet) { 175 bcopy((caddr_t)ifindex2ifnet, q, n/2); 176 free((caddr_t)ifindex2ifnet, M_IFADDR); 177 } 178 ifindex2ifnet = (struct ifnet **)q; 179 } 180 181 ifindex2ifnet[if_index] = ifp; 182 183 /* 184 * create a Link Level name for this device 185 */ 186 namelen = snprintf(workbuf, sizeof(workbuf), 187 "%s%d", ifp->if_name, ifp->if_unit); 188 #define _offsetof(t, m) ((int)((caddr_t)&((t *)0)->m)) 189 masklen = _offsetof(struct sockaddr_dl, sdl_data[0]) + namelen; 190 socksize = masklen + ifp->if_addrlen; 191 #define ROUNDUP(a) (1 + (((a) - 1) | (sizeof(long) - 1))) 192 if (socksize < sizeof(*sdl)) 193 socksize = sizeof(*sdl); 194 socksize = ROUNDUP(socksize); 195 ifasize = sizeof(*ifa) + 2 * socksize; 196 ifa = (struct ifaddr *)malloc(ifasize, M_IFADDR, M_WAITOK); 197 if (ifa) { 198 bzero((caddr_t)ifa, ifasize); 199 sdl = (struct sockaddr_dl *)(ifa + 1); 200 sdl->sdl_len = socksize; 201 sdl->sdl_family = AF_LINK; 202 bcopy(workbuf, sdl->sdl_data, namelen); 203 sdl->sdl_nlen = namelen; 204 sdl->sdl_index = ifp->if_index; 205 sdl->sdl_type = ifp->if_type; 206 ifnet_addrs[if_index - 1] = ifa; 207 ifa->ifa_ifp = ifp; 208 ifa->ifa_rtrequest = link_rtrequest; 209 ifa->ifa_addr = (struct sockaddr *)sdl; 210 sdl = (struct sockaddr_dl *)(socksize + (caddr_t)sdl); 211 ifa->ifa_netmask = (struct sockaddr *)sdl; 212 sdl->sdl_len = masklen; 213 while (namelen != 0) 214 sdl->sdl_data[--namelen] = 0xff; 215 TAILQ_INSERT_HEAD(&ifp->if_addrhead, ifa, ifa_link); 216 } 217 } 218 219 /* 220 * Detach an interface, removing it from the 221 * list of "active" interfaces. 222 */ 223 void 224 if_detach(ifp) 225 struct ifnet *ifp; 226 { 227 struct ifaddr *ifa; 228 struct radix_node_head *rnh; 229 int s; 230 int i; 231 232 /* 233 * Remove routes and flush queues. 234 */ 235 s = splnet(); 236 if_down(ifp); 237 238 /* 239 * Remove address from ifnet_addrs[] and maybe decrement if_index. 240 * Clean up all addresses. 241 */ 242 ifnet_addrs[ifp->if_index - 1] = 0; 243 while (if_index > 0 && ifnet_addrs[if_index - 1] == 0) 244 if_index--; 245 246 for (ifa = TAILQ_FIRST(&ifp->if_addrhead); ifa; 247 ifa = TAILQ_FIRST(&ifp->if_addrhead)) { 248 #ifdef INET 249 /* XXX: Ugly!! ad hoc just for INET */ 250 if (ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_INET) { 251 struct ifaliasreq ifr; 252 253 bzero(&ifr, sizeof(ifr)); 254 ifr.ifra_addr = *ifa->ifa_addr; 255 if (ifa->ifa_dstaddr) 256 ifr.ifra_broadaddr = *ifa->ifa_dstaddr; 257 if (in_control(NULL, SIOCDIFADDR, (caddr_t)&ifr, ifp, 258 NULL) == 0) 259 continue; 260 } 261 #endif /* INET */ 262 #ifdef INET6 263 /* XXX: Ugly!! ad hoc just for INET6 */ 264 if (ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_INET6) { 265 struct in6_aliasreq ifr; 266 267 bzero(&ifr, sizeof(ifr)); 268 ifr.ifra_addr = 269 *((struct sockaddr_in6 *)ifa->ifa_addr); 270 if (ifa->ifa_dstaddr) 271 ifr.ifra_dstaddr = 272 *((struct sockaddr_in6 *)ifa->ifa_dstaddr); 273 if (in6_control(NULL, SIOCDIFADDR_IN6, (caddr_t)&ifr, 274 ifp, NULL) == 0) 275 continue; 276 } 277 #endif /* INET6 */ 278 TAILQ_REMOVE(&ifp->if_addrhead, ifa, ifa_link); 279 IFAFREE(ifa); 280 } 281 282 /* 283 * Delete all remaining routes using this interface 284 * Unfortuneatly the only way to do this is to slog through 285 * the entire routing table looking for routes which point 286 * to this interface...oh well... 287 */ 288 for (i = 1; i <= AF_MAX; i++) { 289 if ((rnh = rt_tables[i]) == NULL) 290 continue; 291 (void) rnh->rnh_walktree(rnh, if_rtdel, ifp); 292 } 293 294 TAILQ_REMOVE(&ifnet, ifp, if_link); 295 splx(s); 296 } 297 298 /* 299 * Delete Routes for a Network Interface 300 * 301 * Called for each routing entry via the rnh->rnh_walktree() call above 302 * to delete all route entries referencing a detaching network interface. 303 * 304 * Arguments: 305 * rn pointer to node in the routing table 306 * arg argument passed to rnh->rnh_walktree() - detaching interface 307 * 308 * Returns: 309 * 0 successful 310 * errno failed - reason indicated 311 * 312 */ 313 static int 314 if_rtdel(rn, arg) 315 struct radix_node *rn; 316 void *arg; 317 { 318 struct rtentry *rt = (struct rtentry *)rn; 319 struct ifnet *ifp = arg; 320 int err; 321 322 if (rt->rt_ifp == ifp) { 323 324 /* 325 * Protect (sorta) against walktree recursion problems 326 * with cloned routes 327 */ 328 if ((rt->rt_flags & RTF_UP) == 0) 329 return (0); 330 331 err = rtrequest(RTM_DELETE, rt_key(rt), rt->rt_gateway, 332 rt_mask(rt), rt->rt_flags, 333 (struct rtentry **) NULL); 334 if (err) { 335 log(LOG_WARNING, "if_rtdel: error %d\n", err); 336 } 337 } 338 339 return (0); 340 } 341 342 /* 343 * Locate an interface based on a complete address. 344 */ 345 /*ARGSUSED*/ 346 struct ifaddr * 347 ifa_ifwithaddr(addr) 348 register struct sockaddr *addr; 349 { 350 register struct ifnet *ifp; 351 register struct ifaddr *ifa; 352 353 #define equal(a1, a2) \ 354 (bcmp((caddr_t)(a1), (caddr_t)(a2), ((struct sockaddr *)(a1))->sa_len) == 0) 355 for (ifp = ifnet.tqh_first; ifp; ifp = ifp->if_link.tqe_next) 356 for (ifa = ifp->if_addrhead.tqh_first; ifa; 357 ifa = ifa->ifa_link.tqe_next) { 358 if (ifa->ifa_addr->sa_family != addr->sa_family) 359 continue; 360 if (equal(addr, ifa->ifa_addr)) 361 return (ifa); 362 if ((ifp->if_flags & IFF_BROADCAST) && ifa->ifa_broadaddr && 363 /* IP6 doesn't have broadcast */ 364 ifa->ifa_broadaddr->sa_len != 0 && 365 equal(ifa->ifa_broadaddr, addr)) 366 return (ifa); 367 } 368 return ((struct ifaddr *)0); 369 } 370 /* 371 * Locate the point to point interface with a given destination address. 372 */ 373 /*ARGSUSED*/ 374 struct ifaddr * 375 ifa_ifwithdstaddr(addr) 376 register struct sockaddr *addr; 377 { 378 register struct ifnet *ifp; 379 register struct ifaddr *ifa; 380 381 for (ifp = ifnet.tqh_first; ifp; ifp = ifp->if_link.tqe_next) 382 if (ifp->if_flags & IFF_POINTOPOINT) 383 for (ifa = ifp->if_addrhead.tqh_first; ifa; 384 ifa = ifa->ifa_link.tqe_next) { 385 if (ifa->ifa_addr->sa_family != addr->sa_family) 386 continue; 387 if (ifa->ifa_dstaddr && equal(addr, ifa->ifa_dstaddr)) 388 return (ifa); 389 } 390 return ((struct ifaddr *)0); 391 } 392 393 /* 394 * Find an interface on a specific network. If many, choice 395 * is most specific found. 396 */ 397 struct ifaddr * 398 ifa_ifwithnet(addr) 399 struct sockaddr *addr; 400 { 401 register struct ifnet *ifp; 402 register struct ifaddr *ifa; 403 struct ifaddr *ifa_maybe = (struct ifaddr *) 0; 404 u_int af = addr->sa_family; 405 char *addr_data = addr->sa_data, *cplim; 406 407 /* 408 * AF_LINK addresses can be looked up directly by their index number, 409 * so do that if we can. 410 */ 411 if (af == AF_LINK) { 412 register struct sockaddr_dl *sdl = (struct sockaddr_dl *)addr; 413 if (sdl->sdl_index && sdl->sdl_index <= if_index) 414 return (ifnet_addrs[sdl->sdl_index - 1]); 415 } 416 417 /* 418 * Scan though each interface, looking for ones that have 419 * addresses in this address family. 420 */ 421 for (ifp = ifnet.tqh_first; ifp; ifp = ifp->if_link.tqe_next) { 422 for (ifa = ifp->if_addrhead.tqh_first; ifa; 423 ifa = ifa->ifa_link.tqe_next) { 424 register char *cp, *cp2, *cp3; 425 426 if (ifa->ifa_addr->sa_family != af) 427 next: continue; 428 if ( 429 #ifdef INET6 /* XXX: for maching gif tunnel dst as routing entry gateway */ 430 addr->sa_family != AF_INET6 && 431 #endif 432 ifp->if_flags & IFF_POINTOPOINT) { 433 /* 434 * This is a bit broken as it doesn't 435 * take into account that the remote end may 436 * be a single node in the network we are 437 * looking for. 438 * The trouble is that we don't know the 439 * netmask for the remote end. 440 */ 441 if (ifa->ifa_dstaddr != 0 442 && equal(addr, ifa->ifa_dstaddr)) 443 return (ifa); 444 } else { 445 /* 446 * if we have a special address handler, 447 * then use it instead of the generic one. 448 */ 449 if (ifa->ifa_claim_addr) { 450 if ((*ifa->ifa_claim_addr)(ifa, addr)) { 451 return (ifa); 452 } else { 453 continue; 454 } 455 } 456 457 /* 458 * Scan all the bits in the ifa's address. 459 * If a bit dissagrees with what we are 460 * looking for, mask it with the netmask 461 * to see if it really matters. 462 * (A byte at a time) 463 */ 464 if (ifa->ifa_netmask == 0) 465 continue; 466 cp = addr_data; 467 cp2 = ifa->ifa_addr->sa_data; 468 cp3 = ifa->ifa_netmask->sa_data; 469 cplim = ifa->ifa_netmask->sa_len 470 + (char *)ifa->ifa_netmask; 471 while (cp3 < cplim) 472 if ((*cp++ ^ *cp2++) & *cp3++) 473 goto next; /* next address! */ 474 /* 475 * If the netmask of what we just found 476 * is more specific than what we had before 477 * (if we had one) then remember the new one 478 * before continuing to search 479 * for an even better one. 480 */ 481 if (ifa_maybe == 0 || 482 rn_refines((caddr_t)ifa->ifa_netmask, 483 (caddr_t)ifa_maybe->ifa_netmask)) 484 ifa_maybe = ifa; 485 } 486 } 487 } 488 return (ifa_maybe); 489 } 490 491 /* 492 * Find an interface address specific to an interface best matching 493 * a given address. 494 */ 495 struct ifaddr * 496 ifaof_ifpforaddr(addr, ifp) 497 struct sockaddr *addr; 498 register struct ifnet *ifp; 499 { 500 register struct ifaddr *ifa; 501 register char *cp, *cp2, *cp3; 502 register char *cplim; 503 struct ifaddr *ifa_maybe = 0; 504 u_int af = addr->sa_family; 505 506 if (af >= AF_MAX) 507 return (0); 508 for (ifa = ifp->if_addrhead.tqh_first; ifa; 509 ifa = ifa->ifa_link.tqe_next) { 510 if (ifa->ifa_addr->sa_family != af) 511 continue; 512 if (ifa_maybe == 0) 513 ifa_maybe = ifa; 514 if (ifa->ifa_netmask == 0) { 515 if (equal(addr, ifa->ifa_addr) || 516 (ifa->ifa_dstaddr && equal(addr, ifa->ifa_dstaddr))) 517 return (ifa); 518 continue; 519 } 520 if (ifp->if_flags & IFF_POINTOPOINT) { 521 if (equal(addr, ifa->ifa_dstaddr)) 522 return (ifa); 523 } else { 524 cp = addr->sa_data; 525 cp2 = ifa->ifa_addr->sa_data; 526 cp3 = ifa->ifa_netmask->sa_data; 527 cplim = ifa->ifa_netmask->sa_len + (char *)ifa->ifa_netmask; 528 for (; cp3 < cplim; cp3++) 529 if ((*cp++ ^ *cp2++) & *cp3) 530 break; 531 if (cp3 == cplim) 532 return (ifa); 533 } 534 } 535 return (ifa_maybe); 536 } 537 538 #include <net/route.h> 539 540 /* 541 * Default action when installing a route with a Link Level gateway. 542 * Lookup an appropriate real ifa to point to. 543 * This should be moved to /sys/net/link.c eventually. 544 */ 545 static void 546 link_rtrequest(cmd, rt, sa) 547 int cmd; 548 register struct rtentry *rt; 549 struct sockaddr *sa; 550 { 551 register struct ifaddr *ifa; 552 struct sockaddr *dst; 553 struct ifnet *ifp; 554 555 if (cmd != RTM_ADD || ((ifa = rt->rt_ifa) == 0) || 556 ((ifp = ifa->ifa_ifp) == 0) || ((dst = rt_key(rt)) == 0)) 557 return; 558 ifa = ifaof_ifpforaddr(dst, ifp); 559 if (ifa) { 560 IFAFREE(rt->rt_ifa); 561 rt->rt_ifa = ifa; 562 ifa->ifa_refcnt++; 563 if (ifa->ifa_rtrequest && ifa->ifa_rtrequest != link_rtrequest) 564 ifa->ifa_rtrequest(cmd, rt, sa); 565 } 566 } 567 568 /* 569 * Mark an interface down and notify protocols of 570 * the transition. 571 * NOTE: must be called at splnet or eqivalent. 572 */ 573 void 574 if_unroute(ifp, flag, fam) 575 register struct ifnet *ifp; 576 int flag, fam; 577 { 578 register struct ifaddr *ifa; 579 580 ifp->if_flags &= ~flag; 581 getmicrotime(&ifp->if_lastchange); 582 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) 583 if (fam == PF_UNSPEC || (fam == ifa->ifa_addr->sa_family)) 584 pfctlinput(PRC_IFDOWN, ifa->ifa_addr); 585 if_qflush(&ifp->if_snd); 586 rt_ifmsg(ifp); 587 } 588 589 /* 590 * Mark an interface up and notify protocols of 591 * the transition. 592 * NOTE: must be called at splnet or eqivalent. 593 */ 594 void 595 if_route(ifp, flag, fam) 596 register struct ifnet *ifp; 597 int flag, fam; 598 { 599 register struct ifaddr *ifa; 600 601 ifp->if_flags |= flag; 602 getmicrotime(&ifp->if_lastchange); 603 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) 604 if (fam == PF_UNSPEC || (fam == ifa->ifa_addr->sa_family)) 605 pfctlinput(PRC_IFUP, ifa->ifa_addr); 606 rt_ifmsg(ifp); 607 #ifdef INET6 608 in6_if_up(ifp); 609 #endif 610 } 611 612 /* 613 * Mark an interface down and notify protocols of 614 * the transition. 615 * NOTE: must be called at splnet or eqivalent. 616 */ 617 void 618 if_down(ifp) 619 register struct ifnet *ifp; 620 { 621 622 if_unroute(ifp, IFF_UP, AF_UNSPEC); 623 } 624 625 /* 626 * Mark an interface up and notify protocols of 627 * the transition. 628 * NOTE: must be called at splnet or eqivalent. 629 */ 630 void 631 if_up(ifp) 632 register struct ifnet *ifp; 633 { 634 635 if_route(ifp, IFF_UP, AF_UNSPEC); 636 } 637 638 /* 639 * Flush an interface queue. 640 */ 641 static void 642 if_qflush(ifq) 643 register struct ifqueue *ifq; 644 { 645 register struct mbuf *m, *n; 646 647 n = ifq->ifq_head; 648 while ((m = n) != 0) { 649 n = m->m_act; 650 m_freem(m); 651 } 652 ifq->ifq_head = 0; 653 ifq->ifq_tail = 0; 654 ifq->ifq_len = 0; 655 } 656 657 /* 658 * Handle interface watchdog timer routines. Called 659 * from softclock, we decrement timers (if set) and 660 * call the appropriate interface routine on expiration. 661 */ 662 static void 663 if_slowtimo(arg) 664 void *arg; 665 { 666 register struct ifnet *ifp; 667 int s = splimp(); 668 669 for (ifp = ifnet.tqh_first; ifp; ifp = ifp->if_link.tqe_next) { 670 if (ifp->if_timer == 0 || --ifp->if_timer) 671 continue; 672 if (ifp->if_watchdog) 673 (*ifp->if_watchdog)(ifp); 674 } 675 splx(s); 676 timeout(if_slowtimo, (void *)0, hz / IFNET_SLOWHZ); 677 } 678 679 /* 680 * Map interface name to 681 * interface structure pointer. 682 */ 683 struct ifnet * 684 ifunit(char *name) 685 { 686 char namebuf[IFNAMSIZ + 1]; 687 char *cp; 688 struct ifnet *ifp; 689 int unit; 690 unsigned len, m; 691 char c; 692 693 len = strlen(name); 694 if (len < 2 || len > IFNAMSIZ) 695 return NULL; 696 cp = name + len - 1; 697 c = *cp; 698 if (c < '0' || c > '9') 699 return NULL; /* trailing garbage */ 700 unit = 0; 701 m = 1; 702 do { 703 if (cp == name) 704 return NULL; /* no interface name */ 705 unit += (c - '0') * m; 706 if (unit > 1000000) 707 return NULL; /* number is unreasonable */ 708 m *= 10; 709 c = *--cp; 710 } while (c >= '0' && c <= '9'); 711 len = cp - name + 1; 712 bcopy(name, namebuf, len); 713 namebuf[len] = '\0'; 714 /* 715 * Now search all the interfaces for this name/number 716 */ 717 for (ifp = ifnet.tqh_first; ifp; ifp = ifp->if_link.tqe_next) { 718 if (strcmp(ifp->if_name, namebuf)) 719 continue; 720 if (unit == ifp->if_unit) 721 break; 722 } 723 return (ifp); 724 } 725 726 727 /* 728 * Map interface name in a sockaddr_dl to 729 * interface structure pointer. 730 */ 731 struct ifnet * 732 if_withname(sa) 733 struct sockaddr *sa; 734 { 735 char ifname[IFNAMSIZ+1]; 736 struct sockaddr_dl *sdl = (struct sockaddr_dl *)sa; 737 738 if ( (sa->sa_family != AF_LINK) || (sdl->sdl_nlen == 0) || 739 (sdl->sdl_nlen > IFNAMSIZ) ) 740 return NULL; 741 742 /* 743 * ifunit wants a null-terminated name. It may not be null-terminated 744 * in the sockaddr. We don't want to change the caller's sockaddr, 745 * and there might not be room to put the trailing null anyway, so we 746 * make a local copy that we know we can null terminate safely. 747 */ 748 749 bcopy(sdl->sdl_data, ifname, sdl->sdl_nlen); 750 ifname[sdl->sdl_nlen] = '\0'; 751 return ifunit(ifname); 752 } 753 754 755 /* 756 * Interface ioctls. 757 */ 758 int 759 ifioctl(so, cmd, data, p) 760 struct socket *so; 761 u_long cmd; 762 caddr_t data; 763 struct proc *p; 764 { 765 register struct ifnet *ifp; 766 register struct ifreq *ifr; 767 register struct ifaddr *ifa; 768 struct sockaddr_dl *sdl; 769 struct ifstat *ifs; 770 int error; 771 short oif_flags; 772 773 switch (cmd) { 774 775 case SIOCGIFCONF: 776 case OSIOCGIFCONF: 777 return (ifconf(cmd, data)); 778 } 779 ifr = (struct ifreq *)data; 780 ifp = ifunit(ifr->ifr_name); 781 if (ifp == 0) 782 return (ENXIO); 783 switch (cmd) { 784 785 case SIOCGIFFLAGS: 786 ifr->ifr_flags = ifp->if_flags; 787 break; 788 789 case SIOCGIFMETRIC: 790 ifr->ifr_metric = ifp->if_metric; 791 break; 792 793 case SIOCGIFMTU: 794 ifr->ifr_mtu = ifp->if_mtu; 795 break; 796 797 case SIOCGIFPHYS: 798 ifr->ifr_phys = ifp->if_physical; 799 break; 800 801 case SIOCSIFFLAGS: 802 error = suser(p); 803 if (error) 804 return (error); 805 ifr->ifr_prevflags = ifp->if_flags; 806 if (ifp->if_flags & IFF_SMART) { 807 /* Smart drivers twiddle their own routes */ 808 } else if (ifp->if_flags & IFF_UP && 809 (ifr->ifr_flags & IFF_UP) == 0) { 810 int s = splimp(); 811 if_down(ifp); 812 splx(s); 813 } else if (ifr->ifr_flags & IFF_UP && 814 (ifp->if_flags & IFF_UP) == 0) { 815 int s = splimp(); 816 if_up(ifp); 817 splx(s); 818 } 819 ifp->if_flags = (ifp->if_flags & IFF_CANTCHANGE) | 820 (ifr->ifr_flags &~ IFF_CANTCHANGE); 821 if (ifp->if_ioctl) 822 (void) (*ifp->if_ioctl)(ifp, cmd, data); 823 getmicrotime(&ifp->if_lastchange); 824 break; 825 826 case SIOCSIFMETRIC: 827 error = suser(p); 828 if (error) 829 return (error); 830 ifp->if_metric = ifr->ifr_metric; 831 getmicrotime(&ifp->if_lastchange); 832 break; 833 834 case SIOCSIFPHYS: 835 error = suser(p); 836 if (error) 837 return error; 838 if (!ifp->if_ioctl) 839 return EOPNOTSUPP; 840 error = (*ifp->if_ioctl)(ifp, cmd, data); 841 if (error == 0) 842 getmicrotime(&ifp->if_lastchange); 843 return(error); 844 845 case SIOCSIFMTU: 846 { 847 u_long oldmtu = ifp->if_mtu; 848 849 error = suser(p); 850 if (error) 851 return (error); 852 if (ifp->if_ioctl == NULL) 853 return (EOPNOTSUPP); 854 if (ifr->ifr_mtu < IF_MINMTU || ifr->ifr_mtu > IF_MAXMTU) 855 return (EINVAL); 856 error = (*ifp->if_ioctl)(ifp, cmd, data); 857 if (error == 0) { 858 getmicrotime(&ifp->if_lastchange); 859 rt_ifmsg(ifp); 860 } 861 /* 862 * If the link MTU changed, do network layer specific procedure. 863 */ 864 if (ifp->if_mtu != oldmtu) { 865 #ifdef INET6 866 nd6_setmtu(ifp); 867 #endif 868 } 869 return (error); 870 } 871 872 case SIOCADDMULTI: 873 case SIOCDELMULTI: 874 error = suser(p); 875 if (error) 876 return (error); 877 878 /* Don't allow group membership on non-multicast interfaces. */ 879 if ((ifp->if_flags & IFF_MULTICAST) == 0) 880 return EOPNOTSUPP; 881 882 /* Don't let users screw up protocols' entries. */ 883 if (ifr->ifr_addr.sa_family != AF_LINK) 884 return EINVAL; 885 886 if (cmd == SIOCADDMULTI) { 887 struct ifmultiaddr *ifma; 888 error = if_addmulti(ifp, &ifr->ifr_addr, &ifma); 889 } else { 890 error = if_delmulti(ifp, &ifr->ifr_addr); 891 } 892 if (error == 0) 893 getmicrotime(&ifp->if_lastchange); 894 return error; 895 896 case SIOCSIFMEDIA: 897 case SIOCSIFGENERIC: 898 error = suser(p); 899 if (error) 900 return (error); 901 if (ifp->if_ioctl == 0) 902 return (EOPNOTSUPP); 903 error = (*ifp->if_ioctl)(ifp, cmd, data); 904 if (error == 0) 905 getmicrotime(&ifp->if_lastchange); 906 return error; 907 908 case SIOCGIFSTATUS: 909 ifs = (struct ifstat *)data; 910 ifs->ascii[0] = '\0'; 911 912 case SIOCGIFMEDIA: 913 case SIOCGIFGENERIC: 914 if (ifp->if_ioctl == 0) 915 return (EOPNOTSUPP); 916 return ((*ifp->if_ioctl)(ifp, cmd, data)); 917 918 case SIOCSIFLLADDR: 919 error = suser(p); 920 if (error) 921 return (error); 922 ifa = ifnet_addrs[ifp->if_index - 1]; 923 if (ifa == NULL) 924 return(EINVAL); 925 sdl = (struct sockaddr_dl *)ifa->ifa_addr; 926 if (sdl == NULL) 927 return(EINVAL); 928 bcopy(ifr->ifr_addr.sa_data, 929 ((struct arpcom *)ifp->if_softc)->ac_enaddr, 930 ifr->ifr_addr.sa_len); 931 bcopy(ifr->ifr_addr.sa_data, LLADDR(sdl), 932 ifr->ifr_addr.sa_len); 933 /* 934 * If the interface is already up, we need 935 * to re-init it in order to reprogram its 936 * address filter. 937 */ 938 if (ifp->if_flags & IFF_UP) { 939 ifp->if_flags &= ~IFF_UP; 940 (*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, NULL); 941 ifp->if_flags |= IFF_UP; 942 (*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, NULL); 943 } 944 return(0); 945 default: 946 oif_flags = ifp->if_flags; 947 if (so->so_proto == 0) 948 return (EOPNOTSUPP); 949 #ifndef COMPAT_43 950 error = ((*so->so_proto->pr_usrreqs->pru_control)(so, cmd, 951 data, 952 ifp, p)); 953 #else 954 { 955 int ocmd = cmd; 956 957 switch (cmd) { 958 959 case SIOCSIFDSTADDR: 960 case SIOCSIFADDR: 961 case SIOCSIFBRDADDR: 962 case SIOCSIFNETMASK: 963 #if BYTE_ORDER != BIG_ENDIAN 964 if (ifr->ifr_addr.sa_family == 0 && 965 ifr->ifr_addr.sa_len < 16) { 966 ifr->ifr_addr.sa_family = ifr->ifr_addr.sa_len; 967 ifr->ifr_addr.sa_len = 16; 968 } 969 #else 970 if (ifr->ifr_addr.sa_len == 0) 971 ifr->ifr_addr.sa_len = 16; 972 #endif 973 break; 974 975 case OSIOCGIFADDR: 976 cmd = SIOCGIFADDR; 977 break; 978 979 case OSIOCGIFDSTADDR: 980 cmd = SIOCGIFDSTADDR; 981 break; 982 983 case OSIOCGIFBRDADDR: 984 cmd = SIOCGIFBRDADDR; 985 break; 986 987 case OSIOCGIFNETMASK: 988 cmd = SIOCGIFNETMASK; 989 } 990 error = ((*so->so_proto->pr_usrreqs->pru_control)(so, 991 cmd, 992 data, 993 ifp, p)); 994 switch (ocmd) { 995 996 case OSIOCGIFADDR: 997 case OSIOCGIFDSTADDR: 998 case OSIOCGIFBRDADDR: 999 case OSIOCGIFNETMASK: 1000 *(u_short *)&ifr->ifr_addr = ifr->ifr_addr.sa_family; 1001 1002 } 1003 } 1004 #endif /* COMPAT_43 */ 1005 1006 if ((oif_flags ^ ifp->if_flags) & IFF_UP) { 1007 #ifdef INET6 1008 DELAY(100);/* XXX: temporal workaround for fxp issue*/ 1009 if (ifp->if_flags & IFF_UP) { 1010 int s = splimp(); 1011 in6_if_up(ifp); 1012 splx(s); 1013 } 1014 #endif 1015 } 1016 return (error); 1017 1018 } 1019 return (0); 1020 } 1021 1022 /* 1023 * Set/clear promiscuous mode on interface ifp based on the truth value 1024 * of pswitch. The calls are reference counted so that only the first 1025 * "on" request actually has an effect, as does the final "off" request. 1026 * Results are undefined if the "off" and "on" requests are not matched. 1027 */ 1028 int 1029 ifpromisc(ifp, pswitch) 1030 struct ifnet *ifp; 1031 int pswitch; 1032 { 1033 struct ifreq ifr; 1034 int error; 1035 1036 if (pswitch) { 1037 /* 1038 * If the device is not configured up, we cannot put it in 1039 * promiscuous mode. 1040 */ 1041 if ((ifp->if_flags & IFF_UP) == 0) 1042 return (ENETDOWN); 1043 if (ifp->if_pcount++ != 0) 1044 return (0); 1045 ifp->if_flags |= IFF_PROMISC; 1046 log(LOG_INFO, "%s%d: promiscuous mode enabled\n", 1047 ifp->if_name, ifp->if_unit); 1048 } else { 1049 if (--ifp->if_pcount > 0) 1050 return (0); 1051 ifp->if_flags &= ~IFF_PROMISC; 1052 log(LOG_INFO, "%s%d: promiscuous mode disabled\n", 1053 ifp->if_name, ifp->if_unit); 1054 } 1055 ifr.ifr_flags = ifp->if_flags; 1056 error = (*ifp->if_ioctl)(ifp, SIOCSIFFLAGS, (caddr_t)&ifr); 1057 if (error == 0) 1058 rt_ifmsg(ifp); 1059 return error; 1060 } 1061 1062 /* 1063 * Return interface configuration 1064 * of system. List may be used 1065 * in later ioctl's (above) to get 1066 * other information. 1067 */ 1068 /*ARGSUSED*/ 1069 static int 1070 ifconf(cmd, data) 1071 u_long cmd; 1072 caddr_t data; 1073 { 1074 register struct ifconf *ifc = (struct ifconf *)data; 1075 register struct ifnet *ifp = ifnet.tqh_first; 1076 register struct ifaddr *ifa; 1077 struct ifreq ifr, *ifrp; 1078 int space = ifc->ifc_len, error = 0; 1079 1080 ifrp = ifc->ifc_req; 1081 for (; space > sizeof (ifr) && ifp; ifp = ifp->if_link.tqe_next) { 1082 char workbuf[64]; 1083 int ifnlen, addrs; 1084 1085 ifnlen = snprintf(workbuf, sizeof(workbuf), 1086 "%s%d", ifp->if_name, ifp->if_unit); 1087 if(ifnlen + 1 > sizeof ifr.ifr_name) { 1088 error = ENAMETOOLONG; 1089 break; 1090 } else { 1091 strcpy(ifr.ifr_name, workbuf); 1092 } 1093 1094 addrs = 0; 1095 ifa = ifp->if_addrhead.tqh_first; 1096 for ( ; space > sizeof (ifr) && ifa; 1097 ifa = ifa->ifa_link.tqe_next) { 1098 register struct sockaddr *sa = ifa->ifa_addr; 1099 if (curproc->p_prison && prison_if(curproc, sa)) 1100 continue; 1101 addrs++; 1102 #ifdef COMPAT_43 1103 if (cmd == OSIOCGIFCONF) { 1104 struct osockaddr *osa = 1105 (struct osockaddr *)&ifr.ifr_addr; 1106 ifr.ifr_addr = *sa; 1107 osa->sa_family = sa->sa_family; 1108 error = copyout((caddr_t)&ifr, (caddr_t)ifrp, 1109 sizeof (ifr)); 1110 ifrp++; 1111 } else 1112 #endif 1113 if (sa->sa_len <= sizeof(*sa)) { 1114 ifr.ifr_addr = *sa; 1115 error = copyout((caddr_t)&ifr, (caddr_t)ifrp, 1116 sizeof (ifr)); 1117 ifrp++; 1118 } else { 1119 if (space < sizeof (ifr) + sa->sa_len - 1120 sizeof(*sa)) 1121 break; 1122 space -= sa->sa_len - sizeof(*sa); 1123 error = copyout((caddr_t)&ifr, (caddr_t)ifrp, 1124 sizeof (ifr.ifr_name)); 1125 if (error == 0) 1126 error = copyout((caddr_t)sa, 1127 (caddr_t)&ifrp->ifr_addr, sa->sa_len); 1128 ifrp = (struct ifreq *) 1129 (sa->sa_len + (caddr_t)&ifrp->ifr_addr); 1130 } 1131 if (error) 1132 break; 1133 space -= sizeof (ifr); 1134 } 1135 if (error) 1136 break; 1137 if (!addrs) { 1138 bzero((caddr_t)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 1139 error = copyout((caddr_t)&ifr, (caddr_t)ifrp, 1140 sizeof (ifr)); 1141 if (error) 1142 break; 1143 space -= sizeof (ifr); 1144 ifrp++; 1145 } 1146 } 1147 ifc->ifc_len -= space; 1148 return (error); 1149 } 1150 1151 /* 1152 * Just like if_promisc(), but for all-multicast-reception mode. 1153 */ 1154 int 1155 if_allmulti(ifp, onswitch) 1156 struct ifnet *ifp; 1157 int onswitch; 1158 { 1159 int error = 0; 1160 int s = splimp(); 1161 1162 if (onswitch) { 1163 if (ifp->if_amcount++ == 0) { 1164 ifp->if_flags |= IFF_ALLMULTI; 1165 error = ifp->if_ioctl(ifp, SIOCSIFFLAGS, 0); 1166 } 1167 } else { 1168 if (ifp->if_amcount > 1) { 1169 ifp->if_amcount--; 1170 } else { 1171 ifp->if_amcount = 0; 1172 ifp->if_flags &= ~IFF_ALLMULTI; 1173 error = ifp->if_ioctl(ifp, SIOCSIFFLAGS, 0); 1174 } 1175 } 1176 splx(s); 1177 1178 if (error == 0) 1179 rt_ifmsg(ifp); 1180 return error; 1181 } 1182 1183 /* 1184 * Add a multicast listenership to the interface in question. 1185 * The link layer provides a routine which converts 1186 */ 1187 int 1188 if_addmulti(ifp, sa, retifma) 1189 struct ifnet *ifp; /* interface to manipulate */ 1190 struct sockaddr *sa; /* address to add */ 1191 struct ifmultiaddr **retifma; 1192 { 1193 struct sockaddr *llsa, *dupsa; 1194 int error, s; 1195 struct ifmultiaddr *ifma; 1196 1197 /* 1198 * If the matching multicast address already exists 1199 * then don't add a new one, just add a reference 1200 */ 1201 for (ifma = ifp->if_multiaddrs.lh_first; ifma; 1202 ifma = ifma->ifma_link.le_next) { 1203 if (equal(sa, ifma->ifma_addr)) { 1204 ifma->ifma_refcount++; 1205 if (retifma) 1206 *retifma = ifma; 1207 return 0; 1208 } 1209 } 1210 1211 /* 1212 * Give the link layer a chance to accept/reject it, and also 1213 * find out which AF_LINK address this maps to, if it isn't one 1214 * already. 1215 */ 1216 if (ifp->if_resolvemulti) { 1217 error = ifp->if_resolvemulti(ifp, &llsa, sa); 1218 if (error) return error; 1219 } else { 1220 llsa = 0; 1221 } 1222 1223 MALLOC(ifma, struct ifmultiaddr *, sizeof *ifma, M_IFMADDR, M_WAITOK); 1224 MALLOC(dupsa, struct sockaddr *, sa->sa_len, M_IFMADDR, M_WAITOK); 1225 bcopy(sa, dupsa, sa->sa_len); 1226 1227 ifma->ifma_addr = dupsa; 1228 ifma->ifma_lladdr = llsa; 1229 ifma->ifma_ifp = ifp; 1230 ifma->ifma_refcount = 1; 1231 ifma->ifma_protospec = 0; 1232 rt_newmaddrmsg(RTM_NEWMADDR, ifma); 1233 1234 /* 1235 * Some network interfaces can scan the address list at 1236 * interrupt time; lock them out. 1237 */ 1238 s = splimp(); 1239 LIST_INSERT_HEAD(&ifp->if_multiaddrs, ifma, ifma_link); 1240 splx(s); 1241 *retifma = ifma; 1242 1243 if (llsa != 0) { 1244 for (ifma = ifp->if_multiaddrs.lh_first; ifma; 1245 ifma = ifma->ifma_link.le_next) { 1246 if (equal(ifma->ifma_addr, llsa)) 1247 break; 1248 } 1249 if (ifma) { 1250 ifma->ifma_refcount++; 1251 } else { 1252 MALLOC(ifma, struct ifmultiaddr *, sizeof *ifma, 1253 M_IFMADDR, M_WAITOK); 1254 MALLOC(dupsa, struct sockaddr *, llsa->sa_len, 1255 M_IFMADDR, M_WAITOK); 1256 bcopy(llsa, dupsa, llsa->sa_len); 1257 ifma->ifma_addr = dupsa; 1258 ifma->ifma_ifp = ifp; 1259 ifma->ifma_refcount = 1; 1260 s = splimp(); 1261 LIST_INSERT_HEAD(&ifp->if_multiaddrs, ifma, ifma_link); 1262 splx(s); 1263 } 1264 } 1265 /* 1266 * We are certain we have added something, so call down to the 1267 * interface to let them know about it. 1268 */ 1269 s = splimp(); 1270 ifp->if_ioctl(ifp, SIOCADDMULTI, 0); 1271 splx(s); 1272 1273 return 0; 1274 } 1275 1276 /* 1277 * Remove a reference to a multicast address on this interface. Yell 1278 * if the request does not match an existing membership. 1279 */ 1280 int 1281 if_delmulti(ifp, sa) 1282 struct ifnet *ifp; 1283 struct sockaddr *sa; 1284 { 1285 struct ifmultiaddr *ifma; 1286 int s; 1287 1288 for (ifma = ifp->if_multiaddrs.lh_first; ifma; 1289 ifma = ifma->ifma_link.le_next) 1290 if (equal(sa, ifma->ifma_addr)) 1291 break; 1292 if (ifma == 0) 1293 return ENOENT; 1294 1295 if (ifma->ifma_refcount > 1) { 1296 ifma->ifma_refcount--; 1297 return 0; 1298 } 1299 1300 rt_newmaddrmsg(RTM_DELMADDR, ifma); 1301 sa = ifma->ifma_lladdr; 1302 s = splimp(); 1303 LIST_REMOVE(ifma, ifma_link); 1304 splx(s); 1305 free(ifma->ifma_addr, M_IFMADDR); 1306 free(ifma, M_IFMADDR); 1307 if (sa == 0) 1308 return 0; 1309 1310 /* 1311 * Now look for the link-layer address which corresponds to 1312 * this network address. It had been squirreled away in 1313 * ifma->ifma_lladdr for this purpose (so we don't have 1314 * to call ifp->if_resolvemulti() again), and we saved that 1315 * value in sa above. If some nasty deleted the 1316 * link-layer address out from underneath us, we can deal because 1317 * the address we stored was is not the same as the one which was 1318 * in the record for the link-layer address. (So we don't complain 1319 * in that case.) 1320 */ 1321 for (ifma = ifp->if_multiaddrs.lh_first; ifma; 1322 ifma = ifma->ifma_link.le_next) 1323 if (equal(sa, ifma->ifma_addr)) 1324 break; 1325 if (ifma == 0) 1326 return 0; 1327 1328 if (ifma->ifma_refcount > 1) { 1329 ifma->ifma_refcount--; 1330 return 0; 1331 } 1332 1333 s = splimp(); 1334 LIST_REMOVE(ifma, ifma_link); 1335 ifp->if_ioctl(ifp, SIOCDELMULTI, 0); 1336 splx(s); 1337 free(ifma->ifma_addr, M_IFMADDR); 1338 free(sa, M_IFMADDR); 1339 free(ifma, M_IFMADDR); 1340 1341 return 0; 1342 } 1343 1344 struct ifmultiaddr * 1345 ifmaof_ifpforaddr(sa, ifp) 1346 struct sockaddr *sa; 1347 struct ifnet *ifp; 1348 { 1349 struct ifmultiaddr *ifma; 1350 1351 for (ifma = ifp->if_multiaddrs.lh_first; ifma; 1352 ifma = ifma->ifma_link.le_next) 1353 if (equal(ifma->ifma_addr, sa)) 1354 break; 1355 1356 return ifma; 1357 } 1358 1359 SYSCTL_NODE(_net, PF_LINK, link, CTLFLAG_RW, 0, "Link layers"); 1360 SYSCTL_NODE(_net_link, 0, generic, CTLFLAG_RW, 0, "Generic link-management"); 1361