Lines Matching defs:iptun

26  * iptun - IP Tunneling Driver
80 #include <inet/iptun.h>
116 * Table containing per-iptun-type information.
184 iptun_t *iptun = arg;
189 *val = iptun->iptun_ierrors;
192 *val = iptun->iptun_oerrors;
195 *val = iptun->iptun_rbytes;
198 *val = iptun->iptun_ipackets;
201 *val = iptun->iptun_obytes;
204 *val = iptun->iptun_opackets;
207 *val = iptun->iptun_norcvbuf;
210 *val = iptun->iptun_noxmtbuf;
222 iptun_t *iptun = arg;
225 if ((err = iptun_enter(iptun)) == 0) {
226 iptun->iptun_flags |= IPTUN_MAC_STARTED;
227 iptun_task_dispatch(iptun, IPTUN_TASK_LINK_UPDATE);
228 iptun_exit(iptun);
236 iptun_t *iptun = arg;
238 if (iptun_enter(iptun) == 0) {
239 iptun->iptun_flags &= ~IPTUN_MAC_STARTED;
240 iptun_task_dispatch(iptun, IPTUN_TASK_LINK_UPDATE);
241 iptun_exit(iptun);
271 iptun_t *iptun = arg;
277 if ((err = iptun_enter(iptun)) == 0) {
278 switch (iptun->iptun_typeinfo->iti_ipvers) {
292 err = iptun_setladdr(iptun, &ss);
293 iptun_exit(iptun);
302 iptun_t *iptun = arg;
304 if (!IS_IPTUN_RUNNING(iptun)) {
305 iptun_drop_pkt(mpchain, &iptun->iptun_noxmtbuf);
312 iptun_output(iptun, mp);
323 iptun_t *iptun = barg;
331 if ((err = iptun_enter(iptun)) != 0)
340 if (value != iptun->iptun_hoplimit) {
341 iptun->iptun_hoplimit = (uint8_t)value;
342 iptun_headergen(iptun, B_TRUE);
346 if (iptun->iptun_typeinfo->iti_type != IPTUN_TYPE_IPV6 ||
351 if (value != iptun->iptun_encaplimit) {
352 iptun->iptun_encaplimit = (uint8_t)value;
353 iptun_headergen(iptun, B_TRUE);
357 uint32_t maxmtu = iptun_get_maxmtu(iptun, NULL, 0);
359 if (value < iptun->iptun_typeinfo->iti_minmtu ||
364 iptun->iptun_flags |= IPTUN_FIXED_MTU;
365 if (value != iptun->iptun_mtu) {
366 iptun->iptun_mtu = value;
367 iptun_task_dispatch(iptun, IPTUN_TASK_MTU_UPDATE);
374 iptun_exit(iptun);
383 iptun_t *iptun = barg;
386 if ((err = iptun_enter(iptun)) != 0)
392 *(uint32_t *)pr_val = iptun->iptun_hoplimit;
396 *(uint32_t *)pr_val = iptun->iptun_encaplimit;
402 iptun_exit(iptun);
411 iptun_t *iptun = barg;
421 if (iptun->iptun_typeinfo->iti_type != IPTUN_TYPE_IPV6)
429 iptun->iptun_typeinfo->iti_minmtu,
430 iptun_get_maxmtu(iptun, NULL, 0));
447 iptun_enter(iptun_t *iptun)
449 mutex_enter(&iptun->iptun_lock);
450 while (iptun->iptun_flags & IPTUN_DELETE_PENDING)
451 cv_wait(&iptun->iptun_enter_cv, &iptun->iptun_lock);
452 if (iptun->iptun_flags & IPTUN_CONDEMNED) {
453 mutex_exit(&iptun->iptun_lock);
463 iptun_exit(iptun_t *iptun)
465 mutex_exit(&iptun->iptun_lock);
472 iptun_enter_by_linkid(datalink_id_t linkid, iptun_t **iptun)
478 (mod_hash_val_t *)iptun) == 0)
479 err = iptun_enter(*iptun);
483 *iptun = NULL;
496 * while iptun callbacks (such as iptun_m_setprop()) called from the mac
511 * iptun_delete(). We can thus still safely use iptun->iptun_mh after having
520 iptun_t *iptun;
534 if (iptun_enter_by_linkid(linkid, &iptun) != 0)
537 iptun->iptun_flags |= IPTUN_UPCALL_PENDING;
541 mtu = iptun->iptun_mtu;
544 addr = iptun->iptun_laddr;
547 addr = iptun->iptun_raddr;
550 linkstate = IS_IPTUN_RUNNING(iptun) ?
554 header_size = iptun->iptun_header_size;
555 header = iptun->iptun_header;
561 iptun_exit(iptun);
565 (void) mac_maxsdu_update(iptun->iptun_mh, mtu);
568 mac_unicst_update(iptun->iptun_mh, (uint8_t *)&addr.ia_addr);
571 mac_dst_update(iptun->iptun_mh, (uint8_t *)&addr.ia_addr);
574 mac_link_update(iptun->iptun_mh, linkstate);
577 if (mac_pdata_update(iptun->iptun_mh,
579 atomic_inc_64(&iptun->iptun_taskq_fail);
583 mutex_enter(&iptun->iptun_lock);
584 iptun->iptun_flags &= ~IPTUN_UPCALL_PENDING;
585 cv_signal(&iptun->iptun_upcall_cv);
586 mutex_exit(&iptun->iptun_lock);
590 iptun_task_dispatch(iptun_t *iptun, iptun_task_t iptun_task)
596 atomic_inc_64(&iptun->iptun_taskq_fail);
600 itd->itd_linkid = iptun->iptun_linkid;
602 atomic_inc_64(&iptun->iptun_taskq_fail);
673 iptun_setladdr(iptun_t *iptun, const struct sockaddr_storage *laddr)
675 return (iptun_setaddr(iptun->iptun_typeinfo->iti_type,
676 &iptun->iptun_laddr, laddr));
680 iptun_setraddr(iptun_t *iptun, const struct sockaddr_storage *raddr)
682 if (!(iptun->iptun_typeinfo->iti_hasraddr))
684 return (iptun_setaddr(iptun->iptun_typeinfo->iti_type,
685 &iptun->iptun_raddr, raddr));
689 iptun_canbind(iptun_t *iptun)
695 return ((iptun->iptun_flags & IPTUN_LADDR) &&
696 ((iptun->iptun_flags & IPTUN_RADDR) ||
697 !(iptun->iptun_typeinfo->iti_hasraddr)));
704 iptun_bind(iptun_t *iptun)
706 conn_t *connp = iptun->iptun_connp;
725 ASSERT(iptun_canbind(iptun));
733 connp->conn_ipversion = iptun->iptun_typeinfo->iti_ipvers;
735 switch (iptun->iptun_typeinfo->iti_type) {
737 IN6_IPADDR_TO_V4MAPPED(iptun->iptun_laddr4,
739 IN6_IPADDR_TO_V4MAPPED(iptun->iptun_raddr4,
742 if (ip_laddr_verify_v4(iptun->iptun_laddr4, IPCL_ZONEID(connp),
750 connp->conn_laddr_v6 = iptun->iptun_laddr6;
751 connp->conn_faddr_v6 = iptun->iptun_raddr6;
754 if (ip_laddr_verify_v6(&iptun->iptun_laddr6, IPCL_ZONEID(connp),
762 IN6_IPADDR_TO_V4MAPPED(iptun->iptun_laddr4,
768 switch (ip_laddr_verify_v4(iptun->iptun_laddr4,
828 iptun->iptun_flags |= IPTUN_BOUND;
840 (void) iptun_update_mtu(iptun, ixa, 0);
842 if (IS_IPTUN_RUNNING(iptun))
843 iptun_task_dispatch(iptun, IPTUN_TASK_LINK_UPDATE);
851 iptun_unbind(iptun_t *iptun)
853 ASSERT(iptun->iptun_flags & IPTUN_BOUND);
854 ASSERT(mutex_owned(&iptun->iptun_lock) ||
855 (iptun->iptun_flags & IPTUN_CONDEMNED));
856 ip_unbind(iptun->iptun_connp);
857 iptun->iptun_flags &= ~IPTUN_BOUND;
858 if (!(iptun->iptun_flags & IPTUN_CONDEMNED))
859 iptun_task_dispatch(iptun, IPTUN_TASK_LINK_UPDATE);
867 iptun_headergen(iptun_t *iptun, boolean_t update_mac)
869 switch (iptun->iptun_typeinfo->iti_ipvers) {
875 if (iptun->iptun_hoplimit == IPTUN_DEFAULT_HOPLIMIT) {
876 iptun->iptun_header_size = 0;
879 iptun->iptun_header_size = sizeof (ipha_t);
880 iptun->iptun_header4.ipha_version_and_hdr_length =
882 iptun->iptun_header4.ipha_fragment_offset_and_flags =
884 iptun->iptun_header4.ipha_ttl = iptun->iptun_hoplimit;
887 ip6_t *ip6hp = &iptun->iptun_header6.it6h_ip6h;
895 if (iptun->iptun_hoplimit == IPTUN_DEFAULT_HOPLIMIT &&
896 iptun->iptun_encaplimit == 0) {
897 iptun->iptun_header_size = 0;
902 if (iptun->iptun_encaplimit == 0) {
903 iptun->iptun_header_size = sizeof (ip6_t);
908 iptun->iptun_header_size = sizeof (iptun_ipv6hdrs_t);
918 iel = &iptun->iptun_header6.it6h_encaplim;
921 iptun->iptun_encaplimit;
924 ip6hp->ip6_hlim = iptun->iptun_hoplimit;
930 iptun_task_dispatch(iptun, IPTUN_TASK_PDATA_UPDATE);
957 iptun_set_sec_simple(iptun_t *iptun, const ipsec_req_t *ipsr)
966 netstack_t *ns = iptun->iptun_ns;
979 ASSERT(mutex_owned(&iptun->iptun_lock));
980 itp = iptun->iptun_itp;
984 if ((rc = dls_mgmt_get_linkinfo(iptun->iptun_linkid, name, NULL,
990 iptun->iptun_itp = itp;
1045 (void) iptun_update_mtu(iptun, NULL, 0);
1088 * Set the parameters included in ik on the tunnel iptun. Parameters that can
1092 iptun_setparams(iptun_t *iptun, const iptun_kparams_t *ik)
1095 netstack_t *ns = iptun->iptun_ns;
1097 uint_t orig_flags = iptun->iptun_flags;
1101 orig_laddr = iptun->iptun_laddr;
1102 if ((err = iptun_setladdr(iptun, &ik->iptun_kparam_laddr)) != 0)
1104 iptun->iptun_flags |= IPTUN_LADDR;
1109 orig_raddr = iptun->iptun_raddr;
1110 if ((err = iptun_setraddr(iptun, &ik->iptun_kparam_raddr)) != 0)
1112 iptun->iptun_flags |= IPTUN_RADDR;
1124 if (iptun->iptun_typeinfo->iti_type == IPTUN_TYPE_6TO4) {
1156 err = iptun_set_sec_simple(iptun, &ik->iptun_kparam_secinfo);
1158 iptun->iptun_flags |= IPTUN_SIMPLE_POLICY;
1159 iptun->iptun_simple_policy = ik->iptun_kparam_secinfo;
1167 iptun->iptun_laddr = orig_laddr;
1170 iptun->iptun_raddr = orig_raddr;
1171 iptun->iptun_flags = orig_flags;
1177 iptun_register(iptun_t *iptun)
1182 ASSERT(!(iptun->iptun_flags & IPTUN_MAC_REGISTERED));
1187 mac->m_type_ident = iptun->iptun_typeinfo->iti_ident;
1188 mac->m_driver = iptun;
1191 mac->m_src_addr = (uint8_t *)&iptun->iptun_laddr.ia_addr;
1192 mac->m_dst_addr = iptun->iptun_typeinfo->iti_hasraddr ?
1193 (uint8_t *)&iptun->iptun_raddr.ia_addr : NULL;
1195 mac->m_min_sdu = iptun->iptun_typeinfo->iti_minmtu;
1196 mac->m_max_sdu = iptun->iptun_mtu;
1197 if (iptun->iptun_header_size != 0) {
1198 mac->m_pdata = &iptun->iptun_header;
1199 mac->m_pdata_size = iptun->iptun_header_size;
1201 if ((err = mac_register(mac, &iptun->iptun_mh)) == 0)
1202 iptun->iptun_flags |= IPTUN_MAC_REGISTERED;
1208 iptun_unregister(iptun_t *iptun)
1212 ASSERT(iptun->iptun_flags & IPTUN_MAC_REGISTERED);
1213 if ((err = mac_unregister(iptun->iptun_mh)) == 0)
1214 iptun->iptun_flags &= ~IPTUN_MAC_REGISTERED;
1219 iptun_conn_create(iptun_t *iptun, netstack_t *ns, cred_t *credp)
1227 connp->conn_iptun = iptun;
1237 connp->conn_ixa->ixa_notify_cookie = iptun;
1273 switch (iptun->iptun_typeinfo->iti_ipvers) {
1299 iptun_t *iptun;
1301 if ((iptun = kmem_cache_alloc(iptun_cache, KM_NOSLEEP)) != NULL) {
1302 bzero(iptun, sizeof (*iptun));
1305 return (iptun);
1309 iptun_free(iptun_t *iptun)
1311 ASSERT(iptun->iptun_flags & IPTUN_CONDEMNED);
1313 if (iptun->iptun_flags & IPTUN_HASH_INSERTED) {
1314 iptun_stack_t *iptuns = iptun->iptun_iptuns;
1318 IPTUN_HASH_KEY(iptun->iptun_linkid),
1319 (mod_hash_val_t *)&iptun) == 0);
1321 iptun->iptun_flags &= ~IPTUN_HASH_INSERTED;
1323 list_remove(&iptuns->iptuns_iptunlist, iptun);
1327 if (iptun->iptun_flags & IPTUN_BOUND)
1328 iptun_unbind(iptun);
1334 if (iptun->iptun_flags & IPTUN_MAC_REGISTERED)
1335 VERIFY(iptun_unregister(iptun) == 0);
1337 if (iptun->iptun_itp != NULL) {
1342 itp_unlink(iptun->iptun_itp, iptun->iptun_ns);
1343 ITP_REFRELE(iptun->iptun_itp, iptun->iptun_ns);
1344 iptun->iptun_itp = NULL;
1345 iptun->iptun_flags &= ~IPTUN_SIMPLE_POLICY;
1353 if (iptun->iptun_connp != NULL) {
1354 iptun_conn_destroy(iptun->iptun_connp);
1355 iptun->iptun_connp = NULL;
1358 kmem_cache_free(iptun_cache, iptun);
1365 iptun_t *iptun = NULL;
1394 if (iptun_enter_by_linkid(ik->iptun_kparam_linkid, &iptun) == 0) {
1395 iptun_exit(iptun);
1396 iptun = NULL;
1404 if ((iptun = iptun_alloc()) == NULL) {
1409 iptun->iptun_linkid = ik->iptun_kparam_linkid;
1410 iptun->iptun_zoneid = zoneid;
1411 iptun->iptun_ns = ns;
1413 iptun->iptun_typeinfo = iptun_gettypeinfo(ik->iptun_kparam_type);
1414 if (iptun->iptun_typeinfo->iti_type == IPTUN_TYPE_UNKNOWN) {
1420 iptun->iptun_flags |= IPTUN_IMPLICIT;
1422 if ((err = iptun_setparams(iptun, ik)) != 0)
1425 iptun->iptun_hoplimit = IPTUN_DEFAULT_HOPLIMIT;
1426 if (iptun->iptun_typeinfo->iti_type == IPTUN_TYPE_IPV6)
1427 iptun->iptun_encaplimit = IPTUN_DEFAULT_ENCAPLIMIT;
1429 iptun_headergen(iptun, B_FALSE);
1431 iptun->iptun_connp = iptun_conn_create(iptun, ns, credp);
1432 if (iptun->iptun_connp == NULL) {
1437 iptun->iptun_mtu = iptun->iptun_typeinfo->iti_maxmtu;
1438 iptun->iptun_dpmtu = iptun->iptun_mtu;
1447 if ((err = dls_mgmt_get_linkinfo(iptun->iptun_linkid, linkname, NULL,
1451 iptun->iptun_itp = itp;
1459 if (iptun_canbind(iptun) && ((err = iptun_bind(iptun)) != 0))
1462 if ((err = iptun_register(iptun)) != 0)
1465 err = dls_devnet_create(iptun->iptun_mh, iptun->iptun_linkid,
1466 iptun->iptun_zoneid);
1472 * We hash by link-id as that is the key used by all other iptun
1476 IPTUN_HASH_KEY(iptun->iptun_linkid), (mod_hash_val_t)iptun)) == 0) {
1478 list_insert_head(&iptuns->iptuns_iptunlist, iptun);
1480 iptun->iptun_flags |= IPTUN_HASH_INSERTED;
1490 if (iptun == NULL && ns != NULL)
1492 if (err != 0 && iptun != NULL) {
1494 (void) dls_devnet_destroy(iptun->iptun_mh, &tmpid,
1497 iptun->iptun_flags |= IPTUN_CONDEMNED;
1498 iptun_free(iptun);
1507 iptun_t *iptun = NULL;
1509 if ((err = iptun_enter_by_linkid(linkid, &iptun)) != 0)
1513 if (iptun->iptun_zoneid != crgetzoneid(credp)) {
1514 iptun_exit(iptun);
1519 * We need to exit iptun in order to issue calls up the stack such as
1520 * dls_devnet_destroy(). If we call up while still in iptun, deadlock
1522 * threads from entering this iptun after we've exited it by setting
1529 iptun->iptun_flags |= IPTUN_DELETE_PENDING;
1532 while (iptun->iptun_flags & IPTUN_UPCALL_PENDING)
1533 cv_wait(&iptun->iptun_upcall_cv, &iptun->iptun_lock);
1535 iptun_exit(iptun);
1537 if ((err = dls_devnet_destroy(iptun->iptun_mh, &linkid, B_TRUE)) == 0) {
1540 * to the iptun MAC. If there are none, then mac_disable()
1549 if ((err = mac_disable(iptun->iptun_mh)) != 0) {
1550 (void) dls_devnet_create(iptun->iptun_mh, linkid,
1551 iptun->iptun_zoneid);
1562 mutex_enter(&iptun->iptun_lock);
1563 iptun->iptun_flags &= ~IPTUN_DELETE_PENDING;
1565 iptun->iptun_flags |= IPTUN_CONDEMNED;
1566 cv_broadcast(&iptun->iptun_enter_cv);
1567 mutex_exit(&iptun->iptun_lock);
1578 iptun_free(iptun);
1586 iptun_t *iptun;
1590 if ((err = iptun_enter_by_linkid(ik->iptun_kparam_linkid, &iptun)) != 0)
1594 if (iptun->iptun_zoneid != crgetzoneid(credp)) {
1605 if ((err = iptun_setparams(iptun, ik)) != 0)
1607 iptun_headergen(iptun, B_FALSE);
1618 if (iptun->iptun_flags & IPTUN_BOUND)
1619 iptun_unbind(iptun);
1620 if (iptun_canbind(iptun) && (err = iptun_bind(iptun)) != 0) {
1622 iptun->iptun_flags &= ~IPTUN_LADDR;
1624 iptun->iptun_flags &= ~IPTUN_RADDR;
1630 iptun_task_dispatch(iptun, IPTUN_TASK_LADDR_UPDATE);
1632 iptun_task_dispatch(iptun, IPTUN_TASK_RADDR_UPDATE);
1635 iptun_exit(iptun);
1643 iptun_t *iptun;
1651 if ((err = iptun_enter_by_linkid(ik->iptun_kparam_linkid, &iptun)) != 0)
1656 ik->iptun_kparam_linkid = iptun->iptun_linkid;
1657 ik->iptun_kparam_type = iptun->iptun_typeinfo->iti_type;
1660 if (iptun->iptun_flags & IPTUN_LADDR) {
1661 iptun_getaddr(&iptun->iptun_laddr, &ik->iptun_kparam_laddr);
1664 if (iptun->iptun_flags & IPTUN_RADDR) {
1665 iptun_getaddr(&iptun->iptun_raddr, &ik->iptun_kparam_raddr);
1669 if (iptun->iptun_flags & IPTUN_IMPLICIT)
1672 if (iptun->iptun_itp != NULL) {
1673 mutex_enter(&iptun->iptun_itp->itp_lock);
1674 if (iptun->iptun_itp->itp_flags & ITPF_P_ACTIVE) {
1676 if (iptun->iptun_flags & IPTUN_SIMPLE_POLICY) {
1679 iptun->iptun_simple_policy;
1682 mutex_exit(&iptun->iptun_itp->itp_lock);
1686 iptun_exit(iptun);
1708 iptun_t *iptun;
1710 if (iptun_enter_by_linkid(linkid, &iptun) != 0)
1712 if (iptun->iptun_itp != itp) {
1713 ASSERT(iptun->iptun_itp == NULL);
1715 iptun->iptun_itp = itp;
1721 (void) iptun_update_mtu(iptun, NULL, 0);
1722 iptun_exit(iptun);
1730 iptun_get_dst_pmtu(iptun_t *iptun, ip_xmit_attr_t *ixa)
1733 conn_t *connp = iptun->iptun_connp;
1740 if (!(iptun->iptun_flags & IPTUN_RADDR))
1763 } else if (iptun->iptun_typeinfo->iti_type != IPTUN_TYPE_6TO4) {
1781 iptun_update_dst_pmtu(iptun_t *iptun, ip_xmit_attr_t *ixa)
1784 conn_t *connp = iptun->iptun_connp;
1788 if (!(iptun->iptun_flags & IPTUN_RADDR))
1815 } else if (iptun->iptun_typeinfo->iti_type != IPTUN_TYPE_6TO4) {
1828 * There is nothing that iptun can verify in addition to IP having
1846 iptun_t *iptun = (iptun_t *)arg;
1850 (void) iptun_update_mtu(iptun, ixa, narg);
1872 iptun_get_ipsec_overhead(iptun_t *iptun)
1880 ipsec_tun_pol_t *itp = iptun->iptun_itp;
1881 netstack_t *ns = iptun->iptun_ns;
1889 if ((iptun->iptun_flags & (IPTUN_LADDR|IPTUN_RADDR)) !=
1896 (iptun->iptun_typeinfo->iti_ipvers == IPV4_VERSION);
1897 switch (iptun->iptun_typeinfo->iti_ipvers) {
1899 sel.ips_local_addr_v4 = iptun->iptun_laddr4;
1900 sel.ips_remote_addr_v4 = iptun->iptun_raddr4;
1903 sel.ips_local_addr_v6 = iptun->iptun_laddr6;
1904 sel.ips_remote_addr_v6 = iptun->iptun_raddr6;
1954 iptun_get_maxmtu(iptun_t *iptun, ip_xmit_attr_t *ixa, uint32_t new_pmtu)
1965 if (iptun->iptun_flags & IPTUN_RADDR)
1966 iptun->iptun_dpmtu = new_pmtu;
1968 } else if (iptun->iptun_flags & IPTUN_RADDR) {
1969 if ((pmtu = iptun_get_dst_pmtu(iptun, ixa)) == 0) {
1974 pmtu = iptun->iptun_dpmtu;
1976 iptun->iptun_dpmtu = pmtu;
1983 pmtu = iptun->iptun_typeinfo->iti_maxmtu;
1990 if (iptun->iptun_header_size != 0) {
1991 header_size = iptun->iptun_header_size;
1993 switch (iptun->iptun_typeinfo->iti_ipvers) {
2005 ipsec_overhead = iptun_get_ipsec_overhead(iptun);
2008 return (max(maxmtu, iptun->iptun_typeinfo->iti_minmtu));
2022 iptun_update_mtu(iptun_t *iptun, ip_xmit_attr_t *ixa, uint32_t new_pmtu)
2027 iptun_update_dst_pmtu(iptun, ixa);
2033 if (iptun->iptun_flags & IPTUN_FIXED_MTU)
2034 return (iptun->iptun_mtu);
2037 newmtu = iptun_get_maxmtu(iptun, ixa, new_pmtu);
2043 if ((iptun->iptun_flags & IPTUN_RADDR) && newmtu != iptun->iptun_mtu) {
2044 iptun->iptun_mtu = newmtu;
2045 if (iptun->iptun_flags & IPTUN_MAC_REGISTERED)
2046 iptun_task_dispatch(iptun, IPTUN_TASK_MTU_UPDATE);
2091 iptun_sendicmp_v4(iptun_t *iptun, icmph_t *icmp, ipha_t *orig_ipha, mblk_t *mp,
2099 conn_t *connp = iptun->iptun_connp;
2104 iptun_drop_pkt(mp, &iptun->iptun_noxmtbuf);
2148 iptun_sendicmp_v6(iptun_t *iptun, icmp6_t *icmp6, ip6_t *orig_ip6h, mblk_t *mp,
2156 conn_t *connp = iptun->iptun_connp;
2161 iptun_drop_pkt(mp, &iptun->iptun_noxmtbuf);
2201 iptun_icmp_error_v4(iptun_t *iptun, ipha_t *orig_ipha, mblk_t *mp,
2210 iptun_sendicmp_v4(iptun, &icmp, orig_ipha, mp, tsl);
2214 iptun_icmp_fragneeded_v4(iptun_t *iptun, uint32_t newmtu, ipha_t *orig_ipha,
2224 iptun_sendicmp_v4(iptun, &icmp, orig_ipha, mp, tsl);
2228 iptun_icmp_error_v6(iptun_t *iptun, ip6_t *orig_ip6h, mblk_t *mp,
2239 iptun_sendicmp_v6(iptun, &icmp6, orig_ip6h, mp, tsl);
2243 iptun_icmp_toobig_v6(iptun_t *iptun, uint32_t newmtu, ip6_t *orig_ip6h,
2252 iptun_sendicmp_v6(iptun, &icmp6, orig_ip6h, mp, tsl);
2385 iptun_input_icmp_v4(iptun_t *iptun, mblk_t *data_mp, icmph_t *icmph,
2412 iptun_drop_pkt(data_mp, &iptun->iptun_ierrors);
2420 data_mp = ipsec_tun_inbound(ira, data_mp, iptun->iptun_itp,
2421 inner4, inner6, outer4, outer6, -outer_hlen, iptun->iptun_ns);
2424 atomic_inc_64(&iptun->iptun_ierrors);
2438 iptun_drop_pkt(data_mp, &iptun->iptun_norcvbuf);
2454 newmtu = iptun_update_mtu(iptun, NULL,
2458 iptun_icmp_fragneeded_v4(iptun, newmtu, inner4,
2461 iptun_icmp_toobig_v6(iptun, newmtu, inner6,
2488 iptun_drop_pkt(data_mp, &iptun->iptun_oerrors);
2491 iptun_drop_pkt(data_mp, &iptun->iptun_norcvbuf);
2496 iptun_icmp_error_v4(iptun, inner4, data_mp, type, code,
2499 iptun_icmp_error_v6(iptun, inner6, data_mp, type, code, 0,
2558 iptun_input_icmp_v6(iptun_t *iptun, mblk_t *data_mp, icmp6_t *icmp6h,
2586 iptun_drop_pkt(data_mp, &iptun->iptun_ierrors);
2590 data_mp = ipsec_tun_inbound(ira, data_mp, iptun->iptun_itp,
2591 inner4, inner6, outer4, outer6, -outer_hlen, iptun->iptun_ns);
2594 atomic_inc_64(&iptun->iptun_ierrors);
2608 iptun_drop_pkt(data_mp, &iptun->iptun_norcvbuf);
2627 iptun_drop_pkt(data_mp, &iptun->iptun_oerrors);
2647 newmtu = iptun_update_mtu(iptun, NULL,
2651 iptun_icmp_fragneeded_v4(iptun, newmtu, inner4,
2654 iptun_icmp_toobig_v6(iptun, newmtu, inner6, data_mp,
2660 iptun_drop_pkt(data_mp, &iptun->iptun_norcvbuf);
2665 iptun_icmp_error_v4(iptun, inner4, data_mp, type, code,
2668 iptun_icmp_error_v6(iptun, inner6, data_mp, type, code, 0,
2681 iptun_t *iptun = connp->conn_iptun;
2695 iptun_drop_pkt(mp, &iptun->iptun_norcvbuf);
2703 switch (iptun->iptun_typeinfo->iti_ipvers) {
2709 iptun_input_icmp_v4(iptun, mp, (icmph_t *)(mp->b_rptr + hlen),
2713 iptun_input_icmp_v6(iptun, mp, (icmp6_t *)(mp->b_rptr + hlen),
2720 iptun_in_6to4_ok(iptun_t *iptun, ipha_t *outer4, ip6_t *inner6)
2756 if (iptun->iptun_iptuns->iptuns_relay_rtr_addr == INADDR_ANY)
2774 iptun_t *iptun = connp->conn_iptun;
2804 data_mp = ipsec_tun_inbound(ira, data_mp, iptun->iptun_itp,
2805 inner4, inner6, outer4, outer6, outer_hlen, iptun->iptun_ns);
2811 if (iptun->iptun_typeinfo->iti_type == IPTUN_TYPE_6TO4 &&
2812 !iptun_in_6to4_ok(iptun, outer4, inner6))
2825 atomic_inc_64(&iptun->iptun_ipackets);
2826 atomic_add_64(&iptun->iptun_rbytes, msgdsize(data_mp));
2827 mac_rx(iptun->iptun_mh, NULL, data_mp);
2833 iptun_drop_pkt(data_mp, &iptun->iptun_ierrors);
2842 iptun_out_process_6to4(iptun_t *iptun, ipha_t *outer4, ip6_t *inner6)
2903 if (iptun->iptun_iptuns->iptuns_relay_rtr_addr == INADDR_ANY)
2905 outer4->ipha_dst = iptun->iptun_iptuns->iptuns_relay_rtr_addr;
2912 * packet infinitely bouncing between ip and iptun.
2922 iptun_out_process_ipv4(iptun_t *iptun, mblk_t *mp, ipha_t *outer4,
2927 size_t minmtu = iptun->iptun_typeinfo->iti_minmtu;
2961 (iptun->iptun_typeinfo->iti_type != IPTUN_TYPE_6TO4)) {
2978 iptun_insert_encaplimit(iptun_t *iptun, mblk_t *mp, ip6_t *outer6,
2990 iptun_drop_pkt(mp, &iptun->iptun_noxmtbuf);
3019 iptun_out_process_ipv6(iptun_t *iptun, mblk_t *mp, ip6_t *outer6,
3024 size_t minmtu = iptun->iptun_typeinfo->iti_minmtu;
3048 iptun_icmp_error_v6(iptun, inner6, mp, ICMP6_PARAM_PROB,
3050 atomic_inc_64(&iptun->iptun_noxmtbuf);
3058 if (iptun->iptun_encaplimit == 0) {
3059 if ((mp = iptun_insert_encaplimit(iptun, mp, outer6,
3103 iptun_output(iptun_t *iptun, mblk_t *mp)
3105 conn_t *connp = iptun->iptun_connp;
3114 iptun_drop_pkt(mp, &iptun->iptun_noxmtbuf);
3121 if (iptun->iptun_typeinfo->iti_type == IPTUN_TYPE_6TO4) {
3122 iptun_output_6to4(iptun, mp);
3141 iptun_drop_pkt(mp, &iptun->iptun_oerrors);
3163 iptun_drop_pkt(mp, &iptun->iptun_oerrors);
3169 iptun_output_common(iptun, ixa, mp);
3177 iptun_output_6to4(iptun_t *iptun, mblk_t *mp)
3179 conn_t *connp = iptun->iptun_connp;
3194 if (!iptun_out_process_6to4(iptun, outer4, inner6)) {
3195 iptun_drop_pkt(mp, &iptun->iptun_oerrors);
3214 iptun_drop_pkt(mp, &iptun->iptun_oerrors);
3255 iptun_drop_pkt(mp, &iptun->iptun_oerrors);
3261 iptun_output_common(iptun, ixa, mp);
3350 iptun_output_common(iptun_t *iptun, ip_xmit_attr_t *ixa, mblk_t *mp)
3352 ipsec_tun_pol_t *itp = iptun->iptun_itp;
3365 iptun_drop_pkt(mp, &iptun->iptun_oerrors);
3374 mp = iptun_out_process_ipv4(iptun, mp, outer4, inner4, inner6,
3377 mp = iptun_out_process_ipv6(iptun, mp, outer6, inner4, inner6,
3388 mp = ipsec_tun_outbound(mp, iptun, inner4, inner6, outer4,
3391 atomic_inc_64(&iptun->iptun_oerrors);
3403 iptun_drop_pkt(mp, &iptun->iptun_oerrors);
3422 size_t minmtu = iptun->iptun_typeinfo->iti_minmtu;
3424 atomic_inc_64(&iptun->iptun_opackets);
3425 atomic_add_64(&iptun->iptun_obytes, ixa->ixa_pktlen);
3444 atomic_inc_64(&iptun->iptun_opackets);
3445 atomic_add_64(&iptun->iptun_obytes, ixa->ixa_pktlen);
3454 (void) iptun_update_mtu(iptun, ixa, 0);
3466 atomic_inc_64(&iptun->iptun_oerrors);
3478 iptun_drop_pkt(mp, &iptun->iptun_oerrors);
3483 atomic_inc_64(&iptun->iptun_opackets);
3484 atomic_add_64(&iptun->iptun_obytes, ixa->ixa_pktlen);
3489 (void) iptun_update_mtu(iptun, ixa, 0);