Lines Matching defs:ipnet

28  * The ipnet device defined here provides access to packets at the IP layer. To
35 * Management of the devices in /dev/ipnet/ is handled by the devname
38 * taken down etc. the ipnet module is notified and its view of the interfaces
69 #include <inet/ipnet.h>
76 "ipnet", /* mi_idname */
201 "STREAMS ipnet driver",
266 if ((ipnet_major = ddi_name_to_major("ipnet")) == (major_t)-1)
277 ipnet_taskq = ddi_taskq_create(NULL, "ipnet", 1, TASKQ_DEFAULTPRI, 0);
365 ips->ips_kstatp = net_kstat_create(netid, "ipnet", 0, "ipnet_stats",
377 "ipnet", "ipnet_stats", "misc");
384 * for IPv6, although there is only one ipnet interface for both IPv4
507 ipnet_t *ipnet;
528 if ((ipnet = kmem_zalloc(sizeof (*ipnet), KM_NOSLEEP)) == NULL)
534 rq->q_ptr = WR(rq)->q_ptr = ipnet;
535 ipnet->ipnet_rq = rq;
536 ipnet->ipnet_minor = (minor_t)id_alloc(ipnet_minor_space);
537 ipnet->ipnet_zoneid = zoneid;
538 ipnet->ipnet_dlstate = DL_UNBOUND;
539 ipnet->ipnet_ns = ns;
548 ipnet->ipnet_flags |= IPNET_LOMODE;
549 ipnet->ipnet_acceptfn = ipnet_loaccept;
551 ipnet->ipnet_acceptfn = ipnet_accept;
552 ipnet->ipnet_if = ipnetif_getby_dev(*dev, ips);
553 if (ipnet->ipnet_if == NULL ||
554 !ipnetif_in_zone(ipnet->ipnet_if, zoneid, ips)) {
563 list_insert_head(&ips->ips_str_list, ipnet);
564 *dev = makedevice(getmajor(*dev), ipnet->ipnet_minor);
579 id_free(ipnet_minor_space, ipnet->ipnet_minor);
580 if (ipnet->ipnet_if != NULL)
581 ipnetif_refrele(ipnet->ipnet_if);
582 kmem_free(ipnet, sizeof (*ipnet));
590 ipnet_t *ipnet = rq->q_ptr;
591 ipnet_stack_t *ips = ipnet->ipnet_ns->netstack_ipnet;
593 if (ipnet->ipnet_flags & IPNET_PROMISC_PHYS)
594 ipnet_leave_allmulti(ipnet->ipnet_if, ips);
595 if (ipnet->ipnet_flags & IPNET_PROMISC_MULTI)
596 ipnet_leave_allmulti(ipnet->ipnet_if, ips);
604 list_remove(&ips->ips_str_list, ipnet);
605 if (ipnet->ipnet_if != NULL)
606 ipnetif_refrele(ipnet->ipnet_if);
607 id_free(ipnet_minor_space, ipnet->ipnet_minor);
614 kmem_free(ipnet, sizeof (*ipnet));
695 ipnet_t *ipnet = q->q_ptr;
700 ipnet->ipnet_flags |= IPNET_INFO;
702 ipnet->ipnet_flags &= ~IPNET_INFO;
774 ipnet_t *ipnet = q->q_ptr;
783 ipnet->ipnet_family = AF_UNSPEC;
786 ipnet->ipnet_family = AF_INET;
789 ipnet->ipnet_family = AF_INET6;
797 ipnet->ipnet_dlstate = DL_IDLE;
804 ipnet_t *ipnet = q->q_ptr;
811 if (ipnet->ipnet_dlstate != DL_IDLE) {
814 ipnet->ipnet_dlstate = DL_UNBOUND;
815 ipnet->ipnet_family = AF_UNSPEC;
823 ipnet_t *ipnet = q->q_ptr;
832 if (ipnet->ipnet_flags & IPNET_LOMODE) {
839 if ((err = ipnet_join_allmulti(ipnet->ipnet_if,
840 ipnet->ipnet_ns->netstack_ipnet)) != 0) {
848 ipnet->ipnet_flags |= IPNET_PROMISC_PHYS;
851 ipnet->ipnet_flags |= IPNET_PROMISC_SAP;
854 ipnet->ipnet_flags |= IPNET_PROMISC_MULTI;
867 ipnet_t *ipnet = q->q_ptr;
869 uint16_t orig_ipnet_flags = ipnet->ipnet_flags;
876 if (ipnet->ipnet_flags & IPNET_LOMODE) {
884 if (ipnet->ipnet_flags & IPNET_PROMISC_PHYS)
885 ipnet->ipnet_flags &= ~IPNET_PROMISC_PHYS;
888 if (ipnet->ipnet_flags & IPNET_PROMISC_SAP)
889 ipnet->ipnet_flags &= ~IPNET_PROMISC_SAP;
892 if (ipnet->ipnet_flags & IPNET_PROMISC_MULTI)
893 ipnet->ipnet_flags &= ~IPNET_PROMISC_MULTI;
900 if (orig_ipnet_flags == ipnet->ipnet_flags) {
906 ipnet_leave_allmulti(ipnet->ipnet_if,
907 ipnet->ipnet_ns->netstack_ipnet);
1004 ipnet_get_addrtype(ipnet_t *ipnet, ipnet_addrp_t *addr)
1007 ipnetif_t *ipnetif = ipnet->ipnet_if;
1038 if (ipnet->ipnet_zoneid != GLOBAL_ZONEID &&
1039 ipnet->ipnet_zoneid != ifaddr->ifa_zone)
1064 * ipnet client stream.
1067 ipnet_accept(ipnet_t *ipnet, hook_pkt_observe_t *hdr, ipnet_addrp_t *src,
1071 uint64_t ifindex = ipnet->ipnet_if->if_index;
1075 srctype = ipnet_get_addrtype(ipnet, src);
1076 dsttype = ipnet_get_addrtype(ipnet, dst);
1092 * Do not allow an ipnet stream to see packets that are not from or to
1098 if (ipnet->ipnet_zoneid != GLOBAL_ZONEID &&
1100 if (ipnet->ipnet_zoneid != ntohl(hdr->hpo_zsrc) &&
1101 ipnet->ipnet_zoneid != ntohl(hdr->hpo_zdst))
1109 if (!(ipnet->ipnet_flags & IPNET_PROMISC_SAP) &&
1110 ipnet->ipnet_family != hdr->hpo_family)
1122 if (ipnet->ipnet_flags & IPNET_PROMISC_PHYS) {
1138 * Verify if the packet contained in hdr should be passed up to the ipnet
1143 ipnet_loaccept(ipnet_t *ipnet, hook_pkt_observe_t *hdr, ipnet_addrp_t *src,
1150 if (ipnet->ipnet_if == NULL)
1155 * An ipnet stream must not see packets that are not from/to its zone.
1157 if (ipnet->ipnet_zoneid != GLOBAL_ZONEID) {
1158 if (ipnet->ipnet_zoneid != ntohl(hdr->hpo_zsrc) &&
1159 ipnet->ipnet_zoneid != ntohl(hdr->hpo_zdst))
1163 return (ipnet->ipnet_family == AF_UNSPEC ||
1164 ipnet->ipnet_family == hdr->hpo_family);
1172 ipnet_t *ipnet;
1196 for (ipnet = list_head(list); ipnet != NULL;
1197 ipnet = list_next(list, ipnet)) {
1198 if (!(*ipnet->ipnet_acceptfn)(ipnet, hdr, &src, &dst)) {
1204 if (list_next(list, ipnet) == NULL) {
1215 if (ipnet->ipnet_flags & IPNET_INFO) {
1222 if (ipnet->ipnet_rq->q_first == NULL &&
1223 canputnext(ipnet->ipnet_rq)) {
1224 putnext(ipnet->ipnet_rq, netmp);
1226 } else if (canput(ipnet->ipnet_rq)) {
1227 (void) putq(ipnet->ipnet_rq, netmp);
1324 ipnet_t *ipnet;
1328 for (ipnet = list_head(&ips->ips_str_list); ipnet != NULL;
1329 ipnet = list_next(&ips->ips_str_list, ipnet)) {
1330 if (ipnet->ipnet_if == ipnetif)
1331 (void) putnextctl(ipnet->ipnet_rq, M_HANGUP);
1806 ipnet_t *ipnet;
1809 for (ipnet = list_head(strlist); ipnet != NULL;
1810 ipnet = list_next(strlist, ipnet)) {
1811 if (ipnet->ipnet_if != ipnetif)
1813 if (!ipnetif_in_zone(ipnetif, ipnet->ipnet_zoneid, ips))
1814 (void) putnextctl(ipnet->ipnet_rq, M_HANGUP);
1830 * in /dev/ipnet.
2039 * The list of interfaces available via ipnet is private for each zone,
2095 * working with the ipnet interfaces and hence the ips_event_lock is held.
2097 * in ipnet, and thus ipnet holds the ips_event_lock. Thus the datalink id
2135 * Strictly speaking, there is no such thing as a "client" in ipnet, like
2161 * from ipnet.
2180 ipnet_t *ipnet;
2195 ipnet = kmem_zalloc(sizeof (*ipnet), KM_SLEEP);
2196 ipnet->ipnet_if = ifp;
2197 ipnet->ipnet_ns = ns;
2198 ipnet->ipnet_flags = flags;
2201 ipnet->ipnet_acceptfn = ipnet_loaccept;
2203 ipnet->ipnet_acceptfn = ipnet_accept;
2210 HOOK_INIT(ipnet->ipnet_hook, ipnet_bpf_bounce, "", ipnet);
2212 (void *)ipnet->ipnet_hook);
2213 ipnet->ipnet_hook->h_name = strdup(name);
2214 ipnet->ipnet_data = data;
2215 ipnet->ipnet_zoneid = ifp->if_zoneid;
2220 ipnet->ipnet_hook);
2225 ipnet->ipnet_hook);
2228 NH_OBSERVE, ipnet->ipnet_hook);
2232 *mhandle = (uintptr_t)ipnet;
2238 strfree(ipnet->ipnet_hook->h_name);
2239 hook_free(ipnet->ipnet_hook);
2249 ipnet_t *ipnet;
2252 ipnet = data;
2253 ipst = ipnet->ipnet_ns->netstack_ip;
2254 hook = ipnet->ipnet_hook;
2266 ipnet_leave_allmulti(ipnet->ipnet_if, ipnet->ipnet_ns->netstack_ipnet);
2268 netstack_rele(ipnet->ipnet_ns);
2270 kmem_free(ipnet, sizeof (*ipnet));
2290 ipnet_t *ipnet;
2296 ipnet = (ipnet_t *)arg;
2311 if (!(*ipnet->ipnet_acceptfn)(ipnet, hdr, &src, &dst)) {
2317 ipnet_itap(ipnet->ipnet_data, mp,
2331 * shared instance zones, this means the ipnet driver needs to detect