OpenSolaris_b135/uts/common/io/trill_impl.h

/*
 * 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 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _TRILL_IMPL_H
#define	_TRILL_IMPL_H

#ifdef __cplusplus
extern "C" {
#endif

#include <sys/list.h>
#include <net/trill.h>
#include <sys/mac.h>
#include <sys/kstat.h>
#include <sys/rwlock.h>
#include <net/bridge_impl.h>
#include <net/if_dl.h>

#define	TRILL_KSSOCK_NAMES "recv", "sent", "drops", "encap", "decap", "forward"

/* kstats per TRILL socket */
typedef struct trill_kssock_s {
	kstat_named_t	tks_recv;	/* packets received */
	kstat_named_t	tks_sent;	/* packets sent through */
	kstat_named_t	tks_drops;	/* packets dropped */
	kstat_named_t   tks_encap;	/* packets encapsulated */
	kstat_named_t   tks_decap;	/* packets decapsulated */
	kstat_named_t	tks_forward;	/* packets forwarded */
} trill_kssock_t;

#define	KSPINCR(stat) ++(tsock->ts_kstats.stat.value.ui64)

#define	TRILL_NO_TCI	0	/* No VLAN tag */
#define	TRILL_VLANS_ARRSIZE ((1<<12)/NBBY)
#define	TRILL_VLANBIT(v) ((v) % NBBY)
#define	TRILL_VLANBYTE(v) ((v)/NBBY)
#define	TRILL_VLANISSET(l, v) ((l)[TRILL_VLANBYTE(v)] & (1<<TRILL_VLANBIT(v)))

struct trill_node_s;

/*
 * TRILL instance structure, one for each TRILL instance running in
 * support of a bridge instance. Members ti_bridgename and ti_binst
 * refer to the specific bridge instance. The bridge instance in
 * question must be online before we can support and rely on it.
 * We rely on the bridge instance for TRILL sockets to transmit and
 * receive TRILL packets. Each TRILL instance holds the TRILL
 * forwarding and nick database in ti_nodes. trill_inst_rwlock
 * protects changes to the TRILL instances list. Within each TRILL
 * instance the ti_rwlock protects changes to the structure. A refcount
 * (ti_refs) helps in destroying the TRILL instance when all TRILL
 * sockets part of the instance are shutdown.
 */
typedef struct trill_s {
	list_node_t		ti_instnode;
	uint16_t		ti_nick; /* our nickname */
	uint16_t		ti_treeroot; /* tree root nickname */
	struct trill_node_s	*ti_nodes[RBRIDGE_NICKNAME_MAX];
	uint_t			ti_nodecount;
	list_t			ti_socklist;
	char			ti_bridgename[MAXLINKNAMELEN];
	krwlock_t		ti_rwlock;
	uint_t			ti_refs;
	bridge_inst_t		*ti_binst;
} trill_inst_t;

/*
 * TRILL socket structure. IS-IS daemon opens a TRILL socket for
 * each broadcast link the TRILL IS-IS protocol instance is
 * running on. TRILL specific link properties, state and stats
 * are stored as well. ts_vlanfwder indicates whether the RBridges
 * is the designated forwarder on the link for a particular VLAN.
 * A refcount (ts_refs) ensures the last consumer (TRILL module
 * or the IS-IS daemon) destroys the socket.
 */
typedef struct trillsocket_s {
	list_node_t		ts_socklistnode;
	uint8_t			ts_state;
	bridge_link_t		*ts_link;
	struct sockaddr_dl	ts_lladdr;
	uint16_t		ts_desigvlan;
	kstat_t			*ts_ksp;
	trill_kssock_t		ts_kstats;
	trill_inst_t		*ts_tip;
	uint_t			ts_refs;
	uint_t			ts_flags;
	sock_upcalls_t		*ts_conn_upcalls;	/* Upcalls to sockfs */
	sock_upper_handle_t	ts_conn_upper_handle;	/* sonode */
	boolean_t		ts_flow_ctrld;
	kmutex_t		ts_socklock;
	uint_t			ts_sockthreadcount;
	kcondvar_t		ts_sockthreadwait;
	kcondvar_t		ts_sockclosewait;
} trill_sock_t;

/*
 * TRILL socket flags (ts_flags). TSF_SHUTDOWN indicates the TRILL socket
 * owner (IS-IS daemon process) had done a close on the socket and other
 * consumers (TRILL threads) should not pass any packets downstream.
 * TSF_CLOSEWAIT indicates socket close is in progress.
 */
#define	TSF_SHUTDOWN	0x0001
#define	TSF_CLOSEWAIT	0x0002

/*
 * TRILL node information structure. Holds information to reach the
 * TRILL node and other RBridge information specified in trill_nick_info_t
 */
typedef struct trill_node_s {
	trill_sock_t		*tn_tsp;
	trill_nickinfo_t	*tn_ni;
	uint_t			tn_refs;
} trill_node_t;

/* Limit to alloc max 1MB per trill_nickinfo_t received from user daemon */
#define	TNI_MAXSIZE	(1<<30)

#ifdef __cplusplus
}
#endif

#endif /* _TRILL_IMPL_H */