summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/netstack.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/sys/netstack.h')
-rw-r--r--usr/src/uts/common/sys/netstack.h239
1 files changed, 239 insertions, 0 deletions
diff --git a/usr/src/uts/common/sys/netstack.h b/usr/src/uts/common/sys/netstack.h
new file mode 100644
index 0000000000..07ad7b5c30
--- /dev/null
+++ b/usr/src/uts/common/sys/netstack.h
@@ -0,0 +1,239 @@
+/*
+ * 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 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+#ifndef _SYS_NETSTACK_H
+#define _SYS_NETSTACK_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/kstat.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This allows various pieces in and around IP to have a separate instance
+ * for each instance of IP. This is used to support zones that have an
+ * exclusive stack.
+ * Pieces of software far removed from IP (e.g., kernel software
+ * sitting on top of TCP or UDP) probably should not use the netstack
+ * support; if such software wants to support separate zones it
+ * can do that using the zones framework (zone_key_create() etc)
+ * whether there is a shared IP stack or and exclusive IP stack underneath.
+ */
+
+/*
+ * Each netstack has an identifier. We reuse the zoneid allocation for
+ * this but have a separate typedef. Thus the shared stack (used by
+ * the global zone and other shared stack zones) have a zero ID, and
+ * the exclusive stacks have a netstackid that is the same as their zoneid.
+ */
+typedef id_t netstackid_t;
+
+#define GLOBAL_NETSTACKID 0
+
+/*
+ * One for each module which uses netstack support.
+ * Used in netstack_register().
+ *
+ * The order of these is important for some modules both for
+ * the creation (which done in ascending order) and destruction (which is
+ * done ine in decending order).
+ */
+#define NS_HOOK 0
+#define NS_NETI 1
+#define NS_ARP 2
+#define NS_IP 3
+#define NS_ICMP 4
+#define NS_UDP 5
+#define NS_TCP 6
+#define NS_SCTP 7
+#define NS_RTS 8
+#define NS_IPSEC 9
+#define NS_KEYSOCK 10
+#define NS_SPDSOCK 11
+#define NS_IPSECAH 12
+#define NS_IPSECESP 13
+#define NS_TUN 14
+#define NS_IPF 15
+#define NS_STR 16 /* autopush list etc */
+#define NS_MAX (NS_STR+1)
+
+/*
+ * One for every netstack in the system.
+ * We use a union so that the compilar and lint can provide type checking -
+ * in principle we could have
+ * #define netstack_arp netstack_modules[NS_ARP]
+ * etc, but that would imply void * types hence no type checking by the
+ * compiler.
+ *
+ * All the fields in netstack_t except netstack_next are protected by
+ * netstack_lock. netstack_next is protected by netstack_g_lock.
+ */
+struct netstack {
+ union {
+ void *nu_modules[NS_MAX];
+ struct {
+ struct hook_stack *nu_hook;
+ struct neti_stack *nu_neti;
+ struct arp_stack *nu_arp;
+ struct ip_stack *nu_ip;
+ struct icmp_stack *nu_icmp;
+ struct udp_stack *nu_udp;
+ struct tcp_stack *nu_tcp;
+ struct sctp_stack *nu_sctp;
+ struct rts_stack *nu_rts;
+ struct ipsec_stack *nu_ipsec;
+ struct keysock_stack *nu_keysock;
+ struct spd_stack *nu_spdsock;
+ struct ipsecah_stack *nu_ipsecah;
+ struct ipsecesp_stack *nu_ipsecesp;
+ struct tun_stack *nu_tun;
+ struct ipf_stack *nu_ipf;
+ struct str_stack *nu_str;
+ } nu_s;
+ } netstack_u;
+#define netstack_modules netstack_u.nu_modules
+#define netstack_hook netstack_u.nu_s.nu_hook
+#define netstack_neti netstack_u.nu_s.nu_neti
+#define netstack_arp netstack_u.nu_s.nu_arp
+#define netstack_ip netstack_u.nu_s.nu_ip
+#define netstack_icmp netstack_u.nu_s.nu_icmp
+#define netstack_udp netstack_u.nu_s.nu_udp
+#define netstack_tcp netstack_u.nu_s.nu_tcp
+#define netstack_sctp netstack_u.nu_s.nu_sctp
+#define netstack_rts netstack_u.nu_s.nu_rts
+#define netstack_ipsec netstack_u.nu_s.nu_ipsec
+#define netstack_keysock netstack_u.nu_s.nu_keysock
+#define netstack_spdsock netstack_u.nu_s.nu_spdsock
+#define netstack_ipsecah netstack_u.nu_s.nu_ipsecah
+#define netstack_ipsecesp netstack_u.nu_s.nu_ipsecesp
+#define netstack_tun netstack_u.nu_s.nu_tun
+#define netstack_ipf netstack_u.nu_s.nu_ipf
+#define netstack_str netstack_u.nu_s.nu_str
+
+ uint16_t netstack_m_state[NS_MAX]; /* module state */
+
+ kmutex_t netstack_lock;
+ struct netstack *netstack_next;
+ netstackid_t netstack_stackid;
+ int netstack_numzones; /* Number of zones using this */
+ int netstack_refcnt; /* Number of hold-rele */
+ int netstack_flags; /* See below */
+};
+typedef struct netstack netstack_t;
+
+/* netstack_flags values */
+#define NSF_UNINIT 0x01 /* Not initialized */
+#define NSF_CLOSING 0x02 /* Going away */
+
+/*
+ * State for each module for each stack - netstack_m_state[moduleid]
+ * Keeps track of pending actions to avoid holding looks when
+ * calling into the create/shutdown/destroy functions in the module.
+ */
+#define NSS_CREATE_NEEDED 0x0001
+#define NSS_CREATE_INPROGRESS 0x0002
+#define NSS_CREATE_COMPLETED 0x0004
+#define NSS_SHUTDOWN_NEEDED 0x0010
+#define NSS_SHUTDOWN_INPROGRESS 0x0020
+#define NSS_SHUTDOWN_COMPLETED 0x0040
+#define NSS_DESTROY_NEEDED 0x0100
+#define NSS_DESTROY_INPROGRESS 0x0200
+#define NSS_DESTROY_COMPLETED 0x0400
+
+#define NSS_CREATE_ALL \
+ (NSS_CREATE_NEEDED|NSS_CREATE_INPROGRESS|NSS_CREATE_COMPLETED)
+#define NSS_SHUTDOWN_ALL \
+ (NSS_SHUTDOWN_NEEDED|NSS_SHUTDOWN_INPROGRESS|NSS_SHUTDOWN_COMPLETED)
+#define NSS_DESTROY_ALL \
+ (NSS_DESTROY_NEEDED|NSS_DESTROY_INPROGRESS|NSS_DESTROY_COMPLETED)
+
+/*
+ * One for each of the NS_* values.
+ */
+struct netstack_registry {
+ int nr_flags; /* 0 if nothing registered */
+ void *(*nr_create)(netstackid_t, netstack_t *);
+ void (*nr_shutdown)(netstackid_t, void *);
+ void (*nr_destroy)(netstackid_t, void *);
+};
+
+/* nr_flags values */
+#define NRF_REGISTERED 0x01
+
+/*
+ * To support kstat_create_netstack() using kstat_add_zone we need
+ * to track both
+ * - all zoneids that use the global/shared stack
+ * - all kstats that have been added for the shared stack
+ */
+
+extern void netstack_init(void);
+extern void netstack_hold(netstack_t *);
+extern void netstack_rele(netstack_t *);
+extern netstack_t *netstack_find_by_cred(const cred_t *);
+extern netstack_t *netstack_find_by_stackid(netstackid_t);
+extern netstack_t *netstack_find_by_zoneid(zoneid_t);
+
+extern zoneid_t netstackid_to_zoneid(netstackid_t);
+extern netstackid_t zoneid_to_netstackid(zoneid_t);
+
+/*
+ * Register interest in changes to the set of netstacks.
+ * The createfn and destroyfn are required, but the shutdownfn can be
+ * NULL.
+ * Note that due to the current zsd implementation, when the create
+ * function is called the zone isn't fully present, thus functions
+ * like zone_find_by_* will fail, hence the create function can not
+ * use many zones kernel functions including zcmn_err().
+ */
+extern void netstack_register(int,
+ void *(*)(netstackid_t, netstack_t *),
+ void (*)(netstackid_t, void *),
+ void (*)(netstackid_t, void *));
+extern void netstack_unregister(int);
+extern kstat_t *kstat_create_netstack(char *, int, char *, char *, uchar_t,
+ uint_t, uchar_t, netstackid_t);
+extern void kstat_delete_netstack(kstat_t *, netstackid_t);
+
+/*
+ * Simple support for walking all the netstacks.
+ * The caller of netstack_next() needs to call netstack_rele() when
+ * done with a netstack.
+ */
+typedef int netstack_handle_t;
+
+extern void netstack_next_init(netstack_handle_t *);
+extern void netstack_next_fini(netstack_handle_t *);
+extern netstack_t *netstack_next(netstack_handle_t *);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _SYS_NETSTACK_H */