Lines Matching refs:iptun

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