if_lagg.c (169783) | if_lagg.c (170599) |
---|---|
1/* $OpenBSD: if_trunk.c,v 1.30 2007/01/31 06:20:19 reyk Exp $ */ 2 3/* 4 * Copyright (c) 2005, 2006 Reyk Floeter <reyk@openbsd.org> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19#include <sys/cdefs.h> | 1/* $OpenBSD: if_trunk.c,v 1.30 2007/01/31 06:20:19 reyk Exp $ */ 2 3/* 4 * Copyright (c) 2005, 2006 Reyk Floeter <reyk@openbsd.org> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19#include <sys/cdefs.h> |
20__FBSDID("$FreeBSD: head/sys/net/if_lagg.c 169783 2007-05-20 03:21:59Z thompsa $"); | 20__FBSDID("$FreeBSD: head/sys/net/if_lagg.c 170599 2007-06-12 07:29:11Z thompsa $"); |
21 22#include "opt_inet.h" 23#include "opt_inet6.h" 24 25#include <sys/param.h> 26#include <sys/kernel.h> 27#include <sys/malloc.h> 28#include <sys/mbuf.h> --- 42 unchanged lines hidden (view full) --- 71 int (*func)(struct ifnet *, int); 72} lagg_pflags[] = { 73 {IFF_PROMISC, ifpromisc}, 74 {IFF_ALLMULTI, if_allmulti}, 75 {0, NULL} 76}; 77 78SLIST_HEAD(__trhead, lagg_softc) lagg_list; /* list of laggs */ | 21 22#include "opt_inet.h" 23#include "opt_inet6.h" 24 25#include <sys/param.h> 26#include <sys/kernel.h> 27#include <sys/malloc.h> 28#include <sys/mbuf.h> --- 42 unchanged lines hidden (view full) --- 71 int (*func)(struct ifnet *, int); 72} lagg_pflags[] = { 73 {IFF_PROMISC, ifpromisc}, 74 {IFF_ALLMULTI, if_allmulti}, 75 {0, NULL} 76}; 77 78SLIST_HEAD(__trhead, lagg_softc) lagg_list; /* list of laggs */ |
79static struct mtx lagg_list_mtx; | 79static struct mtx lagg_list_mtx; |
80eventhandler_tag lagg_detach_cookie = NULL; 81 82static int lagg_clone_create(struct if_clone *, int, caddr_t); 83static void lagg_clone_destroy(struct ifnet *); 84static void lagg_lladdr(struct lagg_softc *, uint8_t *); 85static int lagg_capabilities(struct lagg_softc *); 86static void lagg_port_lladdr(struct lagg_port *, uint8_t *); 87static void lagg_port_setlladdr(void *, int); --- 238 unchanged lines hidden (view full) --- 326 } 327 328 return (cap == ~0 ? priv : (cap | priv)); 329} 330 331static void 332lagg_port_lladdr(struct lagg_port *lp, uint8_t *lladdr) 333{ | 80eventhandler_tag lagg_detach_cookie = NULL; 81 82static int lagg_clone_create(struct if_clone *, int, caddr_t); 83static void lagg_clone_destroy(struct ifnet *); 84static void lagg_lladdr(struct lagg_softc *, uint8_t *); 85static int lagg_capabilities(struct lagg_softc *); 86static void lagg_port_lladdr(struct lagg_port *, uint8_t *); 87static void lagg_port_setlladdr(void *, int); --- 238 unchanged lines hidden (view full) --- 326 } 327 328 return (cap == ~0 ? priv : (cap | priv)); 329} 330 331static void 332lagg_port_lladdr(struct lagg_port *lp, uint8_t *lladdr) 333{ |
334 struct lagg_softc *sc = lp->lp_lagg; | 334 struct lagg_softc *sc = lp->lp_softc; |
335 struct ifnet *ifp = lp->lp_ifp; 336 struct lagg_llq *llq; 337 int pending = 0; 338 339 LAGG_WLOCK_ASSERT(sc); 340 341 if (lp->lp_detaching || 342 memcmp(lladdr, IF_LLADDR(ifp), ETHER_ADDR_LEN) == 0) --- 112 unchanged lines hidden (view full) --- 455 ifp->if_type = IFT_IEEE8023ADLAG; 456 ifp->if_lagg = lp; 457 lp->lp_ioctl = ifp->if_ioctl; 458 ifp->if_ioctl = lagg_port_ioctl; 459 lp->lp_output = ifp->if_output; 460 ifp->if_output = lagg_port_output; 461 462 lp->lp_ifp = ifp; | 335 struct ifnet *ifp = lp->lp_ifp; 336 struct lagg_llq *llq; 337 int pending = 0; 338 339 LAGG_WLOCK_ASSERT(sc); 340 341 if (lp->lp_detaching || 342 memcmp(lladdr, IF_LLADDR(ifp), ETHER_ADDR_LEN) == 0) --- 112 unchanged lines hidden (view full) --- 455 ifp->if_type = IFT_IEEE8023ADLAG; 456 ifp->if_lagg = lp; 457 lp->lp_ioctl = ifp->if_ioctl; 458 ifp->if_ioctl = lagg_port_ioctl; 459 lp->lp_output = ifp->if_output; 460 ifp->if_output = lagg_port_output; 461 462 lp->lp_ifp = ifp; |
463 lp->lp_lagg = sc; | 463 lp->lp_softc = sc; |
464 465 /* Save port link layer address */ 466 bcopy(IF_LLADDR(ifp), lp->lp_lladdr, ETHER_ADDR_LEN); 467 468 if (SLIST_EMPTY(&sc->sc_ports)) { 469 sc->sc_primary = lp; 470 lagg_lladdr(sc, IF_LLADDR(ifp)); 471 } else { --- 10 unchanged lines hidden (view full) --- 482 483 /* Add multicast addresses and interface flags to this port */ 484 lagg_ether_cmdmulti(lp, 1); 485 lagg_setflags(lp, 1); 486 487 if (sc->sc_port_create != NULL) 488 error = (*sc->sc_port_create)(lp); 489 if (error) { | 464 465 /* Save port link layer address */ 466 bcopy(IF_LLADDR(ifp), lp->lp_lladdr, ETHER_ADDR_LEN); 467 468 if (SLIST_EMPTY(&sc->sc_ports)) { 469 sc->sc_primary = lp; 470 lagg_lladdr(sc, IF_LLADDR(ifp)); 471 } else { --- 10 unchanged lines hidden (view full) --- 482 483 /* Add multicast addresses and interface flags to this port */ 484 lagg_ether_cmdmulti(lp, 1); 485 lagg_setflags(lp, 1); 486 487 if (sc->sc_port_create != NULL) 488 error = (*sc->sc_port_create)(lp); 489 if (error) { |
490 /* remove the port again, without calling sc_port_destroy */ | 490 /* remove the port again, without calling sc_port_destroy */ |
491 lagg_port_destroy(lp, 0); 492 return (error); 493 } 494 495 return (error); 496} 497 498static int --- 13 unchanged lines hidden (view full) --- 512 } 513 514 return (m + 1); 515} 516 517static int 518lagg_port_destroy(struct lagg_port *lp, int runpd) 519{ | 491 lagg_port_destroy(lp, 0); 492 return (error); 493 } 494 495 return (error); 496} 497 498static int --- 13 unchanged lines hidden (view full) --- 512 } 513 514 return (m + 1); 515} 516 517static int 518lagg_port_destroy(struct lagg_port *lp, int runpd) 519{ |
520 struct lagg_softc *sc = lp->lp_lagg; | 520 struct lagg_softc *sc = lp->lp_softc; |
521 struct lagg_port *lp_ptr; 522 struct lagg_llq *llq; 523 struct ifnet *ifp = lp->lp_ifp; 524 525 LAGG_WLOCK_ASSERT(sc); 526 527 if (runpd && sc->sc_port_destroy != NULL) 528 (*sc->sc_port_destroy)(lp); --- 64 unchanged lines hidden (view full) --- 593{ 594 struct lagg_reqport *rp = (struct lagg_reqport *)data; 595 struct lagg_softc *sc; 596 struct lagg_port *lp = NULL; 597 int error = 0; 598 599 /* Should be checked by the caller */ 600 if (ifp->if_type != IFT_IEEE8023ADLAG || | 521 struct lagg_port *lp_ptr; 522 struct lagg_llq *llq; 523 struct ifnet *ifp = lp->lp_ifp; 524 525 LAGG_WLOCK_ASSERT(sc); 526 527 if (runpd && sc->sc_port_destroy != NULL) 528 (*sc->sc_port_destroy)(lp); --- 64 unchanged lines hidden (view full) --- 593{ 594 struct lagg_reqport *rp = (struct lagg_reqport *)data; 595 struct lagg_softc *sc; 596 struct lagg_port *lp = NULL; 597 int error = 0; 598 599 /* Should be checked by the caller */ 600 if (ifp->if_type != IFT_IEEE8023ADLAG || |
601 (lp = ifp->if_lagg) == NULL || (sc = lp->lp_lagg) == NULL) | 601 (lp = ifp->if_lagg) == NULL || (sc = lp->lp_softc) == NULL) |
602 goto fallback; 603 604 switch (cmd) { 605 case SIOCGLAGGPORT: 606 LAGG_RLOCK(sc); 607 if (rp->rp_portname[0] == '\0' || 608 ifunit(rp->rp_portname) != ifp) { 609 error = EINVAL; 610 break; 611 } 612 | 602 goto fallback; 603 604 switch (cmd) { 605 case SIOCGLAGGPORT: 606 LAGG_RLOCK(sc); 607 if (rp->rp_portname[0] == '\0' || 608 ifunit(rp->rp_portname) != ifp) { 609 error = EINVAL; 610 break; 611 } 612 |
613 if (lp->lp_lagg != sc) { | 613 if (lp->lp_softc != sc) { |
614 error = ENOENT; 615 break; 616 } 617 618 lagg_port2req(lp, rp); 619 LAGG_RUNLOCK(sc); 620 break; 621 default: --- 43 unchanged lines hidden (view full) --- 665lagg_port_ifdetach(void *arg __unused, struct ifnet *ifp) 666{ 667 struct lagg_port *lp; 668 struct lagg_softc *sc; 669 670 if ((lp = ifp->if_lagg) == NULL) 671 return; 672 | 614 error = ENOENT; 615 break; 616 } 617 618 lagg_port2req(lp, rp); 619 LAGG_RUNLOCK(sc); 620 break; 621 default: --- 43 unchanged lines hidden (view full) --- 665lagg_port_ifdetach(void *arg __unused, struct ifnet *ifp) 666{ 667 struct lagg_port *lp; 668 struct lagg_softc *sc; 669 670 if ((lp = ifp->if_lagg) == NULL) 671 return; 672 |
673 sc = lp->lp_lagg; | 673 sc = lp->lp_softc; |
674 675 LAGG_WLOCK(sc); 676 lp->lp_detaching = 1; 677 lagg_port_destroy(lp, 1); 678 LAGG_WUNLOCK(sc); 679} 680 681static void 682lagg_port2req(struct lagg_port *lp, struct lagg_reqport *rp) 683{ | 674 675 LAGG_WLOCK(sc); 676 lp->lp_detaching = 1; 677 lagg_port_destroy(lp, 1); 678 LAGG_WUNLOCK(sc); 679} 680 681static void 682lagg_port2req(struct lagg_port *lp, struct lagg_reqport *rp) 683{ |
684 struct lagg_softc *sc = lp->lp_lagg; | 684 struct lagg_softc *sc = lp->lp_softc; |
685 strlcpy(rp->rp_ifname, sc->sc_ifname, sizeof(rp->rp_ifname)); 686 strlcpy(rp->rp_portname, lp->lp_ifp->if_xname, sizeof(rp->rp_portname)); 687 rp->rp_prio = lp->lp_prio; 688 rp->rp_flags = lp->lp_flags; 689 690 /* Add protocol specific flags */ 691 switch (sc->sc_proto) { 692 case LAGG_PROTO_FAILOVER: --- 130 unchanged lines hidden (view full) --- 823 case SIOCGLAGGPORT: 824 if (rp->rp_portname[0] == '\0' || 825 (tpif = ifunit(rp->rp_portname)) == NULL) { 826 error = EINVAL; 827 break; 828 } 829 830 if ((lp = (struct lagg_port *)tpif->if_lagg) == NULL || | 685 strlcpy(rp->rp_ifname, sc->sc_ifname, sizeof(rp->rp_ifname)); 686 strlcpy(rp->rp_portname, lp->lp_ifp->if_xname, sizeof(rp->rp_portname)); 687 rp->rp_prio = lp->lp_prio; 688 rp->rp_flags = lp->lp_flags; 689 690 /* Add protocol specific flags */ 691 switch (sc->sc_proto) { 692 case LAGG_PROTO_FAILOVER: --- 130 unchanged lines hidden (view full) --- 823 case SIOCGLAGGPORT: 824 if (rp->rp_portname[0] == '\0' || 825 (tpif = ifunit(rp->rp_portname)) == NULL) { 826 error = EINVAL; 827 break; 828 } 829 830 if ((lp = (struct lagg_port *)tpif->if_lagg) == NULL || |
831 lp->lp_lagg != sc) { | 831 lp->lp_softc != sc) { |
832 error = ENOENT; 833 break; 834 } 835 836 lagg_port2req(lp, rp); 837 break; 838 case SIOCSLAGGPORT: 839 error = priv_check(td, PRIV_NET_LAGG); --- 12 unchanged lines hidden (view full) --- 852 break; 853 if (rp->rp_portname[0] == '\0' || 854 (tpif = ifunit(rp->rp_portname)) == NULL) { 855 error = EINVAL; 856 break; 857 } 858 859 if ((lp = (struct lagg_port *)tpif->if_lagg) == NULL || | 832 error = ENOENT; 833 break; 834 } 835 836 lagg_port2req(lp, rp); 837 break; 838 case SIOCSLAGGPORT: 839 error = priv_check(td, PRIV_NET_LAGG); --- 12 unchanged lines hidden (view full) --- 852 break; 853 if (rp->rp_portname[0] == '\0' || 854 (tpif = ifunit(rp->rp_portname)) == NULL) { 855 error = EINVAL; 856 break; 857 } 858 859 if ((lp = (struct lagg_port *)tpif->if_lagg) == NULL || |
860 lp->lp_lagg != sc) { | 860 lp->lp_softc != sc) { |
861 error = ENOENT; 862 break; 863 } 864 865 error = lagg_port_destroy(lp, 1); 866 break; 867 case SIOCSIFFLAGS: 868 /* Set flags on ports too */ --- 56 unchanged lines hidden (view full) --- 925 lagg_ether_cmdmulti(lp, 1); 926 } 927 return (0); 928} 929 930static int 931lagg_ether_cmdmulti(struct lagg_port *lp, int set) 932{ | 861 error = ENOENT; 862 break; 863 } 864 865 error = lagg_port_destroy(lp, 1); 866 break; 867 case SIOCSIFFLAGS: 868 /* Set flags on ports too */ --- 56 unchanged lines hidden (view full) --- 925 lagg_ether_cmdmulti(lp, 1); 926 } 927 return (0); 928} 929 930static int 931lagg_ether_cmdmulti(struct lagg_port *lp, int set) 932{ |
933 struct lagg_softc *sc = lp->lp_lagg; | 933 struct lagg_softc *sc = lp->lp_softc; |
934 struct ifnet *ifp = lp->lp_ifp; | 934 struct ifnet *ifp = lp->lp_ifp; |
935 struct ifnet *trifp = sc->sc_ifp; | 935 struct ifnet *scifp = sc->sc_ifp; |
936 struct lagg_mc *mc; 937 struct ifmultiaddr *ifma, *rifma = NULL; 938 struct sockaddr_dl sdl; 939 int error; 940 941 LAGG_WLOCK_ASSERT(sc); 942 943 bzero((char *)&sdl, sizeof(sdl)); 944 sdl.sdl_len = sizeof(sdl); 945 sdl.sdl_family = AF_LINK; 946 sdl.sdl_type = IFT_ETHER; 947 sdl.sdl_alen = ETHER_ADDR_LEN; 948 sdl.sdl_index = ifp->if_index; 949 950 if (set) { | 936 struct lagg_mc *mc; 937 struct ifmultiaddr *ifma, *rifma = NULL; 938 struct sockaddr_dl sdl; 939 int error; 940 941 LAGG_WLOCK_ASSERT(sc); 942 943 bzero((char *)&sdl, sizeof(sdl)); 944 sdl.sdl_len = sizeof(sdl); 945 sdl.sdl_family = AF_LINK; 946 sdl.sdl_type = IFT_ETHER; 947 sdl.sdl_alen = ETHER_ADDR_LEN; 948 sdl.sdl_index = ifp->if_index; 949 950 if (set) { |
951 TAILQ_FOREACH(ifma, &trifp->if_multiaddrs, ifma_link) { | 951 TAILQ_FOREACH(ifma, &scifp->if_multiaddrs, ifma_link) { |
952 if (ifma->ifma_addr->sa_family != AF_LINK) 953 continue; 954 bcopy(LLADDR((struct sockaddr_dl *)ifma->ifma_addr), 955 LLADDR(&sdl), ETHER_ADDR_LEN); 956 957 error = if_addmulti(ifp, (struct sockaddr *)&sdl, &rifma); 958 if (error) 959 return (error); --- 13 unchanged lines hidden (view full) --- 973 return (0); 974} 975 976/* Handle a ref counted flag that should be set on the lagg port as well */ 977static int 978lagg_setflag(struct lagg_port *lp, int flag, int status, 979 int (*func)(struct ifnet *, int)) 980{ | 952 if (ifma->ifma_addr->sa_family != AF_LINK) 953 continue; 954 bcopy(LLADDR((struct sockaddr_dl *)ifma->ifma_addr), 955 LLADDR(&sdl), ETHER_ADDR_LEN); 956 957 error = if_addmulti(ifp, (struct sockaddr *)&sdl, &rifma); 958 if (error) 959 return (error); --- 13 unchanged lines hidden (view full) --- 973 return (0); 974} 975 976/* Handle a ref counted flag that should be set on the lagg port as well */ 977static int 978lagg_setflag(struct lagg_port *lp, int flag, int status, 979 int (*func)(struct ifnet *, int)) 980{ |
981 struct lagg_softc *sc = lp->lp_lagg; 982 struct ifnet *trifp = sc->sc_ifp; | 981 struct lagg_softc *sc = lp->lp_softc; 982 struct ifnet *scifp = sc->sc_ifp; |
983 struct ifnet *ifp = lp->lp_ifp; 984 int error; 985 986 LAGG_WLOCK_ASSERT(sc); 987 | 983 struct ifnet *ifp = lp->lp_ifp; 984 int error; 985 986 LAGG_WLOCK_ASSERT(sc); 987 |
988 status = status ? (trifp->if_flags & flag) : 0; | 988 status = status ? (scifp->if_flags & flag) : 0; |
989 /* Now "status" contains the flag value or 0 */ 990 991 /* 992 * See if recorded ports status is different from what 993 * we want it to be. If it is, flip it. We record ports 994 * status in lp_ifflags so that we won't clear ports flag 995 * we haven't set. In fact, we don't clear or set ports 996 * flags directly, but get or release references to them. --- 14 unchanged lines hidden (view full) --- 1011 * Handle IFF_* flags that require certain changes on the lagg port 1012 * if "status" is true, update ports flags respective to the lagg 1013 * if "status" is false, forcedly clear the flags set on port. 1014 */ 1015static int 1016lagg_setflags(struct lagg_port *lp, int status) 1017{ 1018 int error, i; | 989 /* Now "status" contains the flag value or 0 */ 990 991 /* 992 * See if recorded ports status is different from what 993 * we want it to be. If it is, flip it. We record ports 994 * status in lp_ifflags so that we won't clear ports flag 995 * we haven't set. In fact, we don't clear or set ports 996 * flags directly, but get or release references to them. --- 14 unchanged lines hidden (view full) --- 1011 * Handle IFF_* flags that require certain changes on the lagg port 1012 * if "status" is true, update ports flags respective to the lagg 1013 * if "status" is false, forcedly clear the flags set on port. 1014 */ 1015static int 1016lagg_setflags(struct lagg_port *lp, int status) 1017{ 1018 int error, i; |
1019 | 1019 |
1020 for (i = 0; lagg_pflags[i].flag; i++) { 1021 error = lagg_setflag(lp, lagg_pflags[i].flag, 1022 status, lagg_pflags[i].func); 1023 if (error) 1024 return (error); 1025 } 1026 return (0); 1027} --- 29 unchanged lines hidden (view full) --- 1057 1058 return; 1059} 1060 1061static struct mbuf * 1062lagg_input(struct ifnet *ifp, struct mbuf *m) 1063{ 1064 struct lagg_port *lp = ifp->if_lagg; | 1020 for (i = 0; lagg_pflags[i].flag; i++) { 1021 error = lagg_setflag(lp, lagg_pflags[i].flag, 1022 status, lagg_pflags[i].func); 1023 if (error) 1024 return (error); 1025 } 1026 return (0); 1027} --- 29 unchanged lines hidden (view full) --- 1057 1058 return; 1059} 1060 1061static struct mbuf * 1062lagg_input(struct ifnet *ifp, struct mbuf *m) 1063{ 1064 struct lagg_port *lp = ifp->if_lagg; |
1065 struct lagg_softc *sc = lp->lp_lagg; 1066 struct ifnet *trifp = sc->sc_ifp; | 1065 struct lagg_softc *sc = lp->lp_softc; 1066 struct ifnet *scifp = sc->sc_ifp; |
1067 | 1067 |
1068 if ((trifp->if_drv_flags & IFF_DRV_RUNNING) == 0 || | 1068 if ((scifp->if_drv_flags & IFF_DRV_RUNNING) == 0 || |
1069 (lp->lp_flags & LAGG_PORT_DISABLED) || 1070 sc->sc_proto == LAGG_PROTO_NONE) { 1071 m_freem(m); 1072 return (NULL); 1073 } 1074 1075 LAGG_RLOCK(sc); | 1069 (lp->lp_flags & LAGG_PORT_DISABLED) || 1070 sc->sc_proto == LAGG_PROTO_NONE) { 1071 m_freem(m); 1072 return (NULL); 1073 } 1074 1075 LAGG_RLOCK(sc); |
1076 BPF_MTAP(trifp, m); | 1076 BPF_MTAP(scifp, m); |
1077 1078 m = (*sc->sc_input)(sc, lp, m); 1079 1080 if (m != NULL) { | 1077 1078 m = (*sc->sc_input)(sc, lp, m); 1079 1080 if (m != NULL) { |
1081 trifp->if_ipackets++; 1082 trifp->if_ibytes += m->m_pkthdr.len; | 1081 scifp->if_ipackets++; 1082 scifp->if_ibytes += m->m_pkthdr.len; |
1083 } 1084 1085 LAGG_RUNLOCK(sc); 1086 return (m); 1087} 1088 1089static int 1090lagg_media_change(struct ifnet *ifp) --- 26 unchanged lines hidden (view full) --- 1117 1118static void 1119lagg_port_state(struct ifnet *ifp, int state) 1120{ 1121 struct lagg_port *lp = (struct lagg_port *)ifp->if_lagg; 1122 struct lagg_softc *sc = NULL; 1123 1124 if (lp != NULL) | 1083 } 1084 1085 LAGG_RUNLOCK(sc); 1086 return (m); 1087} 1088 1089static int 1090lagg_media_change(struct ifnet *ifp) --- 26 unchanged lines hidden (view full) --- 1117 1118static void 1119lagg_port_state(struct ifnet *ifp, int state) 1120{ 1121 struct lagg_port *lp = (struct lagg_port *)ifp->if_lagg; 1122 struct lagg_softc *sc = NULL; 1123 1124 if (lp != NULL) |
1125 sc = lp->lp_lagg; | 1125 sc = lp->lp_softc; |
1126 if (sc == NULL) 1127 return; 1128 1129 LAGG_WLOCK(sc); 1130 if (sc->sc_linkstate != NULL) 1131 (*sc->sc_linkstate)(lp); 1132 LAGG_WUNLOCK(sc); 1133} --- 89 unchanged lines hidden (view full) --- 1223 p = hash32_buf(&eh->ether_dhost, ETHER_ADDR_LEN, p); 1224 1225 /* Special handling for encapsulating VLAN frames */ 1226 if (m->m_flags & M_VLANTAG) { 1227 p = hash32_buf(&m->m_pkthdr.ether_vtag, 1228 sizeof(m->m_pkthdr.ether_vtag), p); 1229 } else if (etype == ETHERTYPE_VLAN) { 1230 vlan = lagg_gethdr(m, off, sizeof(*vlan), &vlanbuf); | 1126 if (sc == NULL) 1127 return; 1128 1129 LAGG_WLOCK(sc); 1130 if (sc->sc_linkstate != NULL) 1131 (*sc->sc_linkstate)(lp); 1132 LAGG_WUNLOCK(sc); 1133} --- 89 unchanged lines hidden (view full) --- 1223 p = hash32_buf(&eh->ether_dhost, ETHER_ADDR_LEN, p); 1224 1225 /* Special handling for encapsulating VLAN frames */ 1226 if (m->m_flags & M_VLANTAG) { 1227 p = hash32_buf(&m->m_pkthdr.ether_vtag, 1228 sizeof(m->m_pkthdr.ether_vtag), p); 1229 } else if (etype == ETHERTYPE_VLAN) { 1230 vlan = lagg_gethdr(m, off, sizeof(*vlan), &vlanbuf); |
1231 if (vlan == NULL) | 1231 if (vlan == NULL) |
1232 goto out; 1233 1234 p = hash32_buf(&vlan->evl_tag, sizeof(vlan->evl_tag), p); 1235 etype = ntohs(vlan->evl_proto); 1236 off += sizeof(*vlan) - sizeof(*eh); 1237 } 1238 1239 switch (etype) { --- 60 unchanged lines hidden (view full) --- 1300{ 1301 sc->sc_psc = NULL; 1302 return (0); 1303} 1304 1305static void 1306lagg_rr_port_destroy(struct lagg_port *lp) 1307{ | 1232 goto out; 1233 1234 p = hash32_buf(&vlan->evl_tag, sizeof(vlan->evl_tag), p); 1235 etype = ntohs(vlan->evl_proto); 1236 off += sizeof(*vlan) - sizeof(*eh); 1237 } 1238 1239 switch (etype) { --- 60 unchanged lines hidden (view full) --- 1300{ 1301 sc->sc_psc = NULL; 1302 return (0); 1303} 1304 1305static void 1306lagg_rr_port_destroy(struct lagg_port *lp) 1307{ |
1308 struct lagg_softc *sc = lp->lp_lagg; | 1308 struct lagg_softc *sc = lp->lp_softc; |
1309 1310 if (lp == (struct lagg_port *)sc->sc_psc) 1311 sc->sc_psc = NULL; 1312} 1313 1314static int 1315lagg_rr_start(struct lagg_softc *sc, struct mbuf *m) 1316{ --- 145 unchanged lines hidden (view full) --- 1462 } 1463 1464 return (0); 1465} 1466 1467static int 1468lagg_lb_port_create(struct lagg_port *lp) 1469{ | 1309 1310 if (lp == (struct lagg_port *)sc->sc_psc) 1311 sc->sc_psc = NULL; 1312} 1313 1314static int 1315lagg_rr_start(struct lagg_softc *sc, struct mbuf *m) 1316{ --- 145 unchanged lines hidden (view full) --- 1462 } 1463 1464 return (0); 1465} 1466 1467static int 1468lagg_lb_port_create(struct lagg_port *lp) 1469{ |
1470 struct lagg_softc *sc = lp->lp_lagg; | 1470 struct lagg_softc *sc = lp->lp_softc; |
1471 return (lagg_lb_porttable(sc, NULL)); 1472} 1473 1474static void 1475lagg_lb_port_destroy(struct lagg_port *lp) 1476{ | 1471 return (lagg_lb_porttable(sc, NULL)); 1472} 1473 1474static void 1475lagg_lb_port_destroy(struct lagg_port *lp) 1476{ |
1477 struct lagg_softc *sc = lp->lp_lagg; | 1477 struct lagg_softc *sc = lp->lp_softc; |
1478 lagg_lb_porttable(sc, lp); 1479} 1480 1481static int 1482lagg_lb_start(struct lagg_softc *sc, struct mbuf *m) 1483{ 1484 struct lagg_lb *lb = (struct lagg_lb *)sc->sc_psc; 1485 struct lagg_port *lp = NULL; --- 133 unchanged lines hidden --- | 1478 lagg_lb_porttable(sc, lp); 1479} 1480 1481static int 1482lagg_lb_start(struct lagg_softc *sc, struct mbuf *m) 1483{ 1484 struct lagg_lb *lb = (struct lagg_lb *)sc->sc_psc; 1485 struct lagg_port *lp = NULL; --- 133 unchanged lines hidden --- |