1 /* $NetBSD: if_ethersubr.c,v 1.284 2020/04/30 03:29:55 riastradh Exp $ */ 2 3 /* 4 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. Neither the name of the project nor the names of its contributors 16 * may be used to endorse or promote products derived from this software 17 * without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 */ 31 32 /* 33 * Copyright (c) 1982, 1989, 1993 34 * The Regents of the University of California. All rights reserved. 35 * 36 * Redistribution and use in source and binary forms, with or without 37 * modification, are permitted provided that the following conditions 38 * are met: 39 * 1. Redistributions of source code must retain the above copyright 40 * notice, this list of conditions and the following disclaimer. 41 * 2. Redistributions in binary form must reproduce the above copyright 42 * notice, this list of conditions and the following disclaimer in the 43 * documentation and/or other materials provided with the distribution. 44 * 3. Neither the name of the University nor the names of its contributors 45 * may be used to endorse or promote products derived from this software 46 * without specific prior written permission. 47 * 48 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 49 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 50 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 51 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 52 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 53 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 54 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 55 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 56 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 57 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 58 * SUCH DAMAGE. 59 * 60 * @(#)if_ethersubr.c 8.2 (Berkeley) 4/4/96 61 */ 62 63 #include <sys/cdefs.h> 64 __KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.284 2020/04/30 03:29:55 riastradh Exp $"); 65 66 #ifdef _KERNEL_OPT 67 #include "opt_inet.h" 68 #include "opt_atalk.h" 69 #include "opt_mbuftrace.h" 70 #include "opt_mpls.h" 71 #include "opt_gateway.h" 72 #include "opt_pppoe.h" 73 #include "opt_net_mpsafe.h" 74 #endif 75 76 #include "vlan.h" 77 #include "pppoe.h" 78 #include "bridge.h" 79 #include "arp.h" 80 #include "agr.h" 81 82 #include <sys/sysctl.h> 83 #include <sys/mbuf.h> 84 #include <sys/mutex.h> 85 #include <sys/ioctl.h> 86 #include <sys/errno.h> 87 #include <sys/device.h> 88 #include <sys/entropy.h> 89 #include <sys/rndsource.h> 90 #include <sys/cpu.h> 91 #include <sys/kmem.h> 92 93 #include <net/if.h> 94 #include <net/netisr.h> 95 #include <net/route.h> 96 #include <net/if_llc.h> 97 #include <net/if_dl.h> 98 #include <net/if_types.h> 99 #include <net/pktqueue.h> 100 101 #include <net/if_media.h> 102 #include <dev/mii/mii.h> 103 #include <dev/mii/miivar.h> 104 105 #if NARP == 0 106 /* 107 * XXX there should really be a way to issue this warning from within config(8) 108 */ 109 #error You have included NETATALK or a pseudo-device in your configuration that depends on the presence of ethernet interfaces, but have no such interfaces configured. Check if you really need pseudo-device bridge, pppoe, vlan or options NETATALK. 110 #endif 111 112 #include <net/bpf.h> 113 114 #include <net/if_ether.h> 115 #include <net/if_vlanvar.h> 116 117 #if NPPPOE > 0 118 #include <net/if_pppoe.h> 119 #endif 120 121 #if NAGR > 0 122 #include <net/agr/ieee8023_slowprotocols.h> /* XXX */ 123 #include <net/agr/ieee8023ad.h> 124 #include <net/agr/if_agrvar.h> 125 #endif 126 127 #if NBRIDGE > 0 128 #include <net/if_bridgevar.h> 129 #endif 130 131 #include <netinet/in.h> 132 #ifdef INET 133 #include <netinet/in_var.h> 134 #endif 135 #include <netinet/if_inarp.h> 136 137 #ifdef INET6 138 #ifndef INET 139 #include <netinet/in.h> 140 #endif 141 #include <netinet6/in6_var.h> 142 #include <netinet6/nd6.h> 143 #endif 144 145 #include "carp.h" 146 #if NCARP > 0 147 #include <netinet/ip_carp.h> 148 #endif 149 150 #ifdef NETATALK 151 #include <netatalk/at.h> 152 #include <netatalk/at_var.h> 153 #include <netatalk/at_extern.h> 154 155 #define llc_snap_org_code llc_un.type_snap.org_code 156 #define llc_snap_ether_type llc_un.type_snap.ether_type 157 158 extern u_char at_org_code[3]; 159 extern u_char aarp_org_code[3]; 160 #endif /* NETATALK */ 161 162 #ifdef MPLS 163 #include <netmpls/mpls.h> 164 #include <netmpls/mpls_var.h> 165 #endif 166 167 #ifdef DIAGNOSTIC 168 static struct timeval bigpktppslim_last; 169 static int bigpktppslim = 2; /* XXX */ 170 static int bigpktpps_count; 171 static kmutex_t bigpktpps_lock __cacheline_aligned; 172 #endif 173 174 const uint8_t etherbroadcastaddr[ETHER_ADDR_LEN] = 175 { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; 176 const uint8_t ethermulticastaddr_slowprotocols[ETHER_ADDR_LEN] = 177 { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x02 }; 178 #define senderr(e) { error = (e); goto bad;} 179 180 static int ether_output(struct ifnet *, struct mbuf *, 181 const struct sockaddr *, const struct rtentry *); 182 183 /* 184 * Ethernet output routine. 185 * Encapsulate a packet of type family for the local net. 186 * Assumes that ifp is actually pointer to ethercom structure. 187 */ 188 static int 189 ether_output(struct ifnet * const ifp0, struct mbuf * const m0, 190 const struct sockaddr * const dst, const struct rtentry *rt) 191 { 192 uint8_t esrc[ETHER_ADDR_LEN], edst[ETHER_ADDR_LEN]; 193 uint16_t etype = 0; 194 int error = 0, hdrcmplt = 0; 195 struct mbuf *m = m0; 196 struct mbuf *mcopy = NULL; 197 struct ether_header *eh; 198 struct ifnet *ifp = ifp0; 199 #ifdef INET 200 struct arphdr *ah; 201 #endif 202 #ifdef NETATALK 203 struct at_ifaddr *aa; 204 #endif 205 206 #ifdef MBUFTRACE 207 m_claimm(m, ifp->if_mowner); 208 #endif 209 210 #if NCARP > 0 211 if (ifp->if_type == IFT_CARP) { 212 struct ifaddr *ifa; 213 int s = pserialize_read_enter(); 214 215 /* loop back if this is going to the carp interface */ 216 if (dst != NULL && ifp0->if_link_state == LINK_STATE_UP && 217 (ifa = ifa_ifwithaddr(dst)) != NULL) { 218 if (ifa->ifa_ifp == ifp0) { 219 pserialize_read_exit(s); 220 return looutput(ifp0, m, dst, rt); 221 } 222 } 223 pserialize_read_exit(s); 224 225 ifp = ifp->if_carpdev; 226 /* ac = (struct arpcom *)ifp; */ 227 228 if ((ifp0->if_flags & (IFF_UP | IFF_RUNNING)) != 229 (IFF_UP | IFF_RUNNING)) 230 senderr(ENETDOWN); 231 } 232 #endif 233 234 if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) != (IFF_UP | IFF_RUNNING)) 235 senderr(ENETDOWN); 236 237 switch (dst->sa_family) { 238 239 #ifdef INET 240 case AF_INET: 241 if (m->m_flags & M_BCAST) { 242 memcpy(edst, etherbroadcastaddr, sizeof(edst)); 243 } else if (m->m_flags & M_MCAST) { 244 ETHER_MAP_IP_MULTICAST(&satocsin(dst)->sin_addr, edst); 245 } else { 246 error = arpresolve(ifp0, rt, m, dst, edst, sizeof(edst)); 247 if (error) 248 return (error == EWOULDBLOCK) ? 0 : error; 249 } 250 /* If broadcasting on a simplex interface, loopback a copy */ 251 if ((m->m_flags & M_BCAST) && (ifp->if_flags & IFF_SIMPLEX)) 252 mcopy = m_copypacket(m, M_DONTWAIT); 253 etype = htons(ETHERTYPE_IP); 254 break; 255 256 case AF_ARP: 257 ah = mtod(m, struct arphdr *); 258 if (m->m_flags & M_BCAST) { 259 memcpy(edst, etherbroadcastaddr, sizeof(edst)); 260 } else { 261 void *tha = ar_tha(ah); 262 263 if (tha == NULL) { 264 /* fake with ARPHRD_IEEE1394 */ 265 m_freem(m); 266 return 0; 267 } 268 memcpy(edst, tha, sizeof(edst)); 269 } 270 271 ah->ar_hrd = htons(ARPHRD_ETHER); 272 273 switch (ntohs(ah->ar_op)) { 274 case ARPOP_REVREQUEST: 275 case ARPOP_REVREPLY: 276 etype = htons(ETHERTYPE_REVARP); 277 break; 278 279 case ARPOP_REQUEST: 280 case ARPOP_REPLY: 281 default: 282 etype = htons(ETHERTYPE_ARP); 283 } 284 break; 285 #endif 286 287 #ifdef INET6 288 case AF_INET6: 289 if (m->m_flags & M_BCAST) { 290 memcpy(edst, etherbroadcastaddr, sizeof(edst)); 291 } else if (m->m_flags & M_MCAST) { 292 ETHER_MAP_IPV6_MULTICAST(&satocsin6(dst)->sin6_addr, 293 edst); 294 } else { 295 error = nd6_resolve(ifp0, rt, m, dst, edst, 296 sizeof(edst)); 297 if (error) 298 return (error == EWOULDBLOCK) ? 0 : error; 299 } 300 etype = htons(ETHERTYPE_IPV6); 301 break; 302 #endif 303 304 #ifdef NETATALK 305 case AF_APPLETALK: { 306 struct ifaddr *ifa; 307 int s; 308 309 KERNEL_LOCK(1, NULL); 310 311 if (!aarpresolve(ifp, m, (const struct sockaddr_at *)dst, edst)) { 312 KERNEL_UNLOCK_ONE(NULL); 313 return 0; 314 } 315 316 /* 317 * ifaddr is the first thing in at_ifaddr 318 */ 319 s = pserialize_read_enter(); 320 ifa = at_ifawithnet((const struct sockaddr_at *)dst, ifp); 321 if (ifa == NULL) { 322 pserialize_read_exit(s); 323 KERNEL_UNLOCK_ONE(NULL); 324 senderr(EADDRNOTAVAIL); 325 } 326 aa = (struct at_ifaddr *)ifa; 327 328 /* 329 * In the phase 2 case, we need to prepend an mbuf for the 330 * llc header. 331 */ 332 if (aa->aa_flags & AFA_PHASE2) { 333 struct llc llc; 334 335 M_PREPEND(m, sizeof(struct llc), M_DONTWAIT); 336 if (m == NULL) { 337 pserialize_read_exit(s); 338 KERNEL_UNLOCK_ONE(NULL); 339 senderr(ENOBUFS); 340 } 341 342 llc.llc_dsap = llc.llc_ssap = LLC_SNAP_LSAP; 343 llc.llc_control = LLC_UI; 344 memcpy(llc.llc_snap_org_code, at_org_code, 345 sizeof(llc.llc_snap_org_code)); 346 llc.llc_snap_ether_type = htons(ETHERTYPE_ATALK); 347 memcpy(mtod(m, void *), &llc, sizeof(struct llc)); 348 } else { 349 etype = htons(ETHERTYPE_ATALK); 350 } 351 pserialize_read_exit(s); 352 KERNEL_UNLOCK_ONE(NULL); 353 break; 354 } 355 #endif /* NETATALK */ 356 357 case pseudo_AF_HDRCMPLT: 358 hdrcmplt = 1; 359 memcpy(esrc, 360 ((const struct ether_header *)dst->sa_data)->ether_shost, 361 sizeof(esrc)); 362 /* FALLTHROUGH */ 363 364 case AF_UNSPEC: 365 memcpy(edst, 366 ((const struct ether_header *)dst->sa_data)->ether_dhost, 367 sizeof(edst)); 368 /* AF_UNSPEC doesn't swap the byte order of the ether_type. */ 369 etype = ((const struct ether_header *)dst->sa_data)->ether_type; 370 break; 371 372 default: 373 printf("%s: can't handle af%d\n", ifp->if_xname, 374 dst->sa_family); 375 senderr(EAFNOSUPPORT); 376 } 377 378 #ifdef MPLS 379 { 380 struct m_tag *mtag; 381 mtag = m_tag_find(m, PACKET_TAG_MPLS); 382 if (mtag != NULL) { 383 /* Having the tag itself indicates it's MPLS */ 384 etype = htons(ETHERTYPE_MPLS); 385 m_tag_delete(m, mtag); 386 } 387 } 388 #endif 389 390 if (mcopy) 391 (void)looutput(ifp, mcopy, dst, rt); 392 393 KASSERT((m->m_flags & M_PKTHDR) != 0); 394 395 /* 396 * If no ether type is set, this must be a 802.2 formatted packet. 397 */ 398 if (etype == 0) 399 etype = htons(m->m_pkthdr.len); 400 401 /* 402 * Add local net header. If no space in first mbuf, allocate another. 403 */ 404 M_PREPEND(m, sizeof(struct ether_header), M_DONTWAIT); 405 if (m == NULL) 406 senderr(ENOBUFS); 407 408 eh = mtod(m, struct ether_header *); 409 /* Note: etype is already in network byte order. */ 410 memcpy(&eh->ether_type, &etype, sizeof(eh->ether_type)); 411 memcpy(eh->ether_dhost, edst, sizeof(edst)); 412 if (hdrcmplt) { 413 memcpy(eh->ether_shost, esrc, sizeof(eh->ether_shost)); 414 } else { 415 memcpy(eh->ether_shost, CLLADDR(ifp->if_sadl), 416 sizeof(eh->ether_shost)); 417 } 418 419 #if NCARP > 0 420 if (ifp0 != ifp && ifp0->if_type == IFT_CARP) { 421 memcpy(eh->ether_shost, CLLADDR(ifp0->if_sadl), 422 sizeof(eh->ether_shost)); 423 } 424 #endif 425 426 if ((error = pfil_run_hooks(ifp->if_pfil, &m, ifp, PFIL_OUT)) != 0) 427 return error; 428 if (m == NULL) 429 return 0; 430 431 #if NBRIDGE > 0 432 /* 433 * Bridges require special output handling. 434 */ 435 if (ifp->if_bridge) 436 return bridge_output(ifp, m, NULL, NULL); 437 #endif 438 439 #if NCARP > 0 440 if (ifp != ifp0) 441 if_statadd(ifp0, if_obytes, m->m_pkthdr.len + ETHER_HDR_LEN); 442 #endif 443 444 #ifdef ALTQ 445 KERNEL_LOCK(1, NULL); 446 /* 447 * If ALTQ is enabled on the parent interface, do 448 * classification; the queueing discipline might not 449 * require classification, but might require the 450 * address family/header pointer in the pktattr. 451 */ 452 if (ALTQ_IS_ENABLED(&ifp->if_snd)) 453 altq_etherclassify(&ifp->if_snd, m); 454 KERNEL_UNLOCK_ONE(NULL); 455 #endif 456 return ifq_enqueue(ifp, m); 457 458 bad: 459 if (m) 460 m_freem(m); 461 return error; 462 } 463 464 #ifdef ALTQ 465 /* 466 * This routine is a slight hack to allow a packet to be classified 467 * if the Ethernet headers are present. It will go away when ALTQ's 468 * classification engine understands link headers. 469 * 470 * XXX: We may need to do m_pullups here. First to ensure struct ether_header 471 * is indeed contiguous, then to read the LLC and so on. 472 */ 473 void 474 altq_etherclassify(struct ifaltq *ifq, struct mbuf *m) 475 { 476 struct ether_header *eh; 477 struct mbuf *mtop = m; 478 uint16_t ether_type; 479 int hlen, af, hdrsize; 480 void *hdr; 481 482 KASSERT((mtop->m_flags & M_PKTHDR) != 0); 483 484 hlen = ETHER_HDR_LEN; 485 eh = mtod(m, struct ether_header *); 486 487 ether_type = htons(eh->ether_type); 488 489 if (ether_type < ETHERMTU) { 490 /* LLC/SNAP */ 491 struct llc *llc = (struct llc *)(eh + 1); 492 hlen += 8; 493 494 if (m->m_len < hlen || 495 llc->llc_dsap != LLC_SNAP_LSAP || 496 llc->llc_ssap != LLC_SNAP_LSAP || 497 llc->llc_control != LLC_UI) { 498 /* Not SNAP. */ 499 goto bad; 500 } 501 502 ether_type = htons(llc->llc_un.type_snap.ether_type); 503 } 504 505 switch (ether_type) { 506 case ETHERTYPE_IP: 507 af = AF_INET; 508 hdrsize = 20; /* sizeof(struct ip) */ 509 break; 510 511 case ETHERTYPE_IPV6: 512 af = AF_INET6; 513 hdrsize = 40; /* sizeof(struct ip6_hdr) */ 514 break; 515 516 default: 517 af = AF_UNSPEC; 518 hdrsize = 0; 519 break; 520 } 521 522 while (m->m_len <= hlen) { 523 hlen -= m->m_len; 524 m = m->m_next; 525 if (m == NULL) 526 goto bad; 527 } 528 529 if (m->m_len < (hlen + hdrsize)) { 530 /* 531 * protocol header not in a single mbuf. 532 * We can't cope with this situation right 533 * now (but it shouldn't ever happen, really, anyhow). 534 */ 535 #ifdef DEBUG 536 printf("altq_etherclassify: headers span multiple mbufs: " 537 "%d < %d\n", m->m_len, (hlen + hdrsize)); 538 #endif 539 goto bad; 540 } 541 542 m->m_data += hlen; 543 m->m_len -= hlen; 544 545 hdr = mtod(m, void *); 546 547 if (ALTQ_NEEDS_CLASSIFY(ifq)) { 548 mtop->m_pkthdr.pattr_class = 549 (*ifq->altq_classify)(ifq->altq_clfier, m, af); 550 } 551 mtop->m_pkthdr.pattr_af = af; 552 mtop->m_pkthdr.pattr_hdr = hdr; 553 554 m->m_data -= hlen; 555 m->m_len += hlen; 556 557 return; 558 559 bad: 560 mtop->m_pkthdr.pattr_class = NULL; 561 mtop->m_pkthdr.pattr_hdr = NULL; 562 mtop->m_pkthdr.pattr_af = AF_UNSPEC; 563 } 564 #endif /* ALTQ */ 565 566 /* 567 * Process a received Ethernet packet; 568 * the packet is in the mbuf chain m with 569 * the ether header. 570 */ 571 void 572 ether_input(struct ifnet *ifp, struct mbuf *m) 573 { 574 struct ethercom *ec = (struct ethercom *) ifp; 575 pktqueue_t *pktq = NULL; 576 struct ifqueue *inq = NULL; 577 uint16_t etype; 578 struct ether_header *eh; 579 size_t ehlen; 580 static int earlypkts; 581 int isr = 0; 582 #if defined (LLC) || defined(NETATALK) 583 struct llc *l; 584 #endif 585 586 KASSERT(!cpu_intr_p()); 587 KASSERT((m->m_flags & M_PKTHDR) != 0); 588 589 if ((ifp->if_flags & IFF_UP) == 0) { 590 m_freem(m); 591 return; 592 } 593 if (m->m_len < sizeof(*eh)) { 594 m = m_pullup(m, sizeof(*eh)); 595 if (m == NULL) 596 return; 597 } 598 599 #ifdef MBUFTRACE 600 m_claimm(m, &ec->ec_rx_mowner); 601 #endif 602 eh = mtod(m, struct ether_header *); 603 etype = ntohs(eh->ether_type); 604 ehlen = sizeof(*eh); 605 606 if (__predict_false(earlypkts < 100 || 607 entropy_epoch() == (unsigned)-1)) { 608 rnd_add_data(NULL, eh, ehlen, 0); 609 earlypkts++; 610 } 611 612 /* 613 * Determine if the packet is within its size limits. For MPLS the 614 * header length is variable, so we skip the check. 615 */ 616 if (etype != ETHERTYPE_MPLS && m->m_pkthdr.len > 617 ETHER_MAX_FRAME(ifp, etype, m->m_flags & M_HASFCS)) { 618 #ifdef DIAGNOSTIC 619 mutex_enter(&bigpktpps_lock); 620 if (ppsratecheck(&bigpktppslim_last, &bigpktpps_count, 621 bigpktppslim)) { 622 printf("%s: discarding oversize frame (len=%d)\n", 623 ifp->if_xname, m->m_pkthdr.len); 624 } 625 mutex_exit(&bigpktpps_lock); 626 #endif 627 if_statinc(ifp, if_iqdrops); 628 m_freem(m); 629 return; 630 } 631 632 if (ETHER_IS_MULTICAST(eh->ether_dhost)) { 633 /* 634 * If this is not a simplex interface, drop the packet 635 * if it came from us. 636 */ 637 if ((ifp->if_flags & IFF_SIMPLEX) == 0 && 638 memcmp(CLLADDR(ifp->if_sadl), eh->ether_shost, 639 ETHER_ADDR_LEN) == 0) { 640 m_freem(m); 641 return; 642 } 643 644 if (memcmp(etherbroadcastaddr, 645 eh->ether_dhost, ETHER_ADDR_LEN) == 0) 646 m->m_flags |= M_BCAST; 647 else 648 m->m_flags |= M_MCAST; 649 if_statinc(ifp, if_imcasts); 650 } 651 652 /* If the CRC is still on the packet, trim it off. */ 653 if (m->m_flags & M_HASFCS) { 654 m_adj(m, -ETHER_CRC_LEN); 655 m->m_flags &= ~M_HASFCS; 656 } 657 658 if_statadd(ifp, if_ibytes, m->m_pkthdr.len); 659 660 #if NCARP > 0 661 if (__predict_false(ifp->if_carp && ifp->if_type != IFT_CARP)) { 662 /* 663 * Clear M_PROMISC, in case the packet comes from a 664 * vlan. 665 */ 666 m->m_flags &= ~M_PROMISC; 667 if (carp_input(m, (uint8_t *)&eh->ether_shost, 668 (uint8_t *)&eh->ether_dhost, eh->ether_type) == 0) 669 return; 670 } 671 #endif 672 673 if ((m->m_flags & (M_BCAST | M_MCAST | M_PROMISC)) == 0 && 674 (ifp->if_flags & IFF_PROMISC) != 0 && 675 memcmp(CLLADDR(ifp->if_sadl), eh->ether_dhost, 676 ETHER_ADDR_LEN) != 0) { 677 m->m_flags |= M_PROMISC; 678 } 679 680 if ((m->m_flags & M_PROMISC) == 0) { 681 if (pfil_run_hooks(ifp->if_pfil, &m, ifp, PFIL_IN) != 0) 682 return; 683 if (m == NULL) 684 return; 685 686 eh = mtod(m, struct ether_header *); 687 etype = ntohs(eh->ether_type); 688 } 689 690 #if NAGR > 0 691 if (ifp->if_agrprivate && 692 __predict_true(etype != ETHERTYPE_SLOWPROTOCOLS)) { 693 m->m_flags &= ~M_PROMISC; 694 agr_input(ifp, m); 695 return; 696 } 697 #endif 698 699 /* 700 * If VLANs are configured on the interface, check to 701 * see if the device performed the decapsulation and 702 * provided us with the tag. 703 */ 704 if (ec->ec_nvlans && vlan_has_tag(m)) { 705 #if NVLAN > 0 706 /* 707 * vlan_input() will either recursively call ether_input() 708 * or drop the packet. 709 */ 710 vlan_input(ifp, m); 711 #else 712 m_freem(m); 713 #endif 714 return; 715 } 716 717 /* 718 * Handle protocols that expect to have the Ethernet header 719 * (and possibly FCS) intact. 720 */ 721 switch (etype) { 722 case ETHERTYPE_VLAN: { 723 struct ether_vlan_header *evl = (void *)eh; 724 725 /* 726 * If there is a tag of 0, then the VLAN header was probably 727 * just being used to store the priority. Extract the ether 728 * type, and if IP or IPV6, let them deal with it. 729 */ 730 if (m->m_len >= sizeof(*evl) && 731 EVL_VLANOFTAG(evl->evl_tag) == 0) { 732 etype = ntohs(evl->evl_proto); 733 ehlen = sizeof(*evl); 734 if ((m->m_flags & M_PROMISC) == 0 && 735 (etype == ETHERTYPE_IP || 736 etype == ETHERTYPE_IPV6)) 737 break; 738 } 739 740 #if NVLAN > 0 741 /* 742 * vlan_input() will either recursively call ether_input() 743 * or drop the packet. 744 */ 745 if (ec->ec_nvlans != 0) 746 vlan_input(ifp, m); 747 else 748 #endif 749 m_freem(m); 750 751 return; 752 } 753 754 #if NPPPOE > 0 755 case ETHERTYPE_PPPOEDISC: 756 pppoedisc_input(ifp, m); 757 return; 758 759 case ETHERTYPE_PPPOE: 760 pppoe_input(ifp, m); 761 return; 762 #endif 763 764 case ETHERTYPE_SLOWPROTOCOLS: { 765 uint8_t subtype; 766 767 if (m->m_pkthdr.len < sizeof(*eh) + sizeof(subtype)) { 768 m_freem(m); 769 return; 770 } 771 772 m_copydata(m, sizeof(*eh), sizeof(subtype), &subtype); 773 switch (subtype) { 774 #if NAGR > 0 775 case SLOWPROTOCOLS_SUBTYPE_LACP: 776 if (ifp->if_agrprivate) { 777 ieee8023ad_lacp_input(ifp, m); 778 return; 779 } 780 break; 781 782 case SLOWPROTOCOLS_SUBTYPE_MARKER: 783 if (ifp->if_agrprivate) { 784 ieee8023ad_marker_input(ifp, m); 785 return; 786 } 787 break; 788 #endif 789 790 default: 791 if (subtype == 0 || subtype > 10) { 792 /* illegal value */ 793 m_freem(m); 794 return; 795 } 796 /* unknown subtype */ 797 break; 798 } 799 } 800 /* FALLTHROUGH */ 801 default: 802 if (m->m_flags & M_PROMISC) { 803 m_freem(m); 804 return; 805 } 806 } 807 808 /* If the CRC is still on the packet, trim it off. */ 809 if (m->m_flags & M_HASFCS) { 810 m_adj(m, -ETHER_CRC_LEN); 811 m->m_flags &= ~M_HASFCS; 812 } 813 814 if (etype > ETHERMTU + sizeof(struct ether_header)) { 815 /* Strip off the Ethernet header. */ 816 m_adj(m, ehlen); 817 818 switch (etype) { 819 #ifdef INET 820 case ETHERTYPE_IP: 821 #ifdef GATEWAY 822 if (ipflow_fastforward(m)) 823 return; 824 #endif 825 pktq = ip_pktq; 826 break; 827 828 case ETHERTYPE_ARP: 829 isr = NETISR_ARP; 830 inq = &arpintrq; 831 break; 832 833 case ETHERTYPE_REVARP: 834 revarpinput(m); /* XXX queue? */ 835 return; 836 #endif 837 838 #ifdef INET6 839 case ETHERTYPE_IPV6: 840 if (__predict_false(!in6_present)) { 841 m_freem(m); 842 return; 843 } 844 #ifdef GATEWAY 845 if (ip6flow_fastforward(&m)) 846 return; 847 #endif 848 pktq = ip6_pktq; 849 break; 850 #endif 851 852 #ifdef NETATALK 853 case ETHERTYPE_ATALK: 854 isr = NETISR_ATALK; 855 inq = &atintrq1; 856 break; 857 858 case ETHERTYPE_AARP: 859 aarpinput(ifp, m); /* XXX queue? */ 860 return; 861 #endif 862 863 #ifdef MPLS 864 case ETHERTYPE_MPLS: 865 isr = NETISR_MPLS; 866 inq = &mplsintrq; 867 break; 868 #endif 869 870 default: 871 m_freem(m); 872 return; 873 } 874 } else { 875 KASSERT(ehlen == sizeof(*eh)); 876 #if defined (LLC) || defined (NETATALK) 877 if (m->m_len < sizeof(*eh) + sizeof(struct llc)) { 878 goto dropanyway; 879 } 880 l = (struct llc *)(eh+1); 881 882 switch (l->llc_dsap) { 883 #ifdef NETATALK 884 case LLC_SNAP_LSAP: 885 switch (l->llc_control) { 886 case LLC_UI: 887 if (l->llc_ssap != LLC_SNAP_LSAP) { 888 goto dropanyway; 889 } 890 891 if (memcmp(&(l->llc_snap_org_code)[0], 892 at_org_code, sizeof(at_org_code)) == 0 && 893 ntohs(l->llc_snap_ether_type) == 894 ETHERTYPE_ATALK) { 895 inq = &atintrq2; 896 m_adj(m, sizeof(struct ether_header) 897 + sizeof(struct llc)); 898 isr = NETISR_ATALK; 899 break; 900 } 901 902 if (memcmp(&(l->llc_snap_org_code)[0], 903 aarp_org_code, 904 sizeof(aarp_org_code)) == 0 && 905 ntohs(l->llc_snap_ether_type) == 906 ETHERTYPE_AARP) { 907 m_adj(m, sizeof(struct ether_header) 908 + sizeof(struct llc)); 909 aarpinput(ifp, m); /* XXX queue? */ 910 return; 911 } 912 913 default: 914 goto dropanyway; 915 } 916 break; 917 #endif 918 dropanyway: 919 default: 920 m_freem(m); 921 return; 922 } 923 #else /* LLC || NETATALK */ 924 m_freem(m); 925 return; 926 #endif /* LLC || NETATALK */ 927 } 928 929 if (__predict_true(pktq)) { 930 #ifdef NET_MPSAFE 931 const u_int h = curcpu()->ci_index; 932 #else 933 const uint32_t h = pktq_rps_hash(m); 934 #endif 935 if (__predict_false(!pktq_enqueue(pktq, m, h))) { 936 m_freem(m); 937 } 938 return; 939 } 940 941 if (__predict_false(!inq)) { 942 /* Should not happen. */ 943 m_freem(m); 944 return; 945 } 946 947 IFQ_LOCK(inq); 948 if (IF_QFULL(inq)) { 949 IF_DROP(inq); 950 IFQ_UNLOCK(inq); 951 m_freem(m); 952 } else { 953 IF_ENQUEUE(inq, m); 954 IFQ_UNLOCK(inq); 955 schednetisr(isr); 956 } 957 } 958 959 /* 960 * Convert Ethernet address to printable (loggable) representation. 961 */ 962 char * 963 ether_sprintf(const u_char *ap) 964 { 965 static char etherbuf[3 * ETHER_ADDR_LEN]; 966 return ether_snprintf(etherbuf, sizeof(etherbuf), ap); 967 } 968 969 char * 970 ether_snprintf(char *buf, size_t len, const u_char *ap) 971 { 972 char *cp = buf; 973 size_t i; 974 975 for (i = 0; i < len / 3; i++) { 976 *cp++ = hexdigits[*ap >> 4]; 977 *cp++ = hexdigits[*ap++ & 0xf]; 978 *cp++ = ':'; 979 } 980 *--cp = '\0'; 981 return buf; 982 } 983 984 /* 985 * Perform common duties while attaching to interface list 986 */ 987 void 988 ether_ifattach(struct ifnet *ifp, const uint8_t *lla) 989 { 990 struct ethercom *ec = (struct ethercom *)ifp; 991 992 ifp->if_type = IFT_ETHER; 993 ifp->if_hdrlen = ETHER_HDR_LEN; 994 ifp->if_dlt = DLT_EN10MB; 995 ifp->if_mtu = ETHERMTU; 996 ifp->if_output = ether_output; 997 ifp->_if_input = ether_input; 998 if (ifp->if_baudrate == 0) 999 ifp->if_baudrate = IF_Mbps(10); /* just a default */ 1000 1001 if (lla != NULL) 1002 if_set_sadl(ifp, lla, ETHER_ADDR_LEN, !ETHER_IS_LOCAL(lla)); 1003 1004 LIST_INIT(&ec->ec_multiaddrs); 1005 SIMPLEQ_INIT(&ec->ec_vids); 1006 ec->ec_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET); 1007 ec->ec_flags = 0; 1008 ifp->if_broadcastaddr = etherbroadcastaddr; 1009 bpf_attach(ifp, DLT_EN10MB, sizeof(struct ether_header)); 1010 #ifdef MBUFTRACE 1011 mowner_init_owner(&ec->ec_tx_mowner, ifp->if_xname, "tx"); 1012 mowner_init_owner(&ec->ec_rx_mowner, ifp->if_xname, "rx"); 1013 MOWNER_ATTACH(&ec->ec_tx_mowner); 1014 MOWNER_ATTACH(&ec->ec_rx_mowner); 1015 ifp->if_mowner = &ec->ec_tx_mowner; 1016 #endif 1017 } 1018 1019 void 1020 ether_ifdetach(struct ifnet *ifp) 1021 { 1022 struct ethercom *ec = (void *) ifp; 1023 struct ether_multi *enm; 1024 1025 IFNET_ASSERT_UNLOCKED(ifp); 1026 /* 1027 * Prevent further calls to ioctl (for example turning off 1028 * promiscuous mode from the bridge code), which eventually can 1029 * call if_init() which can cause panics because the interface 1030 * is in the process of being detached. Return device not configured 1031 * instead. 1032 */ 1033 ifp->if_ioctl = __FPTRCAST(int (*)(struct ifnet *, u_long, void *), 1034 enxio); 1035 1036 #if NBRIDGE > 0 1037 if (ifp->if_bridge) 1038 bridge_ifdetach(ifp); 1039 #endif 1040 bpf_detach(ifp); 1041 #if NVLAN > 0 1042 if (ec->ec_nvlans) 1043 vlan_ifdetach(ifp); 1044 #endif 1045 1046 ETHER_LOCK(ec); 1047 KASSERT(ec->ec_nvlans == 0); 1048 while ((enm = LIST_FIRST(&ec->ec_multiaddrs)) != NULL) { 1049 LIST_REMOVE(enm, enm_list); 1050 kmem_free(enm, sizeof(*enm)); 1051 ec->ec_multicnt--; 1052 } 1053 ETHER_UNLOCK(ec); 1054 1055 mutex_obj_free(ec->ec_lock); 1056 ec->ec_lock = NULL; 1057 1058 ifp->if_mowner = NULL; 1059 MOWNER_DETACH(&ec->ec_rx_mowner); 1060 MOWNER_DETACH(&ec->ec_tx_mowner); 1061 } 1062 1063 #if 0 1064 /* 1065 * This is for reference. We have a table-driven version 1066 * of the little-endian crc32 generator, which is faster 1067 * than the double-loop. 1068 */ 1069 uint32_t 1070 ether_crc32_le(const uint8_t *buf, size_t len) 1071 { 1072 uint32_t c, crc, carry; 1073 size_t i, j; 1074 1075 crc = 0xffffffffU; /* initial value */ 1076 1077 for (i = 0; i < len; i++) { 1078 c = buf[i]; 1079 for (j = 0; j < 8; j++) { 1080 carry = ((crc & 0x01) ? 1 : 0) ^ (c & 0x01); 1081 crc >>= 1; 1082 c >>= 1; 1083 if (carry) 1084 crc = (crc ^ ETHER_CRC_POLY_LE); 1085 } 1086 } 1087 1088 return (crc); 1089 } 1090 #else 1091 uint32_t 1092 ether_crc32_le(const uint8_t *buf, size_t len) 1093 { 1094 static const uint32_t crctab[] = { 1095 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 1096 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, 1097 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 1098 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c 1099 }; 1100 uint32_t crc; 1101 size_t i; 1102 1103 crc = 0xffffffffU; /* initial value */ 1104 1105 for (i = 0; i < len; i++) { 1106 crc ^= buf[i]; 1107 crc = (crc >> 4) ^ crctab[crc & 0xf]; 1108 crc = (crc >> 4) ^ crctab[crc & 0xf]; 1109 } 1110 1111 return (crc); 1112 } 1113 #endif 1114 1115 uint32_t 1116 ether_crc32_be(const uint8_t *buf, size_t len) 1117 { 1118 uint32_t c, crc, carry; 1119 size_t i, j; 1120 1121 crc = 0xffffffffU; /* initial value */ 1122 1123 for (i = 0; i < len; i++) { 1124 c = buf[i]; 1125 for (j = 0; j < 8; j++) { 1126 carry = ((crc & 0x80000000U) ? 1 : 0) ^ (c & 0x01); 1127 crc <<= 1; 1128 c >>= 1; 1129 if (carry) 1130 crc = (crc ^ ETHER_CRC_POLY_BE) | carry; 1131 } 1132 } 1133 1134 return (crc); 1135 } 1136 1137 #ifdef INET 1138 const uint8_t ether_ipmulticast_min[ETHER_ADDR_LEN] = 1139 { 0x01, 0x00, 0x5e, 0x00, 0x00, 0x00 }; 1140 const uint8_t ether_ipmulticast_max[ETHER_ADDR_LEN] = 1141 { 0x01, 0x00, 0x5e, 0x7f, 0xff, 0xff }; 1142 #endif 1143 #ifdef INET6 1144 const uint8_t ether_ip6multicast_min[ETHER_ADDR_LEN] = 1145 { 0x33, 0x33, 0x00, 0x00, 0x00, 0x00 }; 1146 const uint8_t ether_ip6multicast_max[ETHER_ADDR_LEN] = 1147 { 0x33, 0x33, 0xff, 0xff, 0xff, 0xff }; 1148 #endif 1149 1150 /* 1151 * ether_aton implementation, not using a static buffer. 1152 */ 1153 int 1154 ether_aton_r(u_char *dest, size_t len, const char *str) 1155 { 1156 const u_char *cp = (const void *)str; 1157 u_char *ep; 1158 1159 #define atox(c) (((c) <= '9') ? ((c) - '0') : ((toupper(c) - 'A') + 10)) 1160 1161 if (len < ETHER_ADDR_LEN) 1162 return ENOSPC; 1163 1164 ep = dest + ETHER_ADDR_LEN; 1165 1166 while (*cp) { 1167 if (!isxdigit(*cp)) 1168 return EINVAL; 1169 1170 *dest = atox(*cp); 1171 cp++; 1172 if (isxdigit(*cp)) { 1173 *dest = (*dest << 4) | atox(*cp); 1174 cp++; 1175 } 1176 dest++; 1177 1178 if (dest == ep) 1179 return (*cp == '\0') ? 0 : ENAMETOOLONG; 1180 1181 switch (*cp) { 1182 case ':': 1183 case '-': 1184 case '.': 1185 cp++; 1186 break; 1187 } 1188 } 1189 return ENOBUFS; 1190 } 1191 1192 /* 1193 * Convert a sockaddr into an Ethernet address or range of Ethernet 1194 * addresses. 1195 */ 1196 int 1197 ether_multiaddr(const struct sockaddr *sa, uint8_t addrlo[ETHER_ADDR_LEN], 1198 uint8_t addrhi[ETHER_ADDR_LEN]) 1199 { 1200 #ifdef INET 1201 const struct sockaddr_in *sin; 1202 #endif 1203 #ifdef INET6 1204 const struct sockaddr_in6 *sin6; 1205 #endif 1206 1207 switch (sa->sa_family) { 1208 1209 case AF_UNSPEC: 1210 memcpy(addrlo, sa->sa_data, ETHER_ADDR_LEN); 1211 memcpy(addrhi, addrlo, ETHER_ADDR_LEN); 1212 break; 1213 1214 #ifdef INET 1215 case AF_INET: 1216 sin = satocsin(sa); 1217 if (sin->sin_addr.s_addr == INADDR_ANY) { 1218 /* 1219 * An IP address of INADDR_ANY means listen to 1220 * or stop listening to all of the Ethernet 1221 * multicast addresses used for IP. 1222 * (This is for the sake of IP multicast routers.) 1223 */ 1224 memcpy(addrlo, ether_ipmulticast_min, ETHER_ADDR_LEN); 1225 memcpy(addrhi, ether_ipmulticast_max, ETHER_ADDR_LEN); 1226 } else { 1227 ETHER_MAP_IP_MULTICAST(&sin->sin_addr, addrlo); 1228 memcpy(addrhi, addrlo, ETHER_ADDR_LEN); 1229 } 1230 break; 1231 #endif 1232 #ifdef INET6 1233 case AF_INET6: 1234 sin6 = satocsin6(sa); 1235 if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { 1236 /* 1237 * An IP6 address of 0 means listen to or stop 1238 * listening to all of the Ethernet multicast 1239 * address used for IP6. 1240 * (This is used for multicast routers.) 1241 */ 1242 memcpy(addrlo, ether_ip6multicast_min, ETHER_ADDR_LEN); 1243 memcpy(addrhi, ether_ip6multicast_max, ETHER_ADDR_LEN); 1244 } else { 1245 ETHER_MAP_IPV6_MULTICAST(&sin6->sin6_addr, addrlo); 1246 memcpy(addrhi, addrlo, ETHER_ADDR_LEN); 1247 } 1248 break; 1249 #endif 1250 1251 default: 1252 return EAFNOSUPPORT; 1253 } 1254 return 0; 1255 } 1256 1257 /* 1258 * Add an Ethernet multicast address or range of addresses to the list for a 1259 * given interface. 1260 */ 1261 int 1262 ether_addmulti(const struct sockaddr *sa, struct ethercom *ec) 1263 { 1264 struct ether_multi *enm, *_enm; 1265 u_char addrlo[ETHER_ADDR_LEN]; 1266 u_char addrhi[ETHER_ADDR_LEN]; 1267 int error = 0; 1268 1269 /* Allocate out of lock */ 1270 enm = kmem_alloc(sizeof(*enm), KM_SLEEP); 1271 1272 ETHER_LOCK(ec); 1273 error = ether_multiaddr(sa, addrlo, addrhi); 1274 if (error != 0) 1275 goto out; 1276 1277 /* 1278 * Verify that we have valid Ethernet multicast addresses. 1279 */ 1280 if (!ETHER_IS_MULTICAST(addrlo) || !ETHER_IS_MULTICAST(addrhi)) { 1281 error = EINVAL; 1282 goto out; 1283 } 1284 1285 /* 1286 * See if the address range is already in the list. 1287 */ 1288 _enm = ether_lookup_multi(addrlo, addrhi, ec); 1289 if (_enm != NULL) { 1290 /* 1291 * Found it; just increment the reference count. 1292 */ 1293 ++_enm->enm_refcount; 1294 error = 0; 1295 goto out; 1296 } 1297 1298 /* 1299 * Link a new multicast record into the interface's multicast list. 1300 */ 1301 memcpy(enm->enm_addrlo, addrlo, ETHER_ADDR_LEN); 1302 memcpy(enm->enm_addrhi, addrhi, ETHER_ADDR_LEN); 1303 enm->enm_refcount = 1; 1304 LIST_INSERT_HEAD(&ec->ec_multiaddrs, enm, enm_list); 1305 ec->ec_multicnt++; 1306 1307 /* 1308 * Return ENETRESET to inform the driver that the list has changed 1309 * and its reception filter should be adjusted accordingly. 1310 */ 1311 error = ENETRESET; 1312 enm = NULL; 1313 1314 out: 1315 ETHER_UNLOCK(ec); 1316 if (enm != NULL) 1317 kmem_free(enm, sizeof(*enm)); 1318 return error; 1319 } 1320 1321 /* 1322 * Delete a multicast address record. 1323 */ 1324 int 1325 ether_delmulti(const struct sockaddr *sa, struct ethercom *ec) 1326 { 1327 struct ether_multi *enm; 1328 u_char addrlo[ETHER_ADDR_LEN]; 1329 u_char addrhi[ETHER_ADDR_LEN]; 1330 int error; 1331 1332 ETHER_LOCK(ec); 1333 error = ether_multiaddr(sa, addrlo, addrhi); 1334 if (error != 0) 1335 goto error; 1336 1337 /* 1338 * Look up the address in our list. 1339 */ 1340 enm = ether_lookup_multi(addrlo, addrhi, ec); 1341 if (enm == NULL) { 1342 error = ENXIO; 1343 goto error; 1344 } 1345 if (--enm->enm_refcount != 0) { 1346 /* 1347 * Still some claims to this record. 1348 */ 1349 error = 0; 1350 goto error; 1351 } 1352 1353 /* 1354 * No remaining claims to this record; unlink and free it. 1355 */ 1356 LIST_REMOVE(enm, enm_list); 1357 ec->ec_multicnt--; 1358 ETHER_UNLOCK(ec); 1359 kmem_free(enm, sizeof(*enm)); 1360 1361 /* 1362 * Return ENETRESET to inform the driver that the list has changed 1363 * and its reception filter should be adjusted accordingly. 1364 */ 1365 return ENETRESET; 1366 1367 error: 1368 ETHER_UNLOCK(ec); 1369 return error; 1370 } 1371 1372 void 1373 ether_set_ifflags_cb(struct ethercom *ec, ether_cb_t cb) 1374 { 1375 ec->ec_ifflags_cb = cb; 1376 } 1377 1378 void 1379 ether_set_vlan_cb(struct ethercom *ec, ether_vlancb_t cb) 1380 { 1381 1382 ec->ec_vlan_cb = cb; 1383 } 1384 1385 static int 1386 ether_ioctl_reinit(struct ethercom *ec) 1387 { 1388 struct ifnet *ifp = &ec->ec_if; 1389 int error; 1390 1391 switch (ifp->if_flags & (IFF_UP | IFF_RUNNING)) { 1392 case IFF_RUNNING: 1393 /* 1394 * If interface is marked down and it is running, 1395 * then stop and disable it. 1396 */ 1397 (*ifp->if_stop)(ifp, 1); 1398 break; 1399 case IFF_UP: 1400 /* 1401 * If interface is marked up and it is stopped, then 1402 * start it. 1403 */ 1404 return (*ifp->if_init)(ifp); 1405 case IFF_UP | IFF_RUNNING: 1406 error = 0; 1407 if (ec->ec_ifflags_cb != NULL) { 1408 error = (*ec->ec_ifflags_cb)(ec); 1409 if (error == ENETRESET) { 1410 /* 1411 * Reset the interface to pick up 1412 * changes in any other flags that 1413 * affect the hardware state. 1414 */ 1415 return (*ifp->if_init)(ifp); 1416 } 1417 } else 1418 error = (*ifp->if_init)(ifp); 1419 return error; 1420 case 0: 1421 break; 1422 } 1423 1424 return 0; 1425 } 1426 1427 /* 1428 * Common ioctls for Ethernet interfaces. Note, we must be 1429 * called at splnet(). 1430 */ 1431 int 1432 ether_ioctl(struct ifnet *ifp, u_long cmd, void *data) 1433 { 1434 struct ethercom *ec = (void *)ifp; 1435 struct eccapreq *eccr; 1436 struct ifreq *ifr = (struct ifreq *)data; 1437 struct if_laddrreq *iflr = data; 1438 const struct sockaddr_dl *sdl; 1439 static const uint8_t zero[ETHER_ADDR_LEN]; 1440 int error; 1441 1442 switch (cmd) { 1443 case SIOCINITIFADDR: 1444 { 1445 struct ifaddr *ifa = (struct ifaddr *)data; 1446 if (ifa->ifa_addr->sa_family != AF_LINK 1447 && (ifp->if_flags & (IFF_UP | IFF_RUNNING)) != 1448 (IFF_UP | IFF_RUNNING)) { 1449 ifp->if_flags |= IFF_UP; 1450 if ((error = (*ifp->if_init)(ifp)) != 0) 1451 return error; 1452 } 1453 #ifdef INET 1454 if (ifa->ifa_addr->sa_family == AF_INET) 1455 arp_ifinit(ifp, ifa); 1456 #endif 1457 return 0; 1458 } 1459 1460 case SIOCSIFMTU: 1461 { 1462 int maxmtu; 1463 1464 if (ec->ec_capabilities & ETHERCAP_JUMBO_MTU) 1465 maxmtu = ETHERMTU_JUMBO; 1466 else 1467 maxmtu = ETHERMTU; 1468 1469 if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > maxmtu) 1470 return EINVAL; 1471 else if ((error = ifioctl_common(ifp, cmd, data)) != ENETRESET) 1472 return error; 1473 else if (ifp->if_flags & IFF_UP) { 1474 /* Make sure the device notices the MTU change. */ 1475 return (*ifp->if_init)(ifp); 1476 } else 1477 return 0; 1478 } 1479 1480 case SIOCSIFFLAGS: 1481 if ((error = ifioctl_common(ifp, cmd, data)) != 0) 1482 return error; 1483 return ether_ioctl_reinit(ec); 1484 case SIOCGIFFLAGS: 1485 error = ifioctl_common(ifp, cmd, data); 1486 if (error == 0) { 1487 /* Set IFF_ALLMULTI for backcompat */ 1488 ifr->ifr_flags |= (ec->ec_flags & ETHER_F_ALLMULTI) ? 1489 IFF_ALLMULTI : 0; 1490 } 1491 return error; 1492 case SIOCGETHERCAP: 1493 eccr = (struct eccapreq *)data; 1494 eccr->eccr_capabilities = ec->ec_capabilities; 1495 eccr->eccr_capenable = ec->ec_capenable; 1496 return 0; 1497 case SIOCSETHERCAP: 1498 eccr = (struct eccapreq *)data; 1499 if ((eccr->eccr_capenable & ~ec->ec_capabilities) != 0) 1500 return EINVAL; 1501 if (eccr->eccr_capenable == ec->ec_capenable) 1502 return 0; 1503 #if 0 /* notyet */ 1504 ec->ec_capenable = (ec->ec_capenable & ETHERCAP_CANTCHANGE) 1505 | (eccr->eccr_capenable & ~ETHERCAP_CANTCHANGE); 1506 #else 1507 ec->ec_capenable = eccr->eccr_capenable; 1508 #endif 1509 return ether_ioctl_reinit(ec); 1510 case SIOCADDMULTI: 1511 return ether_addmulti(ifreq_getaddr(cmd, ifr), ec); 1512 case SIOCDELMULTI: 1513 return ether_delmulti(ifreq_getaddr(cmd, ifr), ec); 1514 case SIOCSIFMEDIA: 1515 case SIOCGIFMEDIA: 1516 if (ec->ec_mii != NULL) 1517 return ifmedia_ioctl(ifp, ifr, &ec->ec_mii->mii_media, 1518 cmd); 1519 else if (ec->ec_ifmedia != NULL) 1520 return ifmedia_ioctl(ifp, ifr, ec->ec_ifmedia, cmd); 1521 else 1522 return ENOTTY; 1523 break; 1524 case SIOCALIFADDR: 1525 sdl = satocsdl(sstocsa(&iflr->addr)); 1526 if (sdl->sdl_family != AF_LINK) 1527 ; 1528 else if (ETHER_IS_MULTICAST(CLLADDR(sdl))) 1529 return EINVAL; 1530 else if (memcmp(zero, CLLADDR(sdl), sizeof(zero)) == 0) 1531 return EINVAL; 1532 /*FALLTHROUGH*/ 1533 default: 1534 return ifioctl_common(ifp, cmd, data); 1535 } 1536 return 0; 1537 } 1538 1539 /* 1540 * Enable/disable passing VLAN packets if the parent interface supports it. 1541 * Return: 1542 * 0: Ok 1543 * -1: Parent interface does not support vlans 1544 * >0: Error 1545 */ 1546 int 1547 ether_enable_vlan_mtu(struct ifnet *ifp) 1548 { 1549 int error; 1550 struct ethercom *ec = (void *)ifp; 1551 1552 /* Parent does not support VLAN's */ 1553 if ((ec->ec_capabilities & ETHERCAP_VLAN_MTU) == 0) 1554 return -1; 1555 1556 /* 1557 * Parent supports the VLAN_MTU capability, 1558 * i.e. can Tx/Rx larger than ETHER_MAX_LEN frames; 1559 * enable it. 1560 */ 1561 ec->ec_capenable |= ETHERCAP_VLAN_MTU; 1562 1563 /* Interface is down, defer for later */ 1564 if ((ifp->if_flags & IFF_UP) == 0) 1565 return 0; 1566 1567 if ((error = if_flags_set(ifp, ifp->if_flags)) == 0) 1568 return 0; 1569 1570 ec->ec_capenable &= ~ETHERCAP_VLAN_MTU; 1571 return error; 1572 } 1573 1574 int 1575 ether_disable_vlan_mtu(struct ifnet *ifp) 1576 { 1577 int error; 1578 struct ethercom *ec = (void *)ifp; 1579 1580 /* We still have VLAN's, defer for later */ 1581 if (ec->ec_nvlans != 0) 1582 return 0; 1583 1584 /* Parent does not support VLAB's, nothing to do. */ 1585 if ((ec->ec_capenable & ETHERCAP_VLAN_MTU) == 0) 1586 return -1; 1587 1588 /* 1589 * Disable Tx/Rx of VLAN-sized frames. 1590 */ 1591 ec->ec_capenable &= ~ETHERCAP_VLAN_MTU; 1592 1593 /* Interface is down, defer for later */ 1594 if ((ifp->if_flags & IFF_UP) == 0) 1595 return 0; 1596 1597 if ((error = if_flags_set(ifp, ifp->if_flags)) == 0) 1598 return 0; 1599 1600 ec->ec_capenable |= ETHERCAP_VLAN_MTU; 1601 return error; 1602 } 1603 1604 static int 1605 ether_multicast_sysctl(SYSCTLFN_ARGS) 1606 { 1607 struct ether_multi *enm; 1608 struct ifnet *ifp; 1609 struct ethercom *ec; 1610 int error = 0; 1611 size_t written; 1612 struct psref psref; 1613 int bound; 1614 unsigned int multicnt; 1615 struct ether_multi_sysctl *addrs; 1616 int i; 1617 1618 if (namelen != 1) 1619 return EINVAL; 1620 1621 bound = curlwp_bind(); 1622 ifp = if_get_byindex(name[0], &psref); 1623 if (ifp == NULL) { 1624 error = ENODEV; 1625 goto out; 1626 } 1627 if (ifp->if_type != IFT_ETHER) { 1628 if_put(ifp, &psref); 1629 *oldlenp = 0; 1630 goto out; 1631 } 1632 ec = (struct ethercom *)ifp; 1633 1634 if (oldp == NULL) { 1635 if_put(ifp, &psref); 1636 *oldlenp = ec->ec_multicnt * sizeof(*addrs); 1637 goto out; 1638 } 1639 1640 /* 1641 * ec->ec_lock is a spin mutex so we cannot call sysctl_copyout, which 1642 * is sleepable, while holding it. Copy data to a local buffer first 1643 * with the lock taken and then call sysctl_copyout without holding it. 1644 */ 1645 retry: 1646 multicnt = ec->ec_multicnt; 1647 1648 if (multicnt == 0) { 1649 if_put(ifp, &psref); 1650 *oldlenp = 0; 1651 goto out; 1652 } 1653 1654 addrs = kmem_zalloc(sizeof(*addrs) * multicnt, KM_SLEEP); 1655 1656 ETHER_LOCK(ec); 1657 if (multicnt != ec->ec_multicnt) { 1658 /* The number of multicast addresses has changed */ 1659 ETHER_UNLOCK(ec); 1660 kmem_free(addrs, sizeof(*addrs) * multicnt); 1661 goto retry; 1662 } 1663 1664 i = 0; 1665 LIST_FOREACH(enm, &ec->ec_multiaddrs, enm_list) { 1666 struct ether_multi_sysctl *addr = &addrs[i]; 1667 addr->enm_refcount = enm->enm_refcount; 1668 memcpy(addr->enm_addrlo, enm->enm_addrlo, ETHER_ADDR_LEN); 1669 memcpy(addr->enm_addrhi, enm->enm_addrhi, ETHER_ADDR_LEN); 1670 i++; 1671 } 1672 ETHER_UNLOCK(ec); 1673 1674 error = 0; 1675 written = 0; 1676 for (i = 0; i < multicnt; i++) { 1677 struct ether_multi_sysctl *addr = &addrs[i]; 1678 1679 if (written + sizeof(*addr) > *oldlenp) 1680 break; 1681 error = sysctl_copyout(l, addr, oldp, sizeof(*addr)); 1682 if (error) 1683 break; 1684 written += sizeof(*addr); 1685 oldp = (char *)oldp + sizeof(*addr); 1686 } 1687 kmem_free(addrs, sizeof(*addrs) * multicnt); 1688 1689 if_put(ifp, &psref); 1690 1691 *oldlenp = written; 1692 out: 1693 curlwp_bindx(bound); 1694 return error; 1695 } 1696 1697 static void 1698 ether_sysctl_setup(struct sysctllog **clog) 1699 { 1700 const struct sysctlnode *rnode = NULL; 1701 1702 sysctl_createv(clog, 0, NULL, &rnode, 1703 CTLFLAG_PERMANENT, 1704 CTLTYPE_NODE, "ether", 1705 SYSCTL_DESCR("Ethernet-specific information"), 1706 NULL, 0, NULL, 0, 1707 CTL_NET, CTL_CREATE, CTL_EOL); 1708 1709 sysctl_createv(clog, 0, &rnode, NULL, 1710 CTLFLAG_PERMANENT, 1711 CTLTYPE_NODE, "multicast", 1712 SYSCTL_DESCR("multicast addresses"), 1713 ether_multicast_sysctl, 0, NULL, 0, 1714 CTL_CREATE, CTL_EOL); 1715 } 1716 1717 void 1718 etherinit(void) 1719 { 1720 1721 #ifdef DIAGNOSTIC 1722 mutex_init(&bigpktpps_lock, MUTEX_DEFAULT, IPL_NET); 1723 #endif 1724 ether_sysctl_setup(NULL); 1725 } 1726