ipnet
struct ipnet;
typedef boolean_t ipnet_acceptfn_t(struct ipnet *, struct hook_pkt_observe_s *,
ipnet_get_addrtype(ipnet_t *ipnet, ipnet_addrp_t *addr)
ipnetif_t *ipnetif = ipnet->ipnet_if;
if (ipnet->ipnet_zoneid != GLOBAL_ZONEID &&
ipnet->ipnet_zoneid != ifaddr->ifa_zone)
ipnet_accept(ipnet_t *ipnet, hook_pkt_observe_t *hdr, ipnet_addrp_t *src,
uint64_t ifindex = ipnet->ipnet_if->if_index;
srctype = ipnet_get_addrtype(ipnet, src);
dsttype = ipnet_get_addrtype(ipnet, dst);
if (ipnet->ipnet_zoneid != GLOBAL_ZONEID &&
if (ipnet->ipnet_zoneid != ntohl(hdr->hpo_zsrc) &&
ipnet->ipnet_zoneid != ntohl(hdr->hpo_zdst))
if (!(ipnet->ipnet_flags & IPNET_PROMISC_SAP) &&
ipnet->ipnet_family != hdr->hpo_family)
if (ipnet->ipnet_flags & IPNET_PROMISC_PHYS) {
ipnet_loaccept(ipnet_t *ipnet, hook_pkt_observe_t *hdr, ipnet_addrp_t *src,
if (ipnet->ipnet_if == NULL)
if (ipnet->ipnet_zoneid != GLOBAL_ZONEID) {
if (ipnet->ipnet_zoneid != ntohl(hdr->hpo_zsrc) &&
ipnet->ipnet_zoneid != ntohl(hdr->hpo_zdst))
return (ipnet->ipnet_family == AF_UNSPEC ||
ipnet->ipnet_family == hdr->hpo_family);
ipnet_t *ipnet;
for (ipnet = list_head(list); ipnet != NULL;
ipnet = list_next(list, ipnet)) {
if (!(*ipnet->ipnet_acceptfn)(ipnet, hdr, &src, &dst)) {
if (list_next(list, ipnet) == NULL) {
if (ipnet->ipnet_flags & IPNET_INFO) {
if (ipnet->ipnet_rq->q_first == NULL &&
canputnext(ipnet->ipnet_rq)) {
putnext(ipnet->ipnet_rq, netmp);
} else if (canput(ipnet->ipnet_rq)) {
(void) putq(ipnet->ipnet_rq, netmp);
ipnet_t *ipnet;
for (ipnet = list_head(&ips->ips_str_list); ipnet != NULL;
ipnet = list_next(&ips->ips_str_list, ipnet)) {
if (ipnet->ipnet_if == ipnetif)
(void) putnextctl(ipnet->ipnet_rq, M_HANGUP);
ipnet_t *ipnet;
for (ipnet = list_head(strlist); ipnet != NULL;
ipnet = list_next(strlist, ipnet)) {
if (ipnet->ipnet_if != ipnetif)
if (!ipnetif_in_zone(ipnetif, ipnet->ipnet_zoneid, ips))
(void) putnextctl(ipnet->ipnet_rq, M_HANGUP);
ipnet_t *ipnet;
ipnet = kmem_zalloc(sizeof (*ipnet), KM_SLEEP);
ipnet->ipnet_if = ifp;
ipnet->ipnet_ns = ns;
ipnet->ipnet_flags = flags;
ipnet->ipnet_acceptfn = ipnet_loaccept;
ipnet->ipnet_acceptfn = ipnet_accept;
HOOK_INIT(ipnet->ipnet_hook, ipnet_bpf_bounce, "", ipnet);
(void *)ipnet->ipnet_hook);
ipnet->ipnet_hook->h_name = strdup(name);
ipnet->ipnet_data = data;
ipnet->ipnet_zoneid = ifp->if_zoneid;
ipnet->ipnet_hook);
ipnet->ipnet_hook);
NH_OBSERVE, ipnet->ipnet_hook);
*mhandle = (uintptr_t)ipnet;
strfree(ipnet->ipnet_hook->h_name);
hook_free(ipnet->ipnet_hook);
ipnet_t *ipnet;
ipnet = data;
ipst = ipnet->ipnet_ns->netstack_ip;
hook = ipnet->ipnet_hook;
kmem_free(ipnet, sizeof (*ipnet));
ipnet_t *ipnet;
ipnet = (ipnet_t *)arg;
if (!(*ipnet->ipnet_acceptfn)(ipnet, hdr, &src, &dst)) {
ipnet_itap(ipnet->ipnet_data, mp,
ipnet_t *ipnet;
if ((ipnet = kmem_zalloc(sizeof (*ipnet), KM_NOSLEEP)) == NULL)
rq->q_ptr = WR(rq)->q_ptr = ipnet;
ipnet->ipnet_rq = rq;
ipnet->ipnet_minor = (minor_t)id_alloc(ipnet_minor_space);
ipnet->ipnet_zoneid = zoneid;
ipnet->ipnet_dlstate = DL_UNBOUND;
ipnet->ipnet_ns = ns;
ipnet->ipnet_flags |= IPNET_LOMODE;
ipnet->ipnet_acceptfn = ipnet_loaccept;
ipnet->ipnet_acceptfn = ipnet_accept;
ipnet->ipnet_if = ipnetif_getby_dev(*dev, ips);
if (ipnet->ipnet_if == NULL ||
!ipnetif_in_zone(ipnet->ipnet_if, zoneid, ips)) {
list_insert_head(&ips->ips_str_list, ipnet);
*dev = makedevice(getmajor(*dev), ipnet->ipnet_minor);
id_free(ipnet_minor_space, ipnet->ipnet_minor);
if (ipnet->ipnet_if != NULL)
ipnetif_refrele(ipnet->ipnet_if);
kmem_free(ipnet, sizeof (*ipnet));
ipnet_t *ipnet = rq->q_ptr;
ipnet_stack_t *ips = ipnet->ipnet_ns->netstack_ipnet;
if (ipnet->ipnet_flags & IPNET_PROMISC_PHYS)
ipnet_leave_allmulti(ipnet->ipnet_if, ips);
if (ipnet->ipnet_flags & IPNET_PROMISC_MULTI)
ipnet_leave_allmulti(ipnet->ipnet_if, ips);
list_remove(&ips->ips_str_list, ipnet);
if (ipnet->ipnet_if != NULL)
ipnetif_refrele(ipnet->ipnet_if);
id_free(ipnet_minor_space, ipnet->ipnet_minor);
kmem_free(ipnet, sizeof (*ipnet));
ipnet_t *ipnet = q->q_ptr;
ipnet->ipnet_flags |= IPNET_INFO;
ipnet->ipnet_flags &= ~IPNET_INFO;
ipnet_t *ipnet = q->q_ptr;
ipnet->ipnet_family = AF_UNSPEC;
ipnet->ipnet_family = AF_INET;
ipnet->ipnet_family = AF_INET6;
ipnet->ipnet_dlstate = DL_IDLE;
ipnet_t *ipnet = q->q_ptr;
if (ipnet->ipnet_dlstate != DL_IDLE) {
ipnet->ipnet_dlstate = DL_UNBOUND;
ipnet->ipnet_family = AF_UNSPEC;
ipnet_t *ipnet = q->q_ptr;
if (ipnet->ipnet_flags & IPNET_LOMODE) {
if ((err = ipnet_join_allmulti(ipnet->ipnet_if,
ipnet->ipnet_ns->netstack_ipnet)) != 0) {
ipnet->ipnet_flags |= IPNET_PROMISC_PHYS;
ipnet->ipnet_flags |= IPNET_PROMISC_SAP;
ipnet->ipnet_flags |= IPNET_PROMISC_MULTI;
ipnet_t *ipnet = q->q_ptr;
uint16_t orig_ipnet_flags = ipnet->ipnet_flags;
if (ipnet->ipnet_flags & IPNET_LOMODE) {
if (ipnet->ipnet_flags & IPNET_PROMISC_PHYS)
ipnet->ipnet_flags &= ~IPNET_PROMISC_PHYS;
if (ipnet->ipnet_flags & IPNET_PROMISC_SAP)
ipnet->ipnet_flags &= ~IPNET_PROMISC_SAP;
if (ipnet->ipnet_flags & IPNET_PROMISC_MULTI)
ipnet->ipnet_flags &= ~IPNET_PROMISC_MULTI;
if (orig_ipnet_flags == ipnet->ipnet_flags) {
ipnet_leave_allmulti(ipnet->ipnet_if,
ipnet->ipnet_ns->netstack_ipnet);