Print this page
11490 SRS ring polling disabled for VLANs
11491 Want DLS bypass for VLAN traffic
11492 add VLVF bypass to ixgbe core
2869 duplicate packets with vnics over aggrs
11489 DLS stat delete and aggr kstat can deadlock
Portions contributed by: Theo Schlossnagle <jesus@omniti.com>
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Dan McDonald <danmcd@joyent.com>

@@ -19,10 +19,12 @@
  * CDDL HEADER END
  */
 /*
  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
+ * Copyright 2012 OmniTI Computer Consulting, Inc  All rights reserved.
+ * Copyright 2018 Joyent, Inc.
  */
 
 #ifndef _SYS_AGGR_IMPL_H
 #define _SYS_AGGR_IMPL_H
 

@@ -52,10 +54,19 @@
  * Possible value of aggr_rseudo_rx_ring_t.arr_flags. Set when the ring entry
  * in the pseudo RX group is used.
  */
 #define MAC_PSEUDO_RING_INUSE   0x01
 
+/*
+ * VLAN filters placed on the Rx pseudo group.
+ */
+typedef struct aggr_vlan {
+        list_node_t     av_link;
+        uint16_t        av_vid;         /* VLAN ID */
+        uint_t          av_refs;        /* num aggr clients using this VID */
+} aggr_vlan_t;
+
 typedef struct aggr_unicst_addr_s {
         uint8_t                         aua_addr[ETHERADDRL];
         struct aggr_unicst_addr_s       *aua_next;
 } aggr_unicst_addr_t;
 

@@ -71,10 +82,12 @@
         struct aggr_grp_s       *arg_grp; /* filled in by aggr_fill_group() */
         mac_group_handle_t      arg_gh;   /* filled in by aggr_fill_group() */
         aggr_unicst_addr_t      *arg_macaddr;
         aggr_pseudo_rx_ring_t   arg_rings[MAX_RINGS_PER_GROUP];
         uint_t                  arg_ring_cnt;
+        uint_t                  arg_untagged; /* num clients untagged */
+        list_t                  arg_vlans;    /* VLANs on this group */
 } aggr_pseudo_rx_group_t;
 
 typedef struct aggr_pseudo_tx_ring_s {
         mac_ring_handle_t       atr_rh; /* filled in by aggr_fill_ring() */
         struct aggr_port_s      *atr_port;

@@ -184,15 +197,22 @@
         uint_t          lg_ntx_ports;
         aggr_port_t     **lg_tx_ports;          /* array of tx ports */
         uint_t          lg_tx_ports_size;       /* size of lg_tx_ports */
         uint32_t        lg_tx_policy;           /* outbound policy */
         uint8_t         lg_mac_tx_policy;
-        uint64_t        lg_ifspeed;
         link_state_t    lg_link_state;
+
+
+        /*
+         * The lg_stat_lock must be held when accessing these fields.
+         */
+        kmutex_t        lg_stat_lock;
+        uint64_t        lg_ifspeed;
         link_duplex_t   lg_link_duplex;
         uint64_t        lg_stat[MAC_NSTAT];
         uint64_t        lg_ether_stat[ETHER_NSTAT];
+
         aggr_lacp_mode_t lg_lacp_mode;          /* off, active, or passive */
         Agg_t           aggr;                   /* 802.3ad data */
         uint32_t        lg_hcksum_txflags;
         uint_t          lg_max_sdu;
         uint32_t        lg_margin;

@@ -306,10 +326,12 @@
 extern uint64_t aggr_port_stat(aggr_port_t *, uint_t);
 extern boolean_t aggr_port_notify_link(aggr_grp_t *, aggr_port_t *);
 extern void aggr_port_init_callbacks(aggr_port_t *);
 
 extern void aggr_recv_cb(void *, mac_resource_handle_t, mblk_t *, boolean_t);
+extern void aggr_recv_promisc_cb(void *, mac_resource_handle_t, mblk_t *,
+    boolean_t);
 
 extern void aggr_tx_ring_update(void *, uintptr_t);
 extern void aggr_tx_notify_thread(void *);
 extern void aggr_send_port_enable(aggr_port_t *);
 extern void aggr_send_port_disable(aggr_port_t *);

@@ -336,10 +358,13 @@
 extern void aggr_grp_port_wait(aggr_grp_t *);
 
 extern int aggr_port_addmac(aggr_port_t *, const uint8_t *);
 extern void aggr_port_remmac(aggr_port_t *, const uint8_t *);
 
+extern int aggr_port_addvlan(aggr_port_t *, uint16_t);
+extern int aggr_port_remvlan(aggr_port_t *, uint16_t);
+
 extern mblk_t *aggr_ring_tx(void *, mblk_t *);
 extern mblk_t *aggr_find_tx_ring(void *, mblk_t *,
     uintptr_t, mac_ring_handle_t *);
 
 #endif  /* _KERNEL */