vnic_impl.h revision d62bc4badc1c1f1549c961cfb8b420e650e1272b
/*
* 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_VNIC_IMPL_H
#define _SYS_VNIC_IMPL_H
#pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/vnic.h>
#include <sys/ksynch.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef void (*vnic_rx_fn_t)(void *, void *, mblk_t *);
typedef struct vnic_flow_fn_info_s {
vnic_rx_fn_t ff_fn;
void *ff_arg1;
void *ff_arg2;
} vnic_flow_fn_info_t;
typedef struct vnic_flow_s {
uchar_t vf_addr[MAXMACADDRLEN];
uint_t vf_addr_len;
vnic_flow_fn_info_t vf_fn_info;
void *vf_cookie;
struct vnic_flow_s *vf_next;
kmutex_t vf_lock;
kcondvar_t vf_cv;
uint32_t vf_refs;
boolean_t vf_clearing;
boolean_t vf_is_active;
} vnic_flow_t;
typedef struct vnic_flow_tab_s {
vnic_flow_t *vt_flow_list;
krwlock_t vt_lock;
uint_t vt_addr_len;
} vnic_flow_tab_t;
typedef struct vnic_mac_s {
mac_handle_t va_mh;
uint_t va_refs;
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;
size_t va_addr_len;
mac_notify_handle_t va_notify_hdl;
mac_rx_handle_t va_rx_hdl;
vnic_flow_t *va_active_flow;
vnic_flow_tab_t *va_flow_tab;
boolean_t va_mac_set;
struct vnic_s *va_promisc;
krwlock_t va_promisc_lock;
uint64_t va_promisc_gen;
} vnic_mac_t;
typedef struct vnic_s {
datalink_id_t vn_id;
uint32_t
vn_started : 1,
vn_promisc : 1,
vn_bcast_grp : 1,
vn_multi_mac : 1,
vn_promisc_mac : 1,
vn_pad_to_bit_31 : 27;
int vn_slot_id;
multiaddress_capab_t vn_mma_capab;
uint8_t vn_addr[ETHERADDRL];
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;
struct vnic_s *vn_promisc_next;
uint64_t vn_stat_multircv;
uint64_t vn_stat_brdcstrcv;
uint64_t vn_stat_multixmt;
uint64_t vn_stat_brdcstxmt;
uint64_t vn_stat_ierrors;
uint64_t vn_stat_oerrors;
uint64_t vn_stat_rbytes;
uint64_t vn_stat_ipackets;
uint64_t vn_stat_obytes;
uint64_t vn_stat_opackets;
} vnic_t;
#define vn_txinfo vn_vnic_mac->va_txinfo
#define vn_madd_naddr vn_mma_capab.maddr_naddr
#define vn_maddr_naddrfree vn_mma_capab.maddr_naddrfree
#define vn_maddr_flag vn_mma_capab.maddr_flag
#define vn_maddr_handle vn_mma_capab.maddr_handle
#define vn_maddr_reserve vn_mma_capab.maddr_reserve
#define vn_maddr_add vn_mma_capab.maddr_add
#define vn_maddr_remove vn_mma_capab.maddr_remove
#define vn_maddr_modify vn_mma_capab.maddr_modify
#define vn_maddr_get vn_mma_capab.maddr_get
#define VNIC_FLOW_REFHOLD(flow) { \
mutex_enter(&(flow)->vf_lock); \
(flow)->vf_refs++; \
mutex_exit(&(flow)->vf_lock); \
}
#define VNIC_FLOW_REFRELE(flow) { \
mutex_enter(&(flow)->vf_lock); \
if (--(flow)->vf_refs == 0 && (flow)->vf_clearing) { \
(flow)->vf_clearing = B_FALSE; \
cv_signal(&(flow)->vf_cv); \
} \
mutex_exit(&(flow)->vf_lock); \
}
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(datalink_id_t);
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 *, datalink_id_t, datalink_id_t, void *,
vnic_info_new_vnic_fn_t);
extern void vnic_rx(void *, void *, mblk_t *);
extern mblk_t *vnic_fix_cksum(mblk_t *);
extern mblk_t *vnic_copymsgchain_cksum(mblk_t *);
extern mblk_t *vnic_copymsg_cksum(mblk_t *);
extern void vnic_promisc_rx(vnic_mac_t *, vnic_t *, mblk_t *);
extern void vnic_bcast_init(void);
extern void vnic_bcast_fini(void);
extern int vnic_bcast_add(vnic_t *, const uint8_t *, mac_addrtype_t);
extern void vnic_bcast_delete(vnic_t *, const uint8_t *);
extern void vnic_bcast_send(void *, void *, mblk_t *);
extern void vnic_classifier_init(void);
extern void vnic_classifier_fini(void);
extern vnic_flow_t *vnic_classifier_flow_create(uint_t, uchar_t *, void *,
boolean_t, int);
extern void vnic_classifier_flow_destroy(vnic_flow_t *);
extern void vnic_classifier_flow_add(vnic_mac_t *, vnic_flow_t *, vnic_rx_fn_t,
void *, void *);
extern void vnic_classifier_flow_remove(vnic_mac_t *, vnic_flow_t *);
extern void vnic_classifier_flow_update_addr(vnic_flow_t *, uchar_t *);
extern void vnic_classifier_flow_update_fn(vnic_flow_t *, vnic_rx_fn_t,
void *, void *);
extern int vnic_classifier_flow_tab_init(vnic_mac_t *, uint_t, int);
extern void vnic_classifier_flow_tab_fini(vnic_mac_t *);
extern vnic_flow_t *vnic_classifier_get_flow(vnic_mac_t *, mblk_t *);
extern void *vnic_classifier_get_client_cookie(vnic_flow_t *);
extern vnic_flow_fn_info_t *vnic_classifier_get_fn_info(vnic_flow_t *);
extern boolean_t vnic_classifier_is_active(vnic_flow_t *);
#ifdef __cplusplus
}
#endif
#endif /* _SYS_VNIC_IMPL_H */