Deleted Added
full compact
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 ---