diff options
Diffstat (limited to 'usr/src/uts/common/sys')
-rw-r--r-- | usr/src/uts/common/sys/aggr.h | 45 | ||||
-rw-r--r-- | usr/src/uts/common/sys/aggr_impl.h | 42 | ||||
-rw-r--r-- | usr/src/uts/common/sys/dacf.h | 8 | ||||
-rw-r--r-- | usr/src/uts/common/sys/ddi_implfuncs.h | 3 | ||||
-rw-r--r-- | usr/src/uts/common/sys/dld.h | 127 | ||||
-rw-r--r-- | usr/src/uts/common/sys/dld_impl.h | 115 | ||||
-rw-r--r-- | usr/src/uts/common/sys/dlpi.h | 23 | ||||
-rw-r--r-- | usr/src/uts/common/sys/dls.h | 234 | ||||
-rw-r--r-- | usr/src/uts/common/sys/dls_impl.h | 101 | ||||
-rw-r--r-- | usr/src/uts/common/sys/dls_soft_ring.h | 4 | ||||
-rw-r--r-- | usr/src/uts/common/sys/fs/sdev_impl.h | 34 | ||||
-rw-r--r-- | usr/src/uts/common/sys/gld.h | 4 | ||||
-rw-r--r-- | usr/src/uts/common/sys/mac.h | 126 | ||||
-rw-r--r-- | usr/src/uts/common/sys/mac_impl.h | 58 | ||||
-rw-r--r-- | usr/src/uts/common/sys/param.h | 9 | ||||
-rw-r--r-- | usr/src/uts/common/sys/softmac.h | 50 | ||||
-rw-r--r-- | usr/src/uts/common/sys/softmac_impl.h | 234 | ||||
-rw-r--r-- | usr/src/uts/common/sys/vnic.h | 30 | ||||
-rw-r--r-- | usr/src/uts/common/sys/vnic_impl.h | 19 | ||||
-rw-r--r-- | usr/src/uts/common/sys/zone.h | 1 |
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 |