summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/sys')
-rw-r--r--usr/src/uts/common/sys/aggr.h45
-rw-r--r--usr/src/uts/common/sys/aggr_impl.h42
-rw-r--r--usr/src/uts/common/sys/dacf.h8
-rw-r--r--usr/src/uts/common/sys/ddi_implfuncs.h3
-rw-r--r--usr/src/uts/common/sys/dld.h127
-rw-r--r--usr/src/uts/common/sys/dld_impl.h115
-rw-r--r--usr/src/uts/common/sys/dlpi.h23
-rw-r--r--usr/src/uts/common/sys/dls.h234
-rw-r--r--usr/src/uts/common/sys/dls_impl.h101
-rw-r--r--usr/src/uts/common/sys/dls_soft_ring.h4
-rw-r--r--usr/src/uts/common/sys/fs/sdev_impl.h34
-rw-r--r--usr/src/uts/common/sys/gld.h4
-rw-r--r--usr/src/uts/common/sys/mac.h126
-rw-r--r--usr/src/uts/common/sys/mac_impl.h58
-rw-r--r--usr/src/uts/common/sys/param.h9
-rw-r--r--usr/src/uts/common/sys/softmac.h50
-rw-r--r--usr/src/uts/common/sys/softmac_impl.h234
-rw-r--r--usr/src/uts/common/sys/vnic.h30
-rw-r--r--usr/src/uts/common/sys/vnic_impl.h19
-rw-r--r--usr/src/uts/common/sys/zone.h1
20 files changed, 1016 insertions, 251 deletions
diff --git a/usr/src/uts/common/sys/aggr.h b/usr/src/uts/common/sys/aggr.h
index 1b6f14b5ce..c89cca4d46 100644
--- a/usr/src/uts/common/sys/aggr.h
+++ b/usr/src/uts/common/sys/aggr.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -30,6 +30,8 @@
#include <sys/types.h>
#include <sys/ethernet.h>
+#include <sys/mac.h>
+#include <sys/dls.h>
#include <sys/param.h>
#ifdef __cplusplus
@@ -74,6 +76,13 @@ typedef enum {
#define AGGR_MAX_PORTS 256
/*
+ * The largest configurable aggregation key. Because by default the key is
+ * used as the DLPI device PPA and default VLAN PPA's are calculated as
+ * ((1000 * vid) + PPA), the largest key can't be > 999.
+ */
+#define AGGR_MAX_KEY 999
+
+/*
* LACP port state.
*/
typedef union {
@@ -107,31 +116,37 @@ typedef union {
/* one of the ports of a link aggregation group */
typedef struct laioc_port {
- char lp_devname[MAXNAMELEN + 1];
+ datalink_id_t lp_linkid;
} laioc_port_t;
#define LAIOC_CREATE LAIOC(1)
typedef struct laioc_create {
+ datalink_id_t lc_linkid;
uint32_t lc_key;
uint32_t lc_nports;
uint32_t lc_policy;
uchar_t lc_mac[ETHERADDRL];
- boolean_t lc_mac_fixed;
aggr_lacp_mode_t lc_lacp_mode;
aggr_lacp_timer_t lc_lacp_timer;
+ uint32_t lc_mac_fixed : 1,
+ lc_force : 1,
+ lc_pad_bits : 30;
} laioc_create_t;
#ifdef _SYSCALL32
typedef struct laioc_create32 {
+ datalink_id_t lc_linkid;
uint32_t lc_key;
uint32_t lc_nports;
uint32_t lc_policy;
uchar_t lc_mac[ETHERADDRL];
- boolean_t lc_mac_fixed;
aggr_lacp_mode_t lc_lacp_mode;
aggr_lacp_timer_t lc_lacp_timer;
+ uint32_t lc_mac_fixed : 1,
+ lc_force : 1,
+ lc_pad_bits : 30;
} laioc_create32_t;
#endif /* _SYSCALL32 */
@@ -139,13 +154,13 @@ typedef struct laioc_create32 {
#define LAIOC_DELETE LAIOC(2)
typedef struct laioc_delete {
- uint32_t ld_key;
+ datalink_id_t ld_linkid;
} laioc_delete_t;
#ifdef _SYSCALL32
typedef struct laioc_delete32 {
- uint32_t ld_key;
+ datalink_id_t ld_linkid;
} laioc_delete32_t;
#endif /* _SYSCALL32 */
@@ -165,16 +180,18 @@ typedef enum aggr_link_state {
} aggr_link_state_t;
typedef struct laioc_info_port {
- char lp_devname[MAXNAMELEN + 1];
+ datalink_id_t lp_linkid;
uchar_t lp_mac[ETHERADDRL];
aggr_port_state_t lp_state;
aggr_lacp_state_t lp_lacp_state;
} laioc_info_port_t;
typedef struct laioc_info_group {
+ datalink_id_t lg_linkid;
uint32_t lg_key;
uchar_t lg_mac[ETHERADDRL];
boolean_t lg_mac_fixed;
+ boolean_t lg_force;
uint32_t lg_policy;
uint32_t lg_nports;
aggr_lacp_mode_t lg_lacp_mode;
@@ -182,23 +199,25 @@ typedef struct laioc_info_group {
} laioc_info_group_t;
typedef struct laioc_info {
- uint32_t li_ngroups;
- uint32_t li_group_key; /* 0 returns all */
+ /* Must not be DLADM_INVALID_LINKID */
+ datalink_id_t li_group_linkid;
} laioc_info_t;
#define LAIOC_ADD LAIOC(4)
#define LAIOC_REMOVE LAIOC(5)
typedef struct laioc_add_rem {
- uint32_t la_key;
+ datalink_id_t la_linkid;
uint32_t la_nports;
+ uint32_t la_force;
} laioc_add_rem_t;
#ifdef _SYSCALL32
typedef struct laioc_add_rem32 {
- uint32_t la_key;
+ datalink_id_t la_linkid;
uint32_t la_nports;
+ uint32_t la_force;
} laioc_add_rem32_t;
#endif /* _SYSCALL32 */
@@ -211,7 +230,7 @@ typedef struct laioc_add_rem32 {
#define LAIOC_MODIFY_LACP_TIMER 0x08
typedef struct laioc_modify {
- uint32_t lu_key;
+ datalink_id_t lu_linkid;
uint8_t lu_modify_mask;
uint32_t lu_policy;
uchar_t lu_mac[ETHERADDRL];
@@ -223,7 +242,7 @@ typedef struct laioc_modify {
#ifdef _SYSCALL32
typedef struct laioc_modify32 {
- uint32_t lu_key;
+ datalink_id_t lu_linkid;
uint8_t lu_modify_mask;
uint32_t lu_policy;
uchar_t lu_mac[ETHERADDRL];
diff --git a/usr/src/uts/common/sys/aggr_impl.h b/usr/src/uts/common/sys/aggr_impl.h
index e114624a06..7bc12b3d31 100644
--- a/usr/src/uts/common/sys/aggr_impl.h
+++ b/usr/src/uts/common/sys/aggr_impl.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -55,7 +55,7 @@ extern "C" {
typedef struct aggr_port_s {
struct aggr_port_s *lp_next;
struct aggr_grp_s *lp_grp; /* back ptr to group */
- char lp_devname[MAXNAMELEN + 1];
+ datalink_id_t lp_linkid;
uint16_t lp_portid;
uint8_t lp_addr[ETHERADDRL]; /* port MAC address */
uint32_t lp_refs; /* refcount */
@@ -64,7 +64,8 @@ typedef struct aggr_port_s {
lp_tx_enabled : 1,
lp_collector_enabled : 1,
lp_promisc_on : 1,
- lp_pad_bits : 28;
+ lp_no_link_update : 1,
+ lp_pad_bits : 27;
uint32_t lp_closing;
mac_handle_t lp_mh;
const mac_info_t *lp_mip;
@@ -80,6 +81,7 @@ typedef struct aggr_port_s {
aggr_lacp_port_t lp_lacp; /* LACP state */
lacp_stats_t lp_lacp_stats;
const mac_txinfo_t *lp_txinfo;
+ uint32_t lp_margin;
} aggr_port_t;
/*
@@ -100,6 +102,7 @@ typedef struct aggr_port_s {
*/
typedef struct aggr_grp_s {
krwlock_t lg_lock;
+ datalink_id_t lg_linkid;
uint16_t lg_key; /* key (group port number) */
uint32_t lg_refs; /* refcount */
uint16_t lg_nports; /* number of MAC ports */
@@ -110,7 +113,10 @@ typedef struct aggr_grp_s {
lg_started : 1, /* group started? */
lg_promisc : 1, /* in promiscuous mode? */
lg_gldv3_polling : 1,
- lg_pad_bits : 11;
+ lg_zcopy : 1,
+ lg_vlan : 1,
+ lg_force : 1,
+ lg_pad_bits : 8;
aggr_port_t *lg_ports; /* list of configured ports */
aggr_port_t *lg_mac_addr_port;
mac_handle_t lg_mh;
@@ -129,6 +135,7 @@ typedef struct aggr_grp_s {
Agg_t aggr; /* 802.3ad data */
uint32_t lg_hcksum_txflags;
uint_t lg_max_sdu;
+ uint32_t lg_margin;
} aggr_grp_t;
#define AGGR_LACP_LOCK(grp) mutex_enter(&(grp)->aggr.gl_lock);
@@ -162,36 +169,39 @@ typedef struct aggr_grp_s {
extern dev_info_t *aggr_dip;
extern void aggr_ioctl(queue_t *, mblk_t *);
-typedef int (*aggr_grp_info_new_grp_fn_t)(void *, uint32_t, uchar_t *,
- boolean_t, uint32_t, uint32_t, aggr_lacp_mode_t, aggr_lacp_timer_t);
-typedef int (*aggr_grp_info_new_port_fn_t)(void *, char *, uchar_t *,
+typedef int (*aggr_grp_info_new_grp_fn_t)(void *, datalink_id_t, uint32_t,
+ uchar_t *, boolean_t, boolean_t, uint32_t, uint32_t, aggr_lacp_mode_t,
+ aggr_lacp_timer_t);
+typedef int (*aggr_grp_info_new_port_fn_t)(void *, datalink_id_t, uchar_t *,
aggr_port_state_t, aggr_lacp_state_t *);
extern void aggr_grp_init(void);
extern void aggr_grp_fini(void);
-extern int aggr_grp_create(uint32_t, uint_t, laioc_port_t *, uint32_t,
- boolean_t, uchar_t *, aggr_lacp_mode_t, aggr_lacp_timer_t);
-extern int aggr_grp_delete(uint32_t);
+extern int aggr_grp_create(datalink_id_t, uint32_t, uint_t, laioc_port_t *,
+ uint32_t, boolean_t, boolean_t, uchar_t *, aggr_lacp_mode_t,
+ aggr_lacp_timer_t);
+extern int aggr_grp_delete(datalink_id_t);
extern void aggr_grp_free(aggr_grp_t *);
-extern int aggr_grp_info(uint_t *, uint32_t, void *,
- aggr_grp_info_new_grp_fn_t, aggr_grp_info_new_port_fn_t);
+extern int aggr_grp_info(datalink_id_t, void *, aggr_grp_info_new_grp_fn_t,
+ aggr_grp_info_new_port_fn_t);
extern void aggr_grp_notify(aggr_grp_t *, uint32_t);
extern boolean_t aggr_grp_attach_port(aggr_grp_t *, aggr_port_t *);
extern boolean_t aggr_grp_detach_port(aggr_grp_t *, aggr_port_t *);
extern void aggr_grp_port_mac_changed(aggr_grp_t *, aggr_port_t *,
boolean_t *, boolean_t *);
-extern int aggr_grp_add_ports(uint32_t, uint_t, laioc_port_t *);
-extern int aggr_grp_rem_ports(uint32_t, uint_t, laioc_port_t *);
+extern int aggr_grp_add_ports(datalink_id_t, uint_t, boolean_t,
+ laioc_port_t *);
+extern int aggr_grp_rem_ports(datalink_id_t, uint_t, laioc_port_t *);
extern boolean_t aggr_grp_update_ports_mac(aggr_grp_t *);
-extern int aggr_grp_modify(uint32_t, aggr_grp_t *, uint8_t, uint32_t,
+extern int aggr_grp_modify(datalink_id_t, aggr_grp_t *, uint8_t, uint32_t,
boolean_t, const uchar_t *, aggr_lacp_mode_t, aggr_lacp_timer_t);
extern void aggr_grp_multicst_port(aggr_port_t *, boolean_t);
extern uint_t aggr_grp_count(void);
extern void aggr_port_init(void);
extern void aggr_port_fini(void);
-extern int aggr_port_create(const char *, aggr_port_t **);
+extern int aggr_port_create(const datalink_id_t, boolean_t, aggr_port_t **);
extern void aggr_port_delete(aggr_port_t *);
extern void aggr_port_free(aggr_port_t *);
extern int aggr_port_start(aggr_port_t *);
diff --git a/usr/src/uts/common/sys/dacf.h b/usr/src/uts/common/sys/dacf.h
index b014d98767..b6b7124870 100644
--- a/usr/src/uts/common/sys/dacf.h
+++ b/usr/src/uts/common/sys/dacf.h
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 1999-2002 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -76,6 +75,7 @@ extern struct dacfsw kmod_dacfsw; /* kernel provided module */
const char *dacf_minor_name(dacf_infohdl_t);
minor_t dacf_minor_number(dacf_infohdl_t);
+dev_t dacf_get_dev(dacf_infohdl_t);
const char *dacf_driver_name(dacf_infohdl_t);
dev_info_t *dacf_devinfo_node(dacf_infohdl_t);
const char *dacf_get_arg(dacf_arghdl_t, char *);
diff --git a/usr/src/uts/common/sys/ddi_implfuncs.h b/usr/src/uts/common/sys/ddi_implfuncs.h
index 4aa213c1b2..1a9a84384a 100644
--- a/usr/src/uts/common/sys/ddi_implfuncs.h
+++ b/usr/src/uts/common/sys/ddi_implfuncs.h
@@ -20,7 +20,7 @@
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -248,6 +248,7 @@ int i_ddi_attach_node_hierarchy(dev_info_t *);
dev_info_t *i_ddi_attach_pseudo_node(char *);
int i_ddi_attach_hw_nodes(char *);
int i_ddi_devs_attached(major_t);
+int i_ddi_minor_node_count(dev_info_t *, const char *);
/* non-DDI functions: wrapper around mod_hold/rele_dev_by_major() */
struct dev_ops *ddi_hold_driver(major_t);
diff --git a/usr/src/uts/common/sys/dld.h b/usr/src/uts/common/sys/dld.h
index 71555d364b..8cc70e52f9 100644
--- a/usr/src/uts/common/sys/dld.h
+++ b/usr/src/uts/common/sys/dld.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -36,6 +36,8 @@
#include <sys/stream.h>
#include <sys/mac.h>
#include <sys/dls.h>
+#include <sys/conf.h>
+#include <sys/sad.h>
#include <net/if.h>
#ifdef __cplusplus
@@ -47,9 +49,6 @@ extern "C" {
*/
#define DLD_INFO "Data-Link Driver v%I%"
-#define DLD_MAX_PPA 999
-#define DLD_MAX_MINOR (DLD_MAX_PPA + 1)
-
/*
* Options: To enable an option set the property name to a non-zero value
* in kernel/drv/dld.conf.
@@ -93,31 +92,33 @@ extern "C" {
*/
#define DLDIOC ('D' << 24 | 'L' << 16 | 'D' << 8)
-#define DLDIOCATTR (DLDIOC | 0x03)
+#define DLDIOC_ATTR (DLDIOC | 0x03)
typedef struct dld_ioc_attr {
- char dia_name[IFNAMSIZ];
- char dia_dev[MAXNAMELEN];
+ datalink_id_t dia_linkid;
uint_t dia_max_sdu;
- uint16_t dia_vid;
} dld_ioc_attr_t;
-#define DLDIOCVLAN (DLDIOC | 0x04)
-
-typedef struct dld_ioc_vlan {
- char div_name[IFNAMSIZ];
- uint_t div_count;
-} dld_ioc_vlan_t;
-
-typedef struct dld_vlan_info {
- char dvi_name[IFNAMSIZ];
-} dld_vlan_info_t;
-
-typedef struct dld_hold_vlan {
- char dhv_name[IFNAMSIZ];
- zoneid_t dhv_zid;
- boolean_t dhv_docheck;
-} dld_hold_vlan_t;
+#define DLDIOC_VLAN_ATTR (DLDIOC | 0x04)
+typedef struct dld_ioc_vlan_attr {
+ datalink_id_t div_vlanid;
+ uint16_t div_vid;
+ datalink_id_t div_linkid;
+ boolean_t div_force;
+ boolean_t div_implicit;
+} dld_ioc_vlan_attr_t;
+
+#define DLDIOC_PHYS_ATTR (DLDIOC | 0x05)
+typedef struct dld_ioc_phys_attr {
+ datalink_id_t dip_linkid;
+ /*
+ * Whether this physical link supports vanity naming. Note that
+ * physical links whose media type is not supported by GLDv3
+ * can not support vanity naming.
+ */
+ boolean_t dip_novanity;
+ char dip_dev[MAXLINKNAMELEN];
+} dld_ioc_phys_attr_t;
/*
* Secure objects ioctls
@@ -137,33 +138,90 @@ typedef struct dld_secobj {
uint_t so_len;
} dld_secobj_t;
-#define DLDIOCSECOBJSET (DLDIOC | 0x05)
+#define DLDIOC_SECOBJ_SET (DLDIOC | 0x06)
typedef struct dld_ioc_secobj_set {
dld_secobj_t ss_obj;
uint_t ss_flags;
} dld_ioc_secobj_set_t;
-#define DLDIOCSECOBJGET (DLDIOC | 0x06)
+#define DLDIOC_SECOBJ_GET (DLDIOC | 0x07)
typedef struct dld_ioc_secobj_get {
dld_secobj_t sg_obj;
uint_t sg_count;
} dld_ioc_secobj_get_t;
-#define DLDIOCSECOBJUNSET (DLDIOC | 0x07)
+/*
+ * The following two slots were used outside of ON, so don't reuse them.
+ *
+ * #define DLDIOCHOLDVLAN (DLDIOC | 0x08)
+ * #define DLDIOCRELEVLAN (DLDIOC | 0x09)
+ */
+
+#define DLDIOC_SECOBJ_UNSET (DLDIOC | 0x0a)
typedef struct dld_ioc_secobj_unset {
char su_name[DLD_SECOBJ_NAME_MAX];
} dld_ioc_secobj_unset_t;
+#define DLDIOC_CREATE_VLAN (DLDIOC | 0x0b)
+typedef struct dld_ioc_create_vlan {
+ datalink_id_t dic_vlanid;
+ datalink_id_t dic_linkid;
+ uint16_t dic_vid;
+ boolean_t dic_force;
+} dld_ioc_create_vlan_t;
+
+#define DLDIOC_DELETE_VLAN (DLDIOC | 0x0c)
+typedef struct dld_ioc_delete_vlan {
+ datalink_id_t did_linkid;
+} dld_ioc_delete_vlan_t;
+
+#define DLDIOC_SETAUTOPUSH (DLDIOC | 0x0d)
+#define DLDIOC_GETAUTOPUSH (DLDIOC | 0x0e)
+#define DLDIOC_CLRAUTOPUSH (DLDIOC | 0x0f)
+typedef struct dld_ioc_ap {
+ datalink_id_t dia_linkid;
+ uint_t dia_anchor;
+ uint_t dia_npush;
+ char dia_aplist[MAXAPUSH][FMNAMESZ+1];
+} dld_ioc_ap_t;
+
+#define DLDIOC_DOORSERVER (DLDIOC | 0x10)
+typedef struct dld_ioc_door {
+ boolean_t did_start_door;
+} dld_ioc_door_t;
+
+#define DLDIOC_RENAME (DLDIOC | 0x11)
+typedef struct dld_ioc_rename {
+ datalink_id_t dir_linkid1;
+ datalink_id_t dir_linkid2;
+ char dir_link[MAXLINKNAMELEN];
+} dld_ioc_rename_t;
+
/*
- * DLDIOCHOLDVLAN/DLDIOCRELEVLAN are added to support a "hold/release"
- * operation on a VLAN. A hold will cause a VLAN to be created or the
- * reference count will be increased, release will do the reverse.
+ * DLDIOC_SETZID sets the zoneid of a given link. It could cause a VLAN to be
+ * implicitly created. Note that we will hold a reference for the given link
+ * whenever it has a zoneid other than the global zone.
*/
-#define DLDIOCHOLDVLAN (DLDIOC | 0x08)
+#define DLDIOC_SETZID (DLDIOC | 0x12)
+typedef struct dld_ioc_setzid {
+ char dis_link[MAXLINKNAMELEN];
+ zoneid_t dis_zid;
+} dld_ioc_setzid_t;
+
+#define DLDIOC_GETZID (DLDIOC | 0x13)
+typedef struct dld_ioc_getzid {
+ datalink_id_t dig_linkid;
+ zoneid_t dig_zid;
+} dld_ioc_getzid_t;
-#define DLDIOCRELEVLAN (DLDIOC | 0x09)
-
-#define DLDIOCZIDGET (DLDIOC | 0x0a)
+/*
+ * data-link autopush configuration.
+ */
+struct dlautopush {
+ uint_t dap_anchor;
+ uint_t dap_npush;
+ char dap_aplist[MAXAPUSH][FMNAMESZ+1];
+};
#ifdef _KERNEL
int dld_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **);
@@ -173,6 +231,7 @@ void dld_wput(queue_t *, mblk_t *);
void dld_wsrv(queue_t *);
void dld_init_ops(struct dev_ops *, const char *);
void dld_fini_ops(struct dev_ops *);
+int dld_autopush(dev_t *, struct dlautopush *);
#endif
#ifdef __cplusplus
diff --git a/usr/src/uts/common/sys/dld_impl.h b/usr/src/uts/common/sys/dld_impl.h
index 14f799dcd9..1df8c8e1cf 100644
--- a/usr/src/uts/common/sys/dld_impl.h
+++ b/usr/src/uts/common/sys/dld_impl.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -29,6 +29,7 @@
#pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/types.h>
+#include <sys/conf.h>
#include <sys/ethernet.h>
#include <sys/stream.h>
#include <sys/dlpi.h>
@@ -56,6 +57,7 @@ typedef enum {
} dld_passivestate_t;
typedef struct dld_str dld_str_t;
+typedef void (*dld_tx_t)(struct dld_str *, mblk_t *);
/*
* dld_str_t object definition.
@@ -72,11 +74,6 @@ struct dld_str {
minor_t ds_minor;
/*
- * PPA number this stream is attached to.
- */
- t_uscalar_t ds_ppa;
-
- /*
* Read/write queues for the stream which the object represents.
*/
queue_t *ds_rq;
@@ -200,21 +197,60 @@ struct dld_str {
mblk_t *ds_tx_list_tail;
uint_t ds_tx_cnt;
uint_t ds_tx_msgcnt;
+ timeout_id_t ds_tx_qdepth_tid;
boolean_t ds_tx_qbusy;
+ dld_tx_t ds_tx;
+ dld_tx_t ds_unitdata_tx;
+ kmutex_t ds_tx_lock;
+ kcondvar_t ds_tx_cv;
+ uint32_t ds_intx_cnt;
+ boolean_t ds_detaching;
+
+ /*
+ * Pending control messages to be processed.
+ */
+ mblk_t *ds_pending_head;
+ mblk_t *ds_pending_tail;
+
+ taskqid_t ds_tid;
+ kmutex_t ds_disp_lock;
+ kcondvar_t ds_disp_cv;
+ boolean_t ds_closing;
+
/*
- * Number of threads currently in dld. If there is a pending
- * request, it is placed in ds_pending_req and the operation
- * will finish when dld becomes single-threaded.
+ * Used to process ioctl message for control node. See comments
+ * above dld_ioctl().
*/
- kmutex_t ds_thr_lock;
- uint_t ds_thr;
- uint_t ds_pending_cnt;
- mblk_t *ds_pending_req;
- task_func_t *ds_pending_op;
- kcondvar_t ds_pending_cv;
+ void (*ds_ioctl)(queue_t *, mblk_t *);
} dld_str;
+#define DLD_TX_ENTER(dsp) { \
+ mutex_enter(&(dsp)->ds_tx_lock); \
+ (dsp)->ds_intx_cnt++; \
+ mutex_exit(&(dsp)->ds_tx_lock); \
+}
+
+#define DLD_TX_EXIT(dsp) { \
+ mutex_enter(&(dsp)->ds_tx_lock); \
+ if ((--(dsp)->ds_intx_cnt == 0) && (dsp)->ds_detaching) \
+ cv_signal(&(dsp)->ds_tx_cv); \
+ mutex_exit(&(dsp)->ds_tx_lock); \
+}
+
+/*
+ * Quiesce the traffic.
+ */
+#define DLD_TX_QUIESCE(dsp) { \
+ mutex_enter(&(dsp)->ds_tx_lock); \
+ (dsp)->ds_tx = (dsp)->ds_unitdata_tx = NULL; \
+ (dsp)->ds_detaching = B_TRUE; \
+ while ((dsp)->ds_intx_cnt != 0) \
+ cv_wait(&(dsp)->ds_tx_cv, &(dsp)->ds_tx_lock); \
+ (dsp)->ds_detaching = B_FALSE; \
+ mutex_exit(&(dsp)->ds_tx_lock); \
+}
+
/*
* dld_str.c module.
*/
@@ -232,22 +268,26 @@ extern void dld_str_rx_fastpath(void *, mac_resource_handle_t,
mblk_t *, mac_header_info_t *);
extern void dld_str_rx_unitdata(void *, mac_resource_handle_t,
mblk_t *, mac_header_info_t *);
+
extern void dld_tx_flush(dld_str_t *);
-extern void dld_tx_enqueue(dld_str_t *, mblk_t *, boolean_t);
extern void dld_str_notify_ind(dld_str_t *);
-extern void str_mdata_fastpath_put(dld_str_t *, mblk_t *);
extern void dld_tx_single(dld_str_t *, mblk_t *);
+extern void str_mdata_fastpath_put(dld_str_t *, mblk_t *);
+extern void str_mdata_raw_put(dld_str_t *, mblk_t *);
+
+extern void dld_ioctl(queue_t *, mblk_t *);
+extern void dld_finish_pending_task(dld_str_t *);
/*
* dld_proto.c
*/
-extern void dld_proto(dld_str_t *, mblk_t *);
-extern void dld_finish_pending_ops(dld_str_t *);
+extern void dld_wput_proto_nondata(dld_str_t *, mblk_t *);
+extern void dld_wput_proto_data(dld_str_t *, mblk_t *);
extern void dld_capabilities_disable(dld_str_t *);
/*
* Options: there should be a separate bit defined here for each
- * DLD_PROP... defined in dld.h.
+ * DLD_PROP... defined in dld.h.
*/
#define DLD_OPT_NO_FASTPATH 0x00000001
#define DLD_OPT_NO_POLL 0x00000002
@@ -257,34 +297,23 @@ extern void dld_capabilities_disable(dld_str_t *);
extern uint32_t dld_opt;
/*
- * Useful macros.
+ * autopush information
*/
+typedef struct dld_ap {
+ datalink_id_t da_linkid;
+ struct dlautopush da_ap;
-#define IMPLY(p, c) (!(p) || (c))
+#define da_anchor da_ap.dap_anchor
+#define da_npush da_ap.dap_npush
+#define da_aplist da_ap.dap_aplist
-#define DLD_ENTER(dsp) { \
- mutex_enter(&dsp->ds_thr_lock); \
- ++dsp->ds_thr; \
- ASSERT(dsp->ds_thr != 0); \
- mutex_exit(&dsp->ds_thr_lock); \
-}
+} dld_ap_t;
-#define DLD_EXIT(dsp) { \
- mutex_enter(&dsp->ds_thr_lock); \
- ASSERT(dsp->ds_thr > 0); \
- if (--dsp->ds_thr == 0 && dsp->ds_pending_req != NULL) \
- dld_finish_pending_ops(dsp); \
- else \
- mutex_exit(&dsp->ds_thr_lock); \
-}
+/*
+ * Useful macros.
+ */
-#define DLD_WAKEUP(dsp) { \
- mutex_enter(&dsp->ds_thr_lock); \
- ASSERT(dsp->ds_pending_cnt > 0); \
- if (--dsp->ds_pending_cnt == 0) \
- cv_signal(&dsp->ds_pending_cv); \
- mutex_exit(&dsp->ds_thr_lock); \
-}
+#define IMPLY(p, c) (!(p) || (c))
#ifdef DEBUG
#define DLD_DBG cmn_err
diff --git a/usr/src/uts/common/sys/dlpi.h b/usr/src/uts/common/sys/dlpi.h
index 1d1451c082..355280f920 100644
--- a/usr/src/uts/common/sys/dlpi.h
+++ b/usr/src/uts/common/sys/dlpi.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -50,6 +50,7 @@ extern "C" {
#define DLIOC ('D' << 8)
#define DLIOCRAW (DLIOC|1) /* M_DATA "raw" mode */
#define DLIOCNATIVE (DLIOC|2) /* Native traffic mode */
+#define DLIOCMARGININFO (DLIOC|3) /* margin size info */
#define DLIOCHDRINFO (DLIOC|10) /* IP fast-path */
#define DL_IOC_HDR_INFO DLIOCHDRINFO
@@ -1663,6 +1664,26 @@ extern void dlphysaddrack(queue_t *, mblk_t *, void *, t_uscalar_t);
extern void dlcapabsetqid(dl_mid_t *, const queue_t *);
extern boolean_t dlcapabcheckqid(const dl_mid_t *, const queue_t *);
extern void dlnotifyack(queue_t *, mblk_t *, uint32_t);
+
+/*
+ * The ldi_handle_t typedef is in <sys/sunldi.h>, which in turn requires
+ * <sys/sunddi.h>, which pulls in <sys/cmn_err.h>, which declares kernel
+ * versions of the printf() functions that conflict with the libc ones.
+ * This causes conflicts when building MDB modules like ARP that #define
+ * _KERNEL. So we use `struct __ldi_handle *' instead.
+ */
+struct __ldi_handle;
+extern int dl_attach(struct __ldi_handle *, int, dl_error_ack_t *);
+extern int dl_bind(struct __ldi_handle *, uint_t, dl_error_ack_t *);
+extern int dl_phys_addr(struct __ldi_handle *, uchar_t *, size_t *,
+ dl_error_ack_t *);
+extern int dl_info(struct __ldi_handle *, dl_info_ack_t *, uchar_t *, size_t *,
+ dl_error_ack_t *);
+extern int dl_notify(struct __ldi_handle *, uint32_t *, dl_error_ack_t *);
+extern const char *dl_errstr(t_uscalar_t);
+extern const char *dl_primstr(t_uscalar_t);
+extern const char *dl_mactypestr(t_uscalar_t);
+
#endif /* _KERNEL */
#ifdef __cplusplus
diff --git a/usr/src/uts/common/sys/dls.h b/usr/src/uts/common/sys/dls.h
index 77bf2c1e58..f69a14e740 100644
--- a/usr/src/uts/common/sys/dls.h
+++ b/usr/src/uts/common/sys/dls.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -30,6 +30,7 @@
#include <sys/types.h>
#include <sys/stream.h>
+#include <net/if.h>
#include <sys/mac.h>
/*
@@ -54,28 +55,172 @@ extern "C" {
* Macros for converting ppas to instance #s, Vlan ID, or minor.
*/
#define DLS_PPA2INST(ppa) ((int)((ppa) % 1000))
-#define DLS_PPA2VID(ppa) ((uint16_t)((ppa) / 1000))
-#define DLS_PPA2MINOR(ppa) ((minor_t)((DLS_PPA2INST(ppa)) + 1))
+#define DLS_PPA2VID(ppa) ((ppa) / 1000)
/*
- * Maps a (VID, INST) pair to ppa
+ * Converts a minor to an instance#; makes sense only when minor <= 1000.
*/
-#define DLS_VIDINST2PPA(vid, inst) ((minor_t)((vid) * 1000 + (inst)))
+#define DLS_MINOR2INST(minor) ((int)((minor) - 1))
+
+typedef enum {
+ DATALINK_CLASS_PHYS = 0x01,
+ DATALINK_CLASS_VLAN = 0x02,
+ DATALINK_CLASS_AGGR = 0x04,
+ DATALINK_CLASS_VNIC = 0x08
+} datalink_class_t;
+
+#define DATALINK_CLASS_ALL (DATALINK_CLASS_PHYS | \
+ DATALINK_CLASS_VLAN | DATALINK_CLASS_AGGR | DATALINK_CLASS_VNIC)
/*
- * Converts a minor to an instance#; makes sense only when minor <= 1000.
+ * A combination of flags and media.
+ * flags is the higher 32 bits, and if it is 0x01, it indicates all media
+ * types can be accepted; otherwise, only the given media type (specified
+ * in the lower 32 bits) is accepted.
*/
-#define DLS_MINOR2INST(minor) ((int)((minor) - 1))
+typedef uint64_t datalink_media_t;
+
+#define DATALINK_ANY_MEDIATYPE \
+ ((datalink_media_t)(((datalink_media_t)0x01) << 32))
+
+#define DATALINK_MEDIA_ACCEPTED(dmedia, media) \
+ (((uint32_t)(((dmedia) >> 32) & 0xfffffffful) & 0x01) ? \
+ B_TRUE : ((uint32_t)((dmedia) & 0xfffffffful) == (media)))
+
+#define MAXLINKATTRLEN 32
+
+/*
+ * Link attributes used by the kernel.
+ */
+/*
+ * The major number and instance number of the underlying physical device
+ * are kept as FPHYMAJ and FPHYINST (major, instance + 1).
+ *
+ * Set for physical links only.
+ */
+#define FPHYMAJ "phymaj" /* uint64_t */
+#define FPHYINST "phyinst" /* uint64_t */
+
+/*
+ * The devname of the physical link. For example, bge0, ce1. Set for physical
+ * links only.
+ */
+#define FDEVNAME "devname" /* string */
+
+#define DLMGMT_DOOR "/etc/.dlmgmt_door"
+/*
+ * Door upcall command.
+ */
+#define DLMGMT_CMD_DLS_CREATE 1
+#define DLMGMT_CMD_DLS_GETATTR 2
+#define DLMGMT_CMD_DLS_DESTROY 3
+#define DLMGMT_CMD_GETNAME 4
+#define DLMGMT_CMD_GETLINKID 5
+#define DLMGMT_CMD_GETNEXT 6
+#define DLMGMT_CMD_DLS_UPDATE 7
+#define DLMGMT_CMD_BASE 128
+
+/*
+ * Indicate the link mapping is active or persistent
+ */
+#define DLMGMT_ACTIVE 0x01
+#define DLMGMT_PERSIST 0x02
+
+/* upcall argument */
+typedef struct dlmgmt_upcall_arg_create {
+ int ld_cmd;
+ datalink_class_t ld_class;
+ uint32_t ld_media;
+ boolean_t ld_persist;
+ uint64_t ld_phymaj;
+ uint64_t ld_phyinst;
+ char ld_devname[MAXNAMELEN];
+} dlmgmt_upcall_arg_create_t;
+
+typedef struct dlmgmt_upcall_arg_destroy {
+ int ld_cmd;
+ datalink_id_t ld_linkid;
+ boolean_t ld_persist;
+ int ld_reserved;
+} dlmgmt_upcall_arg_destroy_t;
+
+typedef struct dlmgmt_upcall_arg_update {
+ int ld_cmd;
+ boolean_t ld_novanity;
+ uint32_t ld_media;
+ uint32_t ld_reserved;
+ char ld_devname[MAXNAMELEN];
+} dlmgmt_upcall_arg_update_t;
+
+typedef struct dlmgmt_upcall_arg_getattr {
+ int ld_cmd;
+ datalink_id_t ld_linkid;
+ char ld_attr[MAXLINKATTRLEN];
+} dlmgmt_upcall_arg_getattr_t;
+
+typedef struct dlmgmt_door_getname {
+ int ld_cmd;
+ datalink_id_t ld_linkid;
+} dlmgmt_door_getname_t;
+
+typedef struct dlmgmt_door_getlinkid {
+ int ld_cmd;
+ char ld_link[MAXLINKNAMELEN];
+} dlmgmt_door_getlinkid_t;
+
+typedef struct dlmgmt_door_getnext_s {
+ int ld_cmd;
+ datalink_id_t ld_linkid;
+ datalink_class_t ld_class;
+ uint32_t ld_flags;
+ datalink_media_t ld_dmedia;
+} dlmgmt_door_getnext_t;
+
+/* upcall return value */
+struct dlmgmt_linkid_retval_s {
+ uint_t lr_err;
+ datalink_id_t lr_linkid;
+ uint32_t lr_flags;
+ datalink_class_t lr_class;
+ uint32_t lr_media;
+ uint32_t lr_reserved;
+};
+
+typedef struct dlmgmt_linkid_retval_s dlmgmt_create_retval_t,
+ dlmgmt_update_retval_t,
+ dlmgmt_getlinkid_retval_t,
+ dlmgmt_getnext_retval_t;
+
+typedef struct dlmgmt_getname_retval_s {
+ uint_t lr_err;
+ char lr_link[MAXLINKNAMELEN];
+ datalink_class_t lr_class;
+ uint32_t lr_media;
+ uint32_t lr_flags;
+} dlmgmt_getname_retval_t;
+
+struct dlmgmt_null_retval_s {
+ uint_t lr_err;
+};
+
+typedef struct dlmgmt_null_retval_s dlmgmt_destroy_retval_t;
+
+typedef struct dlmgmt_getattr_retval_s {
+ uint_t lr_err;
+ uint_t lr_type;
+ char lr_attr[1];
+} dlmgmt_getattr_retval_t;
#ifdef _KERNEL
-extern int dls_create(const char *, const char *);
-extern int dls_destroy(const char *);
+#define DLS_MAX_PPA 999
+#define DLS_MAX_MINOR (DLS_MAX_PPA + 1)
-typedef struct dls_t *dls_channel_t;
+typedef struct dls_t *dls_channel_t;
-extern int dls_open(const char *, dls_channel_t *);
-extern void dls_close(dls_channel_t);
+extern int dls_open_style2_vlan(major_t, uint_t, dls_channel_t *);
+extern int dls_open_by_dev(dev_t, dls_channel_t *);
+extern void dls_close(dls_channel_t);
extern mac_handle_t dls_mac(dls_channel_t);
extern uint16_t dls_vid(dls_channel_t);
@@ -83,26 +228,27 @@ extern uint16_t dls_vid(dls_channel_t);
#define DLS_SAP_LLC 0
#define DLS_SAP_PROMISC (1 << 16)
-extern int dls_bind(dls_channel_t, uint32_t);
-extern void dls_unbind(dls_channel_t);
+extern int dls_bind(dls_channel_t, uint32_t);
+extern void dls_unbind(dls_channel_t);
#define DLS_PROMISC_SAP 0x00000001
#define DLS_PROMISC_MULTI 0x00000002
#define DLS_PROMISC_PHYS 0x00000004
-extern int dls_promisc(dls_channel_t, uint32_t);
+extern int dls_promisc(dls_channel_t, uint32_t);
-extern int dls_multicst_add(dls_channel_t, const uint8_t *);
-extern int dls_multicst_remove(dls_channel_t, const uint8_t *);
+extern int dls_multicst_add(dls_channel_t, const uint8_t *);
+extern int dls_multicst_remove(dls_channel_t, const uint8_t *);
-extern mblk_t *dls_header(dls_channel_t, const uint8_t *, uint16_t, uint_t,
- mblk_t **);
-extern int dls_header_info(dls_channel_t, mblk_t *, mac_header_info_t *);
+extern mblk_t *dls_header(dls_channel_t, const uint8_t *,
+ uint16_t, uint_t, mblk_t **);
+extern int dls_header_info(dls_channel_t, mblk_t *,
+ mac_header_info_t *);
-typedef void (*dls_rx_t)(void *, mac_resource_handle_t, mblk_t *,
- mac_header_info_t *);
+typedef void (*dls_rx_t)(void *, mac_resource_handle_t, mblk_t *,
+ mac_header_info_t *);
-extern void dls_rx_set(dls_channel_t, dls_rx_t, void *);
+extern void dls_rx_set(dls_channel_t, dls_rx_t, void *);
extern mblk_t *dls_tx(dls_channel_t, mblk_t *);
@@ -110,7 +256,47 @@ extern boolean_t dls_active_set(dls_channel_t);
extern void dls_active_clear(dls_channel_t);
extern dev_info_t *dls_finddevinfo(dev_t);
-extern int dls_ppa_from_minor(minor_t, t_uscalar_t *);
+
+typedef struct dls_devnet_s *dls_dl_handle_t;
+typedef struct dls_dev_t *dls_dev_handle_t;
+
+extern int dls_devnet_open(const char *,
+ dls_dl_handle_t *, dev_t *);
+extern void dls_devnet_close(dls_dl_handle_t);
+extern boolean_t dls_devnet_rebuild();
+
+extern int dls_devnet_rename(datalink_id_t, datalink_id_t,
+ const char *);
+extern int dls_devnet_create(mac_handle_t, datalink_id_t);
+extern int dls_devnet_destroy(mac_handle_t, datalink_id_t *);
+extern int dls_devnet_recreate(mac_handle_t, datalink_id_t);
+extern int dls_devnet_create_vlan(datalink_id_t,
+ datalink_id_t, uint16_t, boolean_t);
+extern int dls_devnet_destroy_vlan(datalink_id_t);
+extern int dls_devnet_hold_tmp(datalink_id_t, dls_dl_handle_t *);
+extern void dls_devnet_rele_tmp(dls_dl_handle_t);
+
+extern const char *dls_devnet_mac(dls_dl_handle_t);
+extern uint16_t dls_devnet_vid(dls_dl_handle_t);
+extern datalink_id_t dls_devnet_linkid(dls_dl_handle_t);
+extern boolean_t dls_devnet_is_explicit(dls_dl_handle_t);
+extern int dls_devnet_dev2linkid(dev_t, datalink_id_t *);
+extern int dls_devnet_phydev(datalink_id_t, dev_t *);
+extern int dls_devnet_setzid(const char *, zoneid_t);
+extern int dls_devnet_getzid(datalink_id_t, zoneid_t *);
+
+extern int dls_mgmt_door_set(boolean_t);
+extern int dls_mgmt_create(const char *, dev_t, datalink_class_t,
+ uint32_t, boolean_t, datalink_id_t *);
+extern int dls_mgmt_destroy(datalink_id_t, boolean_t);
+extern int dls_mgmt_update(const char *, uint32_t, boolean_t,
+ uint32_t *, datalink_id_t *);
+extern int dls_mgmt_get_linkinfo(datalink_id_t, char *,
+ datalink_class_t *, uint32_t *, uint32_t *);
+extern int dls_mgmt_get_linkid(const char *, datalink_id_t *);
+extern datalink_id_t dls_mgmt_get_next(datalink_id_t, datalink_class_t,
+ datalink_media_t, uint32_t);
+
#endif /* _KERNEL */
#ifdef __cplusplus
diff --git a/usr/src/uts/common/sys/dls_impl.h b/usr/src/uts/common/sys/dls_impl.h
index c2a2dcf24c..83bccd20bb 100644
--- a/usr/src/uts/common/sys/dls_impl.h
+++ b/usr/src/uts/common/sys/dls_impl.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -71,16 +71,56 @@ struct dls_link_s {
typedef struct dls_impl_s dls_impl_t;
typedef struct dls_head_s dls_head_t;
+/*
+ * The maximum length of an SPA (subnetwork point of attachment). It is of
+ * the form <macname/vid>.
+ */
+#define MAXSPALEN (MAXNAMELEN + 5)
+
typedef struct dls_vlan_s {
- char dv_name[IFNAMSIZ];
- uint_t dv_ref;
+ /*
+ * The following fields will not change after dls_vlan_t creation.
+ */
dls_link_t *dv_dlp;
uint16_t dv_id;
+
+ /*
+ * Unique SPA (of the form <macname/vid>) identifying a data-link;
+ * is needed to avoid name collisions between an explicitly and
+ * implicitly created VLANs.
+ */
+ char dv_spa[MAXSPALEN];
+
+ /*
+ * The ppa value of the associated device. Used to derive this link's
+ * devfs node name.
+ */
+ uint_t dv_ppa;
+
+ /*
+ * The dev_t used to access this dls_vlan_t.
+ */
+ dev_t dv_dev;
+
+ dev_info_t *dv_dip;
kstat_t *dv_ksp;
- minor_t dv_minor;
- t_uscalar_t dv_ppa;
+ uint32_t dv_force : 1;
+
+ /*
+ * The following fields are protected by dv_lock.
+ */
+ kmutex_t dv_lock;
+
+ /*
+ * Reference count of dls_impl_t plus explicit creation of the link
+ */
+ uint_t dv_ref;
+
+ /*
+ * The reference count of this vlan is opened in its own zone.
+ */
+ uint_t dv_zone_ref;
zoneid_t dv_zid;
- dls_impl_t *dv_impl_list;
} dls_vlan_t;
struct dls_impl_s {
@@ -98,14 +138,15 @@ struct dls_impl_s {
void *di_rx_arg;
mac_resource_add_t di_ring_add;
const mac_txinfo_t *di_txinfo;
- boolean_t di_bound;
- boolean_t di_removing;
- boolean_t di_active;
+ uint_t di_bound : 1,
+ di_removing : 1,
+ di_active : 1,
+ di_local : 1;
+
uint8_t di_unicst_addr[MAXMACADDRLEN];
soft_ring_t **di_soft_ring_list;
uint_t di_soft_ring_size;
- zoneid_t di_zid;
- dls_impl_t *di_next_impl;
+ dls_dl_handle_t di_ddh;
};
struct dls_head_s {
@@ -121,37 +162,43 @@ extern void dls_link_rele(dls_link_t *);
extern void dls_link_add(dls_link_t *, uint32_t, dls_impl_t *);
extern void dls_link_remove(dls_link_t *, dls_impl_t *);
extern int dls_link_header_info(dls_link_t *, mblk_t *,
- mac_header_info_t *);
+ mac_header_info_t *);
extern int dls_mac_hold(dls_link_t *);
extern void dls_mac_rele(dls_link_t *);
+extern boolean_t dls_mac_active_set(dls_link_t *);
+extern void dls_mac_active_clear(dls_link_t *);
extern void dls_mac_stat_create(dls_vlan_t *);
extern void dls_mac_stat_destroy(dls_vlan_t *);
extern void dls_vlan_init(void);
extern int dls_vlan_fini(void);
-extern int dls_vlan_create(const char *, const char *, uint16_t);
-extern int dls_vlan_destroy(const char *);
-extern int dls_vlan_hold(const char *, dls_vlan_t **, boolean_t);
+extern int dls_vlan_hold(const char *, uint16_t, dls_vlan_t **,
+ boolean_t, boolean_t);
+extern int dls_vlan_hold_by_dev(dev_t, dls_vlan_t **);
extern void dls_vlan_rele(dls_vlan_t *);
-extern int dls_vlan_walk(int (*)(dls_vlan_t *, void *), void *);
-extern dev_info_t *dls_vlan_finddevinfo(dev_t);
-extern int dls_vlan_ppa_from_minor(minor_t, t_uscalar_t *);
-extern int dls_vlan_rele_by_name(const char *);
-extern minor_t dls_minor_hold(boolean_t);
-extern void dls_minor_rele(minor_t);
-extern int dls_vlan_setzoneid(char *, zoneid_t, boolean_t);
-extern int dls_vlan_getzoneid(char *, zoneid_t *);
-extern void dls_vlan_add_impl(dls_vlan_t *, dls_impl_t *);
-extern void dls_vlan_remove_impl(dls_vlan_t *, dls_impl_t *);
+extern int dls_vlan_destroy(const char *, uint16_t);
+extern int dls_vlan_create(const char *, uint16_t, boolean_t);
+extern int dls_vlan_setzid(const char *, uint16_t, zoneid_t);
+extern int dls_stat_update(kstat_t *, dls_vlan_t *, int);
+extern int dls_stat_create(const char *, int, const char *,
+ int (*)(struct kstat *, int), void *, kstat_t **);
+
+extern int dls_devnet_open_by_dev(dev_t, dls_vlan_t **,
+ dls_dl_handle_t *);
extern void dls_init(void);
extern int dls_fini(void);
extern void dls_link_txloop(void *, mblk_t *);
extern boolean_t dls_accept(dls_impl_t *, mac_header_info_t *,
- dls_rx_t *, void **);
+ dls_rx_t *, void **);
extern boolean_t dls_accept_loopback(dls_impl_t *, mac_header_info_t *,
- dls_rx_t *, void **);
+ dls_rx_t *, void **);
+
+extern void dls_mgmt_init(void);
+extern void dls_mgmt_fini(void);
+
+extern int dls_mgmt_get_phydev(datalink_id_t, dev_t *);
#ifdef __cplusplus
}
diff --git a/usr/src/uts/common/sys/dls_soft_ring.h b/usr/src/uts/common/sys/dls_soft_ring.h
index 9a1a833eb7..403623853a 100644
--- a/usr/src/uts/common/sys/dls_soft_ring.h
+++ b/usr/src/uts/common/sys/dls_soft_ring.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -88,8 +88,6 @@ extern void soft_ring_unbind(void *);
extern void dls_soft_ring_fanout(void *, void *, mblk_t *, mac_header_info_t *);
extern boolean_t dls_soft_ring_enable(dls_channel_t, dl_capab_dls_t *);
extern void dls_soft_ring_disable(dls_channel_t);
-extern boolean_t dls_soft_ring_workers(dls_channel_t);
-extern void dls_soft_ring_rx_set(dls_channel_t, dls_rx_t, void *, int);
#ifdef __cplusplus
}
diff --git a/usr/src/uts/common/sys/fs/sdev_impl.h b/usr/src/uts/common/sys/fs/sdev_impl.h
index 281bc2faf7..7e5f75d7f7 100644
--- a/usr/src/uts/common/sys/fs/sdev_impl.h
+++ b/usr/src/uts/common/sys/fs/sdev_impl.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -193,6 +193,8 @@ typedef struct sdev_node {
struct sdev_global_data sdev_globaldata;
struct sdev_local_data sdev_localdata;
} sdev_instance_data;
+
+ void *sdev_private;
} sdev_node_t;
#define sdev_ldata sdev_instance_data.sdev_localdata
@@ -245,13 +247,16 @@ typedef enum {
} sdev_node_state_t;
/* sdev_flags */
-#define SDEV_BUILD 0x0001 /* directory cache out-of-date */
-#define SDEV_STALE 0x0002 /* stale sdev nodes */
-#define SDEV_GLOBAL 0x0004 /* global /dev nodes */
-#define SDEV_PERSIST 0x0008 /* backing store persisted node */
-#define SDEV_NO_NCACHE 0x0010 /* do not include in neg. cache */
-#define SDEV_DYNAMIC 0x0020 /* special-purpose vnode ops (ex: pts) */
-#define SDEV_VTOR 0x0040 /* validate sdev_nodes during search */
+#define SDEV_BUILD 0x0001 /* directory cache out-of-date */
+#define SDEV_STALE 0x0002 /* stale sdev nodes */
+#define SDEV_GLOBAL 0x0004 /* global /dev nodes */
+#define SDEV_PERSIST 0x0008 /* backing store persisted node */
+#define SDEV_NO_NCACHE 0x0010 /* do not include in neg. cache */
+#define SDEV_DYNAMIC 0x0020 /* special-purpose vnode ops */
+ /* (ex: pts) */
+#define SDEV_VTOR 0x0040 /* validate sdev_nodes during search */
+#define SDEV_ATTR_INVALID 0x0080 /* invalid node attributes, */
+ /* need update */
/* sdev_lookup_flags */
#define SDEV_LOOKUP 0x0001 /* node creation in progress */
@@ -339,6 +344,12 @@ extern int devname_setattr_func(struct vnode *, struct vattr *, int,
struct cred *, int (*)(struct sdev_node *, struct vattr *, int), int);
/*
+ * devname_inactive_func()
+ */
+extern void devname_inactive_func(struct vnode *, struct cred *,
+ void (*)(struct vnode *));
+
+/*
* /dev file system instance defines
*/
/*
@@ -607,6 +618,7 @@ extern int sdev_reserve_subdirs(struct sdev_node *);
extern int prof_lookup();
extern void prof_filldir(struct sdev_node *);
extern int devpts_validate(struct sdev_node *dv);
+extern int devnet_validate(struct sdev_node *dv);
extern void *sdev_get_vtor(struct sdev_node *dv);
/*
@@ -616,7 +628,6 @@ extern int sdev_modctl_readdir(const char *, char ***, int *, int *);
extern void sdev_modctl_readdir_free(char **, int, int);
extern int sdev_modctl_devexists(const char *);
-
/*
* ncache handlers
*/
@@ -637,9 +648,11 @@ extern int devtype;
extern kmem_cache_t *sdev_node_cache;
extern struct vnodeops *sdev_vnodeops;
extern struct vnodeops *devpts_vnodeops;
+extern struct vnodeops *devnet_vnodeops;
extern struct sdev_data *sdev_origins; /* mount info for global /dev instance */
extern const fs_operation_def_t sdev_vnodeops_tbl[];
extern const fs_operation_def_t devpts_vnodeops_tbl[];
+extern const fs_operation_def_t devnet_vnodeops_tbl[];
extern const fs_operation_def_t devsys_vnodeops_tbl[];
extern const fs_operation_def_t devpseudo_vnodeops_tbl[];
@@ -669,6 +682,7 @@ extern int sdev_debug;
#define SDEV_DEBUG_PROFILE 0x200 /* trace sdev_profile */
#define SDEV_DEBUG_MODCTL 0x400 /* trace modctl activity */
#define SDEV_DEBUG_FLK 0x800 /* trace failed lookups */
+#define SDEV_DEBUG_NET 0x1000 /* /dev/net tracing */
#define sdcmn_err(args) if (sdev_debug & SDEV_DEBUG) printf args
#define sdcmn_err2(args) if (sdev_debug & SDEV_DEBUG_VOPS) printf args
@@ -681,6 +695,7 @@ extern int sdev_debug;
#define sdcmn_err9(args) if (sdev_debug & SDEV_DEBUG_SDEV_NODE) printf args
#define sdcmn_err10(args) if (sdev_debug & SDEV_DEBUG_PROFILE) printf args
#define sdcmn_err11(args) if (sdev_debug & SDEV_DEBUG_MODCTL) printf args
+#define sdcmn_err12(args) if (sdev_debug & SDEV_DEBUG_NET) printf args
#define impossible(args) printf args
#else
#define sdcmn_err(args) /* does nothing */
@@ -694,6 +709,7 @@ extern int sdev_debug;
#define sdcmn_err9(args) /* does nothing */
#define sdcmn_err10(args) /* does nothing */
#define sdcmn_err11(args) /* does nothing */
+#define sdcmn_err12(args) /* does nothing */
#define impossible(args) /* does nothing */
#endif
diff --git a/usr/src/uts/common/sys/gld.h b/usr/src/uts/common/sys/gld.h
index 3f3c01848e..fd7b8d37d2 100644
--- a/usr/src/uts/common/sys/gld.h
+++ b/usr/src/uts/common/sys/gld.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -176,7 +176,7 @@ typedef struct gld_mac_info {
uchar_t *gldm_broadcast_addr; /* SET BY DRIVER */
gld_lock_t gldm_lock; /* GLD PRIVATE */
ddi_iblock_cookie_t gldm_cookie; /* SET BY DRIVER */
- uint32_t reserved3; /* GLD PRIVATE */
+ uint32_t gldm_margin; /* SET BY DRIVER */
uint32_t reserved4; /* GLD PRIVATE */
uint32_t gldm_maxpkt; /* SET BY DRIVER */
uint32_t gldm_minpkt; /* SET BY DRIVER */
diff --git a/usr/src/uts/common/sys/mac.h b/usr/src/uts/common/sys/mac.h
index 63d7ff42a0..4fd83059c4 100644
--- a/usr/src/uts/common/sys/mac.h
+++ b/usr/src/uts/common/sys/mac.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -84,6 +84,11 @@ typedef enum {
LINK_DUPLEX_FULL
} link_duplex_t;
+typedef uint32_t datalink_id_t;
+#define DATALINK_INVALID_LINKID 0
+#define DATALINK_ALL_LINKID 0
+#define DATALINK_MAX_LINKID 0xffffffff
+
/*
* Maximum MAC address length
*/
@@ -113,6 +118,16 @@ typedef struct mac_stat_info_s {
#define IS_MACTYPE_STAT(stat) (stat >= MACTYPE_STAT_MIN)
/*
+ * Statistics maintained by the mac module, and possibly populated as link
+ * statistics.
+ */
+enum mac_mod_stat {
+ MAC_STAT_LINK_STATE,
+ MAC_STAT_LINK_UP,
+ MAC_STAT_PROMISC
+};
+
+/*
* Do not reorder, and add only to the end of this list.
*/
enum mac_driver_stat {
@@ -191,6 +206,20 @@ typedef struct mac_capab_lso_s {
} mac_capab_lso_t;
/*
+ * Information for legacy devices.
+ */
+typedef struct mac_capab_legacy_s {
+ /*
+ * Notifications that the legacy device does not support.
+ */
+ uint32_t ml_unsup_note;
+ /*
+ * dev_t of the legacy device; can be held to force attach.
+ */
+ dev_t ml_dev;
+} mac_capab_legacy_t;
+
+/*
* MAC layer capabilities. These capabilities are handled by the drivers'
* mc_capab_get() callbacks. Some capabilities require the driver to fill
* in a given data structure, and others are simply boolean capabilities.
@@ -199,11 +228,16 @@ typedef struct mac_capab_lso_s {
* care about by keeping a bitfield of these things around somewhere.
*/
typedef enum {
- MAC_CAPAB_HCKSUM = 0x01, /* data is a uint32_t for the txflags */
+ MAC_CAPAB_HCKSUM = 0x01, /* data is a uint32_t for the txflags */
MAC_CAPAB_POLL = 0x02, /* boolean only, no data */
- MAC_CAPAB_MULTIADDRESS = 0x04, /* data is multiaddress_capab_t */
- MAC_CAPAB_LSO = 0x08 /* data is mac_capab_lso_t */
+ MAC_CAPAB_MULTIADDRESS = 0x04, /* data is multiaddress_capab_t */
+ MAC_CAPAB_LSO = 0x08, /* data is mac_capab_lso_t */
+ MAC_CAPAB_NO_NATIVEVLAN = 0x10, /* boolean only, no data */
+ MAC_CAPAB_NO_ZCOPY = 0x20, /* boolean only, no data */
/* add new capabilities here */
+
+ /* The following capabilities are specific to softmac. */
+ MAC_CAPAB_LEGACY = 0x8001, /* data is mac_capab_legacy_t */
} mac_capab_t;
typedef int mac_addr_slot_t;
@@ -256,6 +290,8 @@ typedef void (*mac_ioctl_t)(void *, queue_t *, mblk_t *);
typedef void (*mac_resources_t)(void *);
typedef mblk_t *(*mac_tx_t)(void *, mblk_t *);
typedef boolean_t (*mac_getcapab_t)(void *, mac_capab_t, void *);
+typedef int (*mac_open_t)(void *);
+typedef void (*mac_close_t)(void *);
/*
* Drivers must set all of these callbacks except for mc_resources,
@@ -277,6 +313,8 @@ typedef struct mac_callbacks_s {
mac_resources_t mc_resources; /* Get the device resources */
mac_ioctl_t mc_ioctl; /* Process an unknown ioctl */
mac_getcapab_t mc_getcapab; /* Get capability information */
+ mac_open_t mc_open; /* Open the device */
+ mac_close_t mc_close; /* Close the device */
} mac_callbacks_t;
/*
@@ -288,6 +326,10 @@ typedef struct mac_callbacks_s {
#define MC_RESOURCES 0x001
#define MC_IOCTL 0x002
#define MC_GETCAPAB 0x004
+#define MC_OPEN 0x008
+#define MC_CLOSE 0x010
+
+#define MAC_MAX_MINOR 1000
typedef struct mac_register_s {
uint_t m_version; /* set by mac_alloc() */
@@ -302,6 +344,7 @@ typedef struct mac_register_s {
uint_t m_max_sdu;
void *m_pdata;
size_t m_pdata_size;
+ uint32_t m_margin;
} mac_register_t;
/*
@@ -325,6 +368,7 @@ typedef enum {
MAC_NOTE_DEVPROMISC,
MAC_NOTE_FASTPATH_FLUSH,
MAC_NOTE_VNIC,
+ MAC_NOTE_MARGIN,
MAC_NNOTE /* must be the last entry */
} mac_notify_type_t;
@@ -382,8 +426,9 @@ typedef struct mac_header_info_s {
uint32_t mhi_origsap;
uint32_t mhi_bindsap;
mac_addrtype_t mhi_dsttype;
- boolean_t mhi_istagged;
uint16_t mhi_tci;
+ uint_t mhi_istagged:1,
+ mhi_prom_looped:1;
} mac_header_info_t;
/*
@@ -493,6 +538,10 @@ typedef struct mactype_register_s {
* Client interface functions.
*/
extern int mac_open(const char *, mac_handle_t *);
+extern int mac_open_by_linkid(datalink_id_t,
+ mac_handle_t *);
+extern int mac_open_by_linkname(const char *,
+ mac_handle_t *);
extern void mac_close(mac_handle_t);
extern const mac_info_t *mac_info(mac_handle_t);
extern boolean_t mac_info_get(const char *, mac_info_t *);
@@ -500,14 +549,14 @@ extern uint64_t mac_stat_get(mac_handle_t, uint_t);
extern int mac_start(mac_handle_t);
extern void mac_stop(mac_handle_t);
extern int mac_promisc_set(mac_handle_t, boolean_t,
- mac_promisc_type_t);
+ mac_promisc_type_t);
extern boolean_t mac_promisc_get(mac_handle_t,
- mac_promisc_type_t);
+ mac_promisc_type_t);
extern int mac_multicst_add(mac_handle_t, const uint8_t *);
extern int mac_multicst_remove(mac_handle_t,
- const uint8_t *);
+ const uint8_t *);
extern boolean_t mac_unicst_verify(mac_handle_t,
- const uint8_t *, uint_t);
+ const uint8_t *, uint_t);
extern int mac_unicst_set(mac_handle_t, const uint8_t *);
extern void mac_unicst_get(mac_handle_t, uint8_t *);
extern void mac_dest_get(mac_handle_t, uint8_t *);
@@ -517,44 +566,48 @@ extern const mac_txinfo_t *mac_tx_get(mac_handle_t);
extern const mac_txinfo_t *mac_vnic_tx_get(mac_handle_t);
extern link_state_t mac_link_get(mac_handle_t);
extern mac_notify_handle_t mac_notify_add(mac_handle_t, mac_notify_t,
- void *);
+ void *);
extern void mac_notify_remove(mac_handle_t,
- mac_notify_handle_t);
+ mac_notify_handle_t);
extern void mac_notify(mac_handle_t);
extern mac_rx_handle_t mac_rx_add(mac_handle_t, mac_rx_t, void *);
extern mac_rx_handle_t mac_active_rx_add(mac_handle_t, mac_rx_t,
- void *);
+ void *);
extern void mac_rx_remove(mac_handle_t, mac_rx_handle_t,
- boolean_t);
+ boolean_t);
extern void mac_rx_remove_wait(mac_handle_t);
extern mblk_t *mac_txloop(void *, mblk_t *);
extern mac_txloop_handle_t mac_txloop_add(mac_handle_t, mac_txloop_t,
- void *);
+ void *);
extern void mac_txloop_remove(mac_handle_t,
- mac_txloop_handle_t);
+ mac_txloop_handle_t);
extern boolean_t mac_active_set(mac_handle_t);
extern boolean_t mac_active_shareable_set(mac_handle_t);
extern void mac_active_clear(mac_handle_t);
extern void mac_active_rx(void *, mac_resource_handle_t,
- mblk_t *);
+ mblk_t *);
extern boolean_t mac_vnic_set(mac_handle_t, mac_txinfo_t *,
- mac_getcapab_t, void *);
+ mac_getcapab_t, void *);
extern void mac_vnic_clear(mac_handle_t);
extern void mac_resource_set(mac_handle_t,
- mac_resource_add_t, void *);
+ mac_resource_add_t, void *);
extern dev_info_t *mac_devinfo_get(mac_handle_t);
+extern const char *mac_name(mac_handle_t);
+extern minor_t mac_minor(mac_handle_t);
extern boolean_t mac_capab_get(mac_handle_t, mac_capab_t,
- void *);
+ void *);
extern boolean_t mac_vnic_capab_get(mac_handle_t, mac_capab_t,
- void *);
+ void *);
extern boolean_t mac_sap_verify(mac_handle_t, uint32_t,
- uint32_t *);
+ uint32_t *);
extern mblk_t *mac_header(mac_handle_t, const uint8_t *,
- uint32_t, mblk_t *, size_t);
+ uint32_t, mblk_t *, size_t);
extern int mac_header_info(mac_handle_t, mblk_t *,
- mac_header_info_t *);
+ mac_header_info_t *);
extern mblk_t *mac_header_cook(mac_handle_t, mblk_t *);
extern mblk_t *mac_header_uncook(mac_handle_t, mblk_t *);
+extern minor_t mac_minor_hold(boolean_t);
+extern void mac_minor_rele(minor_t);
/*
* Driver interface functions.
@@ -565,31 +618,38 @@ extern int mac_register(mac_register_t *, mac_handle_t *);
extern int mac_disable(mac_handle_t);
extern int mac_unregister(mac_handle_t);
extern void mac_rx(mac_handle_t, mac_resource_handle_t,
- mblk_t *);
+ mblk_t *);
extern void mac_link_update(mac_handle_t, link_state_t);
extern void mac_unicst_update(mac_handle_t,
- const uint8_t *);
+ const uint8_t *);
extern void mac_tx_update(mac_handle_t);
extern void mac_resource_update(mac_handle_t);
extern mac_resource_handle_t mac_resource_add(mac_handle_t,
- mac_resource_t *);
+ mac_resource_t *);
extern int mac_pdata_update(mac_handle_t, void *,
- size_t);
+ size_t);
extern void mac_multicst_refresh(mac_handle_t,
- mac_multicst_t, void *, boolean_t);
+ mac_multicst_t, void *, boolean_t);
extern void mac_unicst_refresh(mac_handle_t, mac_unicst_t,
- void *);
+ void *);
extern void mac_promisc_refresh(mac_handle_t,
- mac_setpromisc_t, void *);
+ mac_setpromisc_t, void *);
+extern boolean_t mac_margin_update(mac_handle_t, uint32_t);
+extern void mac_margin_get(mac_handle_t, uint32_t *);
+extern int mac_margin_remove(mac_handle_t, uint32_t);
+extern int mac_margin_add(mac_handle_t, uint32_t *,
+ boolean_t);
extern void mac_init_ops(struct dev_ops *, const char *);
extern void mac_fini_ops(struct dev_ops *);
+extern uint32_t mac_no_notification(mac_handle_t);
+extern boolean_t mac_is_legacy(mac_handle_t);
+extern int mac_hold_exclusive(mac_handle_t);
+extern void mac_rele_exclusive(mac_handle_t);
+
extern mactype_register_t *mactype_alloc(uint_t);
extern void mactype_free(mactype_register_t *);
extern int mactype_register(mactype_register_t *);
extern int mactype_unregister(const char *);
-extern int mac_vlan_create(mac_handle_t, const char *,
- minor_t);
-extern void mac_vlan_remove(mac_handle_t, const char *);
#endif /* _KERNEL */
diff --git a/usr/src/uts/common/sys/mac_impl.h b/usr/src/uts/common/sys/mac_impl.h
index d8fdcaf8dc..c0acfc5c37 100644
--- a/usr/src/uts/common/sys/mac_impl.h
+++ b/usr/src/uts/common/sys/mac_impl.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -35,15 +35,6 @@
extern "C" {
#endif
-/*
- * Statistics maintained internally by the mac module.
- */
-enum mac_mod_stat {
- MAC_STAT_LINK_STATE,
- MAC_STAT_LINK_UP,
- MAC_STAT_PROMISC
-};
-
typedef struct mac_multicst_addr_s mac_multicst_addr_t;
struct mac_multicst_addr_s {
@@ -52,6 +43,14 @@ struct mac_multicst_addr_s {
uint8_t mma_addr[MAXMACADDRLEN];
};
+typedef struct mac_margin_req_s mac_margin_req_t;
+
+struct mac_margin_req_s {
+ mac_margin_req_t *mmr_nextp;
+ uint_t mmr_ref;
+ uint32_t mmr_margin;
+};
+
typedef struct mac_notify_fn_s mac_notify_fn_t;
struct mac_notify_fn_s {
@@ -118,9 +117,11 @@ typedef struct mac_vnic_tx_s {
* Each registered MAC is associated with a mac_t structure.
*/
typedef struct mac_impl_s {
+ /*
+ * The following fields are set in mac_register() and will not be
+ * changed until mac_unregister(). No lock is needed to access them.
+ */
char mi_name[LIFNAMSIZ];
- const char *mi_drvname;
- uint_t mi_instance;
void *mi_driver; /* Driver private data */
mac_info_t mi_info;
mactype_t *mi_type;
@@ -128,10 +129,22 @@ typedef struct mac_impl_s {
size_t mi_pdata_size;
mac_callbacks_t *mi_callbacks;
dev_info_t *mi_dip;
+ minor_t mi_minor;
+ dev_t mi_phy_dev;
+ kstat_t *mi_ksp;
+ uint_t mi_kstat_count;
+ mac_txinfo_t mi_txinfo;
+ mac_txinfo_t mi_txloopinfo;
+
+ krwlock_t mi_gen_lock;
+ uint32_t mi_oref;
uint32_t mi_ref;
boolean_t mi_disabled;
+ boolean_t mi_exclusive;
+
krwlock_t mi_state_lock;
uint_t mi_active;
+
krwlock_t mi_data_lock;
link_state_t mi_linkstate;
link_state_t mi_lastlinkstate;
@@ -140,25 +153,26 @@ typedef struct mac_impl_s {
uint8_t mi_addr[MAXMACADDRLEN];
uint8_t mi_dstaddr[MAXMACADDRLEN];
mac_multicst_addr_t *mi_mmap;
+
krwlock_t mi_notify_lock;
uint32_t mi_notify_bits;
kmutex_t mi_notify_bits_lock;
kthread_t *mi_notify_thread;
mac_notify_fn_t *mi_mnfp;
kcondvar_t mi_notify_cv;
+
krwlock_t mi_rx_lock;
mac_rx_fn_t *mi_mrfp;
krwlock_t mi_tx_lock;
mac_txloop_fn_t *mi_mtfp;
+
krwlock_t mi_resource_lock;
mac_resource_add_t mi_resource_add;
void *mi_resource_add_arg;
- kstat_t *mi_ksp;
- uint_t mi_kstat_count;
+
kmutex_t mi_activelink_lock;
boolean_t mi_activelink;
- mac_txinfo_t mi_txinfo;
- mac_txinfo_t mi_txloopinfo;
+
uint32_t mi_rx_ref; /* #threads in mac_rx() */
uint32_t mi_rx_removed; /* #callbacks marked */
/* for removal */
@@ -171,11 +185,23 @@ typedef struct mac_impl_s {
mac_txinfo_t mi_vnic_txloopinfo;
mac_getcapab_t mi_vnic_getcapab_fn;
void *mi_vnic_getcapab_arg;
+
+ boolean_t mi_legacy;
+ uint32_t mi_unsup_note;
+ uint32_t mi_margin;
+
+ /*
+ * List of margin value requests added by mac clients. This list is
+ * sorted: the first one has the greatest value.
+ */
+ mac_margin_req_t *mi_mmrp;
} mac_impl_t;
#define mi_getstat mi_callbacks->mc_getstat
#define mi_start mi_callbacks->mc_start
#define mi_stop mi_callbacks->mc_stop
+#define mi_open mi_callbacks->mc_open
+#define mi_close mi_callbacks->mc_close
#define mi_setpromisc mi_callbacks->mc_setpromisc
#define mi_multicst mi_callbacks->mc_multicst
#define mi_unicst mi_callbacks->mc_unicst
diff --git a/usr/src/uts/common/sys/param.h b/usr/src/uts/common/sys/param.h
index d73d4cf8be..bfd895e137 100644
--- a/usr/src/uts/common/sys/param.h
+++ b/usr/src/uts/common/sys/param.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -188,6 +188,13 @@ extern "C" {
#define MAXSYMLINKS 20
#define MAXNAMELEN 256
+/*
+ * MAXLINKNAMELEN defines the longest possible permitted datalink name,
+ * including the terminating NUL. Note that this must not be larger
+ * than related networking constants such as LIFNAMSIZ.
+ */
+#define MAXLINKNAMELEN 32
+
#ifndef NADDR
#define NADDR 13
#endif
diff --git a/usr/src/uts/common/sys/softmac.h b/usr/src/uts/common/sys/softmac.h
new file mode 100644
index 0000000000..c82a27c0d8
--- /dev/null
+++ b/usr/src/uts/common/sys/softmac.h
@@ -0,0 +1,50 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_SOFTMAC_H
+#define _SYS_SOFTMAC_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+#include <sys/sunddi.h>
+#include <sys/mac.h>
+#include <sys/dls.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int softmac_create(dev_info_t *, dev_t);
+int softmac_destroy(dev_info_t *, dev_t);
+int softmac_hold_device(dev_t, dls_dev_handle_t *);
+void softmac_rele_device(dls_dev_handle_t);
+void softmac_recreate();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_SOFTMAC_H */
diff --git a/usr/src/uts/common/sys/softmac_impl.h b/usr/src/uts/common/sys/softmac_impl.h
new file mode 100644
index 0000000000..93071c17a9
--- /dev/null
+++ b/usr/src/uts/common/sys/softmac_impl.h
@@ -0,0 +1,234 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_SOFTMAC_IMPL_H
+#define _SYS_SOFTMAC_IMPL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+#include <sys/ethernet.h>
+#include <sys/taskq.h>
+#include <sys/sunddi.h>
+#include <sys/sunldi.h>
+#include <sys/strsun.h>
+#include <sys/stream.h>
+#include <sys/dlpi.h>
+#include <sys/mac.h>
+#include <sys/mac_ether.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct softmac_lower_s {
+ struct softmac *sl_softmac;
+ queue_t *sl_wq;
+
+ /*
+ * sl_ctl_inprogress is used to serialize the control path. It will
+ * be set when either an ioctl or an M_{PC,}PROTO message is received
+ * from the upper layer, and will be cleared when processing done.
+ */
+ kmutex_t sl_ctl_mutex;
+ kcondvar_t sl_ctl_cv;
+ boolean_t sl_ctl_inprogress;
+
+ /*
+ * When a control message is processed, either sl_pending_prim or
+ * sl_pending_ioctl will be set. They will be cleared when the
+ * acknowledgement of the specific control message is received
+ * from the underlying legacy driver.
+ */
+ kmutex_t sl_mutex;
+ kcondvar_t sl_cv;
+ t_uscalar_t sl_pending_prim;
+ boolean_t sl_pending_ioctl;
+ mblk_t *sl_ack_mp;
+
+ mac_resource_handle_t sl_handle;
+ ldi_handle_t sl_lh;
+} softmac_lower_t;
+
+enum softmac_state {
+ SOFTMAC_INITIALIZED,
+ SOFTMAC_READY
+};
+
+typedef struct softmac_dev_s {
+ dev_t sd_dev;
+} softmac_dev_t;
+
+/*
+ * smac_flag values.
+ */
+#define SOFTMAC_GLDV3 0x01
+#define SOFTMAC_NOSUPP 0x02
+#define SOFTMAC_ATTACH_DONE 0x04
+#define SOFTMAC_NEED_RECREATE 0x08
+
+/*
+ * The softmac structure allows all minor nodes (at most two, style-1 and
+ * style-2) for the same device to be processed. A softmac_dev_t will be
+ * created for each minor node.
+ *
+ * We try to "register" the mac after all the softmac_dev_t's are processed so
+ * that even if DLPI operations fail (because of driver bugs) for one minor
+ * node, the other minor node can still be used to register the mac.
+ * (Specifically, an incorrect xxx_getinfo() implementation will cause style-2
+ * minor node mac registration to fail.)
+ */
+typedef struct softmac {
+ /*
+ * The following fields will be set when the softmac is created and
+ * will not change. No lock is required.
+ */
+ char smac_devname[MAXNAMELEN];
+ major_t smac_umajor;
+ int smac_uppa;
+ uint32_t smac_cnt; /* # of minor nodes for this device */
+
+ /*
+ * The following fields are protected by softmac_hash_lock.
+ */
+ /*
+ * The smac_hold_cnt field increases when softmac_hold_device() is
+ * called to force the dls_vlan_t of the device to be created. The
+ * device pre-detach fails if this counter is not 0.
+ */
+ uint32_t smac_hold_cnt;
+
+ /*
+ * The following fields are protected by smac_lock.
+ */
+ kmutex_t smac_mutex;
+ kcondvar_t smac_cv;
+ uint32_t smac_flags;
+ int smac_attacherr;
+ mac_handle_t smac_mh;
+ softmac_dev_t *smac_softmac[2];
+ taskqid_t smac_taskq;
+ /*
+ * Number of minor nodes whose post-attach routine has succeeded.
+ * This should be the same as the numbers of softmac_dev_t.
+ * Note that it does not imply SOFTMAC_ATTACH_DONE as the taskq might
+ * be still ongoing.
+ */
+ uint32_t smac_attachok_cnt;
+ /*
+ * Number of softmac_dev_t left when pre-detach fails. This is used
+ * to indicate whether postattach is called because of a failed
+ * pre-detach.
+ */
+ uint32_t smac_attached_left;
+
+ /*
+ * This field is set and cleared by users of softmac (who calls
+ * softmac_hold/rele_device()). It is protected by smac_mutex.
+ */
+ dev_info_t *smac_udip;
+
+ /*
+ * The remaining fields are used to register the MAC for a legacy
+ * device. They are set in softmac_mac_register() and do not change.
+ * One can access them when mac_register() is done without locks.
+ */
+
+ /*
+ * media type is needed for create <link name, linkid> mapping, so
+ * it is set for GLDv3 device as well
+ */
+ uint_t smac_media;
+ /* DLPI style of the underlying device */
+ int smac_style;
+ dev_t smac_dev;
+ size_t smac_saplen;
+ size_t smac_addrlen;
+ uchar_t smac_unicst_addr[MAXMACADDRLEN];
+ uint_t smac_min_sdu;
+ uint_t smac_max_sdu;
+ uint32_t smac_margin;
+
+ /* Notifications the underlying driver can support. */
+ uint32_t smac_notifications;
+
+ /*
+ * Capabilities of the underlying driver.
+ */
+ uint32_t smac_capab_flags;
+ uint32_t smac_hcksum_txflags;
+ boolean_t smac_no_capability_req;
+ dl_capab_mdt_t smac_mdt_capab;
+ boolean_t smac_mdt;
+
+ /*
+ * The following fields are protected by smac_lock
+ */
+ krwlock_t smac_lock;
+ enum softmac_state smac_state;
+ /* Lower stream structure */
+ softmac_lower_t *smac_lower;
+} softmac_t;
+
+typedef struct smac_ioc_start_s {
+ softmac_lower_t *si_slp;
+} smac_ioc_start_t;
+
+#define SMAC_IOC ('S' << 24 | 'M' << 16 | 'C' << 8)
+#define SMAC_IOC_START (SMAC_IOC | 0x01)
+
+#define SOFTMAC_BLANK_TICKS 128
+#define SOFTMAC_BLANK_PKT_COUNT 8
+
+extern dev_info_t *softmac_dip;
+#define SOFTMAC_DEV_NAME "softmac"
+
+extern int softmac_send_bind_req(softmac_lower_t *, uint_t);
+extern int softmac_send_notify_req(softmac_lower_t *, uint32_t);
+extern int softmac_send_promisc_req(softmac_lower_t *, t_uscalar_t,
+ boolean_t);
+extern void softmac_init(void);
+extern void softmac_fini(void);
+extern boolean_t softmac_busy(void);
+extern int softmac_fill_capab(ldi_handle_t, softmac_t *);
+extern int softmac_capab_enable(softmac_lower_t *);
+extern void softmac_rput_process_notdata(queue_t *, mblk_t *);
+extern void softmac_rput_process_data(softmac_lower_t *, mblk_t *);
+
+extern int softmac_m_promisc(void *, boolean_t);
+extern int softmac_m_multicst(void *, boolean_t, const uint8_t *);
+extern int softmac_m_unicst(void *, const uint8_t *);
+extern void softmac_m_ioctl(void *, queue_t *, mblk_t *);
+extern int softmac_m_stat(void *, uint_t, uint64_t *);
+extern mblk_t *softmac_m_tx(void *, mblk_t *);
+extern void softmac_m_resources(void *);
+extern int softmac_proto_tx(softmac_lower_t *, mblk_t *, mblk_t **);
+extern void softmac_ioctl_tx(softmac_lower_t *, mblk_t *, mblk_t **);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_SOFTMAC_IMPL_H */
diff --git a/usr/src/uts/common/sys/vnic.h b/usr/src/uts/common/sys/vnic.h
index 16cfbf85fc..58622037b3 100644
--- a/usr/src/uts/common/sys/vnic.h
+++ b/usr/src/uts/common/sys/vnic.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -54,9 +54,9 @@ typedef enum {
#define VNIC_IOC_CREATE VNIC_IOC(1)
typedef struct vnic_ioc_create {
- uint_t vc_vnic_id;
+ datalink_id_t vc_vnic_id;
+ datalink_id_t vc_link_id;
uint_t vc_mac_len;
- uchar_t vc_dev_name[MAXNAMELEN];
vnic_mac_addr_type_t vc_mac_addr_type;
uchar_t vc_mac_addr[MAXMACADDRLEN];
} vnic_ioc_create_t;
@@ -64,9 +64,9 @@ typedef struct vnic_ioc_create {
#ifdef _SYSCALL32
typedef struct vnic_ioc_create32 {
- uint32_t vc_vnic_id;
+ datalink_id_t vc_vnic_id;
+ datalink_id_t vc_link_id;
uint32_t vc_mac_len;
- uchar_t vc_dev_name[MAXNAMELEN];
vnic_mac_addr_type_t vc_mac_addr_type;
uchar_t vc_mac_addr[MAXMACADDRLEN];
} vnic_ioc_create32_t;
@@ -76,13 +76,13 @@ typedef struct vnic_ioc_create32 {
#define VNIC_IOC_DELETE VNIC_IOC(2)
typedef struct vnic_ioc_delete {
- uint_t vd_vnic_id;
+ datalink_id_t vd_vnic_id;
} vnic_ioc_delete_t;
#ifdef _SYSCALL32
typedef struct vnic_ioc_delete32 {
- uint32_t vd_vnic_id;
+ datalink_id_t vd_vnic_id;
} vnic_ioc_delete32_t;
#endif /* _SYSCALL32 */
@@ -90,25 +90,25 @@ typedef struct vnic_ioc_delete32 {
#define VNIC_IOC_INFO VNIC_IOC(3)
typedef struct vnic_ioc_info_vnic {
- uint32_t vn_vnic_id;
+ datalink_id_t vn_vnic_id;
+ datalink_id_t vn_link_id;
uint32_t vn_mac_len;
uchar_t vn_mac_addr[MAXMACADDRLEN];
- char vn_dev_name[MAXNAMELEN];
vnic_mac_addr_type_t vn_mac_addr_type;
} vnic_ioc_info_vnic_t;
typedef struct vnic_ioc_info {
uint_t vi_nvnics;
- uint_t vi_vnic_id; /* 0 returns all */
- char vi_dev_name[MAXNAMELEN];
+ datalink_id_t vi_vnic_id; /* DATALINK_ALL_LINKID returns all */
+ datalink_id_t vi_linkid;
} vnic_ioc_info_t;
#ifdef _SYSCALL32
typedef struct vnic_ioc_info32 {
uint32_t vi_nvnics;
- uint32_t vi_vnic_id; /* 0 returns all */
- char vi_dev_name[MAXNAMELEN];
+ datalink_id_t vi_vnic_id; /* DATALINK_ALL_LINKID returns all */
+ datalink_id_t vi_linkid;
} vnic_ioc_info32_t;
#endif /* _SYSCALL32 */
@@ -118,7 +118,7 @@ typedef struct vnic_ioc_info32 {
#define VNIC_IOC_MODIFY_ADDR 0x01
typedef struct vnic_ioc_modify {
- uint_t vm_vnic_id;
+ datalink_id_t vm_vnic_id;
uint_t vm_modify_mask;
uchar_t vm_mac_addr[MAXMACADDRLEN];
vnic_mac_addr_type_t vm_mac_addr_type;
@@ -128,7 +128,7 @@ typedef struct vnic_ioc_modify {
#ifdef _SYSCALL32
typedef struct vnic_ioc_modify32 {
- uint32_t vm_vnic_id;
+ datalink_id_t vm_vnic_id;
uint32_t vm_modify_mask;
uchar_t vm_mac_addr[MAXMACADDRLEN];
vnic_mac_addr_type_t vm_mac_addr_type;
diff --git a/usr/src/uts/common/sys/vnic_impl.h b/usr/src/uts/common/sys/vnic_impl.h
index 3cab13b96c..6cb64523a8 100644
--- a/usr/src/uts/common/sys/vnic_impl.h
+++ b/usr/src/uts/common/sys/vnic_impl.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -65,7 +65,7 @@ typedef struct vnic_flow_tab_s {
typedef struct vnic_mac_s {
mac_handle_t va_mh;
uint_t va_refs;
- char va_dev_name[MAXNAMELEN];
+ datalink_id_t va_linkid;
const mac_txinfo_t *va_txinfo;
struct vnic_bcast_grp_s *va_bcast_grp;
krwlock_t va_bcast_grp_lock;
@@ -81,7 +81,7 @@ typedef struct vnic_mac_s {
} vnic_mac_t;
typedef struct vnic_s {
- uint_t vn_id;
+ datalink_id_t vn_id;
uint32_t
vn_started : 1,
vn_promisc : 1,
@@ -96,6 +96,7 @@ typedef struct vnic_s {
vnic_mac_addr_type_t vn_addr_type;
mac_handle_t vn_mh;
+ uint32_t vn_margin;
vnic_mac_t *vn_vnic_mac;
vnic_flow_t *vn_flow_ent;
uint32_t vn_hcksum_txflags;
@@ -140,20 +141,20 @@ typedef struct vnic_s {
mutex_exit(&(flow)->vf_lock); \
}
-extern int vnic_dev_create(uint_t, char *, int, uchar_t *);
-extern int vnic_dev_modify(uint_t, uint_t, vnic_mac_addr_type_t,
+extern int vnic_dev_create(datalink_id_t, datalink_id_t, int, uchar_t *);
+extern int vnic_dev_modify(datalink_id_t, uint_t, vnic_mac_addr_type_t,
uint_t, uchar_t *);
-extern int vnic_dev_delete(uint_t);
+extern int vnic_dev_delete(datalink_id_t);
-typedef int (*vnic_info_new_vnic_fn_t)(void *, uint32_t, vnic_mac_addr_type_t,
- uint_t, uint8_t *, char *);
+typedef int (*vnic_info_new_vnic_fn_t)(void *, datalink_id_t,
+ vnic_mac_addr_type_t, uint_t, uint8_t *, datalink_id_t);
extern void vnic_dev_init(void);
extern void vnic_dev_fini(void);
extern uint_t vnic_dev_count(void);
extern dev_info_t *vnic_get_dip(void);
-extern int vnic_info(uint_t *, uint32_t, char *, void *,
+extern int vnic_info(uint_t *, datalink_id_t, datalink_id_t, void *,
vnic_info_new_vnic_fn_t);
extern void vnic_rx(void *, void *, mblk_t *);
diff --git a/usr/src/uts/common/sys/zone.h b/usr/src/uts/common/sys/zone.h
index 0a93e8651e..34cdf78a33 100644
--- a/usr/src/uts/common/sys/zone.h
+++ b/usr/src/uts/common/sys/zone.h
@@ -455,6 +455,7 @@ extern zone_t *zone_find_by_any_path(const char *, boolean_t);
extern zone_t *zone_find_by_path(const char *);
extern zoneid_t getzoneid(void);
extern zone_t *zone_find_by_id_nolock(zoneid_t);
+extern int zone_datalink_walk(zoneid_t, int (*)(const char *, void *), void *);
/*
* Zone-specific data (ZSD) APIs