Lines Matching defs:connp

113 static void	icmp_icmp_error_ipv6(conn_t *connp, mblk_t *mp,
123 int icmp_opt_set(conn_t *connp, uint_t optset_context,
127 int icmp_opt_get(conn_t *connp, int level, int name,
129 static int icmp_output_newdst(conn_t *connp, mblk_t *data_mp, sin_t *sin,
317 conn_t *connp = Q_TO_CONN(q);
335 icmp = connp->conn_icmp;
369 if (connp->conn_family == AF_INET) {
378 ASSERT(connp->conn_family == AF_INET6);
406 error = rawip_do_bind(connp, sa, len);
420 rawip_do_bind(conn_t *connp, struct sockaddr *sa, socklen_t len)
424 icmp_t *icmp = connp->conn_icmp;
431 zoneid_t zoneid = IPCL_ZONEID(connp);
432 ip_stack_t *ipst = connp->conn_netstack->netstack_ip;
442 connp->conn_family != AF_INET) {
457 connp->conn_family != AF_INET6) {
488 mutex_enter(&connp->conn_lock);
490 mutex_exit(&connp->conn_lock);
502 connp->conn_bound_addr_v6 = v6src;
503 connp->conn_laddr_v6 = v6src;
505 connp->conn_ixa->ixa_flags |= IXAF_SCOPEID_SET;
506 connp->conn_ixa->ixa_scopeid = scopeid;
507 connp->conn_incoming_ifindex = scopeid;
509 connp->conn_ixa->ixa_flags &= ~IXAF_SCOPEID_SET;
510 connp->conn_incoming_ifindex = connp->conn_bound_if;
516 connp->conn_saddr_v6 = v6src;
517 connp->conn_mcbc_bind = B_FALSE;
522 connp->conn_saddr_v6 = ipv6_all_zeros;
523 connp->conn_mcbc_bind = B_TRUE;
533 connp->conn_lport = lport;
534 connp->conn_fport = 0;
536 if (connp->conn_family == AF_INET) {
537 ASSERT(connp->conn_ipversion == IPV4_VERSION);
539 ASSERT(connp->conn_ipversion == IPV6_VERSION);
551 error = icmp_build_hdr_template(connp, &connp->conn_saddr_v6,
552 &connp->conn_faddr_v6, connp->conn_flowinfo);
554 mutex_exit(&connp->conn_lock);
558 connp->conn_faddr_v6 = ipv6_all_zeros;
559 connp->conn_v6lastdst = ipv6_all_zeros;
560 mutex_exit(&connp->conn_lock);
562 error = ip_laddr_fanout_insert(connp);
570 mutex_enter(&connp->conn_lock);
571 connp->conn_saddr_v6 = ipv6_all_zeros;
572 connp->conn_bound_addr_v6 = ipv6_all_zeros;
573 connp->conn_laddr_v6 = ipv6_all_zeros;
575 connp->conn_ixa->ixa_flags &= ~IXAF_SCOPEID_SET;
576 connp->conn_incoming_ifindex = connp->conn_bound_if;
579 connp->conn_v6lastdst = ipv6_all_zeros;
580 connp->conn_lport = 0;
583 (void) icmp_build_hdr_template(connp, &connp->conn_saddr_v6,
584 &connp->conn_faddr_v6, connp->conn_flowinfo);
585 mutex_exit(&connp->conn_lock);
595 conn_t *connp = icmp->icmp_connp;
597 mutex_enter(&connp->conn_lock);
598 connp->conn_saddr_v6 = ipv6_all_zeros;
599 connp->conn_laddr_v6 = ipv6_all_zeros;
600 connp->conn_faddr_v6 = ipv6_all_zeros;
601 connp->conn_v6lastdst = ipv6_all_zeros;
602 mutex_exit(&connp->conn_lock);
604 (void) ip_laddr_fanout_insert(connp);
619 conn_t *connp = Q_TO_CONN(q);
668 error = proto_verify_ip_addr(connp->conn_family, sa, len);
674 error = rawip_do_connect(connp, sa, len, cr, pid);
688 if (connp->conn_family == AF_INET) {
692 ASSERT(connp->conn_family == AF_INET6);
710 putnext(connp->conn_rq, mp);
711 putnext(connp->conn_rq, mp1);
716 rawip_do_connect(conn_t *connp, const struct sockaddr *sa, socklen_t len,
731 in6_addr_t v6src = connp->conn_saddr_v6;
733 icmp = connp->conn_icmp;
754 ASSERT(connp->conn_ipversion == IPV4_VERSION);
766 ASSERT(connp->conn_ipversion == IPV6_VERSION);
773 if (!ip_srcid_find_id(srcid, &v6src, IPCL_ZONEID(connp),
774 B_FALSE, connp->conn_netstack)) {
791 ixa = conn_get_ixa(connp, B_FALSE);
795 mutex_enter(&connp->conn_lock);
802 mutex_exit(&connp->conn_lock);
809 if (connp->conn_mcbc_bind)
810 connp->conn_saddr_v6 = ipv6_all_zeros;
812 connp->conn_saddr_v6 = connp->conn_bound_addr_v6;
813 connp->conn_laddr_v6 = connp->conn_bound_addr_v6;
814 connp->conn_faddr_v6 = ipv6_all_zeros;
822 connp->conn_fport = dstport;
823 if (connp->conn_ipversion == IPV4_VERSION) {
832 ASSERT(connp->conn_family == AF_INET);
835 connp->conn_faddr_v6 = v6dst;
836 connp->conn_flowinfo = 0;
838 ASSERT(connp->conn_ipversion == IPV6_VERSION);
848 connp->conn_faddr_v6 = v6dst;
849 connp->conn_flowinfo = flowinfo;
855 if (connp->conn_cred != cr) {
857 crfree(connp->conn_cred);
858 connp->conn_cred = cr;
860 connp->conn_cpid = pid;
872 connp->conn_incoming_ifindex = scopeid;
875 connp->conn_incoming_ifindex = connp->conn_bound_if;
884 connp->conn_v6lastdst = ipv6_all_zeros;
887 error = conn_connect(connp, NULL, IPDF_ALLOW_MCBC);
888 mutex_exit(&connp->conn_lock);
896 error = ipcl_conn_insert(connp);
900 mutex_enter(&connp->conn_lock);
901 error = icmp_build_hdr_template(connp, &connp->conn_saddr_v6,
902 &connp->conn_faddr_v6, connp->conn_flowinfo);
904 mutex_exit(&connp->conn_lock);
910 connp->conn_v6lastdst = connp->conn_faddr_v6;
911 connp->conn_lastipversion = connp->conn_ipversion;
912 connp->conn_lastdstport = connp->conn_fport;
913 connp->conn_lastflowinfo = connp->conn_flowinfo;
914 connp->conn_lastscopeid = scopeid;
915 connp->conn_lastsrcid = srcid;
917 connp->conn_v6lastsrc = v6src;
919 oldixa = conn_replace_ixa(connp, ixa);
920 mutex_exit(&connp->conn_lock);
929 mutex_enter(&connp->conn_lock);
932 if (connp->conn_mcbc_bind)
933 connp->conn_saddr_v6 = ipv6_all_zeros;
935 connp->conn_saddr_v6 = connp->conn_bound_addr_v6;
936 connp->conn_laddr_v6 = connp->conn_bound_addr_v6;
937 connp->conn_faddr_v6 = ipv6_all_zeros;
938 connp->conn_v6lastdst = ipv6_all_zeros;
939 connp->conn_flowinfo = 0;
941 (void) icmp_build_hdr_template(connp, &connp->conn_saddr_v6,
942 &connp->conn_faddr_v6, connp->conn_flowinfo);
943 mutex_exit(&connp->conn_lock);
948 rawip_do_close(conn_t *connp)
950 ASSERT(connp != NULL && IPCL_IS_RAWIP(connp));
952 ip_quiesce_conn(connp);
954 if (!IPCL_IS_NONSTR(connp)) {
955 qprocsoff(connp->conn_rq);
958 icmp_close_free(connp);
962 * delete the things hanging off the connp, and finally the connp.
963 * We removed this connp from the fanout list, it cannot be
970 ASSERT(connp->conn_ref == 1);
972 if (!IPCL_IS_NONSTR(connp)) {
973 inet_minor_free(connp->conn_minor_arena, connp->conn_dev);
975 ip_free_helper_stream(connp);
978 connp->conn_ref--;
979 ipcl_conn_destroy(connp);
985 conn_t *connp;
997 connp = Q_TO_CONN(q);
998 (void) rawip_do_close(connp);
1005 icmp_close_free(conn_t *connp)
1007 icmp_t *icmp = connp->conn_icmp;
1020 ASSERT(icmp->icmp_connp == connp);
1022 icmp->icmp_connp = connp;
1031 icmp_do_disconnect(conn_t *connp)
1033 icmp_t *icmp = connp->conn_icmp;
1036 mutex_enter(&connp->conn_lock);
1038 mutex_exit(&connp->conn_lock);
1041 if (connp->conn_mcbc_bind)
1042 connp->conn_saddr_v6 = ipv6_all_zeros;
1044 connp->conn_saddr_v6 = connp->conn_bound_addr_v6;
1045 connp->conn_laddr_v6 = connp->conn_bound_addr_v6;
1046 connp->conn_faddr_v6 = ipv6_all_zeros;
1049 connp->conn_v6lastdst = ipv6_all_zeros;
1050 error = icmp_build_hdr_template(connp, &connp->conn_saddr_v6,
1051 &connp->conn_faddr_v6, connp->conn_flowinfo);
1052 mutex_exit(&connp->conn_lock);
1060 return (ip_laddr_fanout_insert(connp));
1066 conn_t *connp = Q_TO_CONN(q);
1080 error = icmp_do_disconnect(connp);
1096 icmp_disconnect(conn_t *connp)
1100 connp->conn_dgram_errind = B_FALSE;
1102 error = icmp_do_disconnect(connp);
1143 conn_t *connp = (conn_t *)arg1;
1144 icmp_t *icmp = connp->conn_icmp;
1158 icmp_icmp_error_ipv6(connp, mp, ira);
1181 if (connp->conn_ipversion != IPV4_VERSION)
1184 ixa = conn_get_ixa(connp, B_FALSE);
1196 mutex_enter(&connp->conn_lock);
1197 ipha = (ipha_t *)connp->conn_ht_iphc;
1205 mutex_exit(&connp->conn_lock);
1231 if (!connp->conn_dgram_errind) {
1240 if (IPCL_IS_NONSTR(connp)) {
1241 mutex_enter(&connp->conn_lock);
1243 if (sin.sin_addr.s_addr == connp->conn_faddr_v4) {
1244 mutex_exit(&connp->conn_lock);
1245 (*connp->conn_upcalls->su_set_error)
1246 (connp->conn_upper_handle, error);
1253 mutex_exit(&connp->conn_lock);
1258 putnext(connp->conn_rq, mp1);
1271 icmp_icmp_error_ipv6(conn_t *connp, mblk_t *mp, ip_recv_attr_t *ira)
1280 icmp_t *icmp = connp->conn_icmp;
1331 if (!connp->conn_ipv6_recvpathmtu)
1357 sin6->sin6_addr = connp->conn_faddr_v6;
1375 icmp_ulp_recv(connp, newmp, msgdsize(newmp));
1400 if (!connp->conn_dgram_errind) {
1409 if (IPCL_IS_NONSTR(connp)) {
1410 mutex_enter(&connp->conn_lock);
1413 &connp->conn_faddr_v6)) {
1414 mutex_exit(&connp->conn_lock);
1415 (*connp->conn_upcalls->su_set_error)
1416 (connp->conn_upper_handle, error);
1423 mutex_exit(&connp->conn_lock);
1428 putnext(connp->conn_rq, mp1);
1448 conn_t *connp = icmp->icmp_connp;
1466 if (connp->conn_family == AF_INET)
1471 mutex_enter(&connp->conn_lock);
1483 (void) conn_getsockname(connp, sa, &addrlen);
1494 (void) conn_getpeername(connp, sa, &addrlen);
1497 mutex_exit(&connp->conn_lock);
1505 conn_t *connp = icmp->icmp_connp;
1509 if (connp->conn_family == AF_INET6)
1579 conn_t *connp;
1609 connp = rawip_do_open(family, credp, &error, KM_SLEEP);
1610 if (connp == NULL) {
1617 connp->conn_dev = conn_dev;
1618 connp->conn_minor_arena = ip_minor_arena_sa;
1623 q->q_ptr = connp;
1624 WR(q)->q_ptr = connp;
1625 connp->conn_rq = q;
1626 connp->conn_wq = WR(q);
1628 WR(q)->q_hiwat = connp->conn_sndbuf;
1629 WR(q)->q_lowat = connp->conn_sndlowat;
1634 (void) proto_set_tx_wroff(q, connp, connp->conn_wroff);
1635 (void) proto_set_rx_hiwat(connp->conn_rq, connp, connp->conn_rcvbuf);
1637 mutex_enter(&connp->conn_lock);
1638 connp->conn_state_flags &= ~CONN_INCIPIENT;
1639 mutex_exit(&connp->conn_lock);
1641 icmp_bind_proto(connp->conn_icmp);
1668 conn_t *connp;
1698 connp = ipcl_conn_create(IPCL_RAWIPCONN, flags, ns);
1699 icmp = connp->conn_icmp;
1711 ASSERT(connp->conn_proto == IPPROTO_ICMP);
1712 ASSERT(connp->conn_icmp == icmp);
1713 ASSERT(icmp->icmp_connp == connp);
1717 connp->conn_ixa->ixa_flags |= IXAF_VERIFY_SOURCE;
1719 connp->conn_family = AF_INET6;
1720 connp->conn_ipversion = IPV6_VERSION;
1721 connp->conn_ixa->ixa_flags &= ~IXAF_IS_IPV4;
1722 connp->conn_proto = IPPROTO_ICMPV6;
1724 connp->conn_proto = IPPROTO_ICMPV6;
1725 connp->conn_ixa->ixa_protocol = connp->conn_proto;
1726 connp->conn_ixa->ixa_raw_cksum_offset = 2;
1727 connp->conn_default_ttl = is->is_ipv6_hoplimit;
1730 connp->conn_family = AF_INET;
1731 connp->conn_ipversion = IPV4_VERSION;
1732 connp->conn_ixa->ixa_flags |= IXAF_IS_IPV4;
1734 connp->conn_proto = IPPROTO_ICMP;
1735 connp->conn_ixa->ixa_protocol = connp->conn_proto;
1736 connp->conn_default_ttl = is->is_ipv4_ttl;
1739 connp->conn_xmit_ipp.ipp_unicast_hops = connp->conn_default_ttl;
1741 connp->conn_ixa->ixa_multicast_ttl = IP_DEFAULT_MULTICAST_TTL;
1749 connp->conn_ixa->ixa_flags |= IXAF_MULTICAST_LOOP | IXAF_SET_ULP_CKSUM;
1751 connp->conn_ixa->ixa_zoneid = zoneid;
1753 connp->conn_zoneid = zoneid;
1760 connp->conn_mac_mode = CONN_MAC_AWARE;
1762 connp->conn_zone_is_global = (crgetzoneid(credp) == GLOBAL_ZONEID);
1766 connp->conn_rcvbuf = is->is_recv_hiwat;
1767 connp->conn_sndbuf = is->is_xmit_hiwat;
1768 connp->conn_sndlowat = is->is_xmit_lowat;
1769 connp->conn_rcvlowat = icmp_mod_info.mi_lowat;
1771 connp->conn_wroff = len + is->is_wroff_extra;
1772 connp->conn_so_type = SOCK_RAW;
1774 connp->conn_recv = icmp_input;
1775 connp->conn_recvicmp = icmp_icmp_input;
1777 connp->conn_cred = credp;
1778 connp->conn_cpid = curproc->p_pid;
1779 connp->conn_open_time = ddi_get_lbolt64();
1781 ASSERT(!(connp->conn_ixa->ixa_free_flags & IXA_FREE_CRED));
1782 connp->conn_ixa->ixa_cred = connp->conn_cred;
1783 connp->conn_ixa->ixa_cpid = connp->conn_cpid;
1785 connp->conn_ixa->ixa_tsl = crgetlabel(connp->conn_cred);
1787 connp->conn_flow_cntrld = B_FALSE;
1790 connp->conn_ixa->ixa_flags |= IXAF_PMTU_DISCOVERY;
1792 return (connp);
1857 icmp_opt_get(conn_t *connp, int level, int name, uchar_t *ptr)
1859 icmp_t *icmp = connp->conn_icmp;
1864 coas.coa_connp = connp;
1865 coas.coa_ixa = connp->conn_ixa;
1866 coas.coa_ipp = &connp->conn_xmit_ipp;
1881 if (connp->conn_family != AF_INET)
1890 mutex_enter(&connp->conn_lock);
1892 mutex_exit(&connp->conn_lock);
1901 if (connp->conn_family != AF_INET6)
1910 if (connp->conn_proto == IPPROTO_ICMPV6)
1913 mutex_enter(&connp->conn_lock);
1914 if (connp->conn_ixa->ixa_flags & IXAF_SET_RAW_CKSUM)
1915 *i1 = connp->conn_ixa->ixa_raw_cksum_offset;
1918 mutex_exit(&connp->conn_lock);
1927 if (connp->conn_family != AF_INET6)
1930 if (connp->conn_proto != IPPROTO_ICMPV6)
1935 mutex_enter(&connp->conn_lock);
1943 mutex_exit(&connp->conn_lock);
1947 mutex_enter(&connp->conn_lock);
1949 mutex_exit(&connp->conn_lock);
1960 conn_t *connp = Q_TO_CONN(q);
1963 err = icmp_opt_get(connp, level, name, ptr);
1974 conn_t *connp = coa->coa_connp;
1976 icmp_t *icmp = connp->conn_icmp;
2002 mutex_enter(&connp->conn_lock);
2003 connp->conn_proto = *i1 & 0xFF;
2004 ixa->ixa_protocol = connp->conn_proto;
2005 if ((connp->conn_proto == IPPROTO_RAW ||
2006 connp->conn_proto == IPPROTO_IGMP) &&
2007 connp->conn_family == AF_INET) {
2010 } else if (connp->conn_proto == IPPROTO_UDP ||
2011 connp->conn_proto == IPPROTO_TCP ||
2012 connp->conn_proto == IPPROTO_SCTP) {
2021 if (connp->conn_family == AF_INET6 &&
2022 connp->conn_proto == IPPROTO_ICMPV6) {
2028 connp->conn_proto != IPPROTO_ICMPV6) {
2033 mutex_exit(&connp->conn_lock);
2040 if (connp->conn_proto == IPPROTO_SCTP)
2063 if (connp->conn_family != AF_INET)
2069 mutex_enter(&connp->conn_lock);
2075 mutex_exit(&connp->conn_lock);
2082 if (connp->conn_family != AF_INET6)
2093 if (connp->conn_proto == IPPROTO_ICMPV6 ||
2104 mutex_enter(&connp->conn_lock);
2114 mutex_exit(&connp->conn_lock);
2123 if (connp->conn_family != AF_INET6)
2125 if (connp->conn_proto != IPPROTO_ICMPV6)
2137 mutex_enter(&connp->conn_lock);
2150 mutex_exit(&connp->conn_lock);
2156 mutex_exit(&connp->conn_lock);
2170 icmp_opt_set(conn_t *connp, uint_t optset_context, int level, int name,
2174 icmp_t *icmp = connp->conn_icmp;
2228 ASSERT(coa->coa_connp == connp);
2234 coas.coa_connp = connp;
2236 coas.coa_ixa = conn_get_ixa(connp, B_TRUE);
2241 coas.coa_ipp = &connp->conn_xmit_ipp;
2287 mutex_enter(&connp->conn_lock);
2288 connp->conn_v6lastdst = ipv6_all_zeros;
2291 &connp->conn_faddr_v6, &nexthop);
2292 saddr = connp->conn_saddr_v6;
2293 faddr = connp->conn_faddr_v6;
2294 fport = connp->conn_fport;
2295 mutex_exit(&connp->conn_lock);
2299 (void) ip_attr_connect(connp, coa->coa_ixa,
2313 mutex_enter(&connp->conn_lock);
2314 if (!IN6_IS_ADDR_UNSPECIFIED(&connp->conn_faddr_v6) &&
2315 !IN6_IS_ADDR_V4MAPPED_ANY(&connp->conn_faddr_v6)) {
2316 err = icmp_build_hdr_template(connp,
2317 &connp->conn_saddr_v6, &connp->conn_faddr_v6,
2318 connp->conn_flowinfo);
2320 mutex_exit(&connp->conn_lock);
2324 connp->conn_v6lastdst = ipv6_all_zeros;
2326 mutex_exit(&connp->conn_lock);
2329 (void) proto_set_rx_hiwat(connp->conn_rq, connp,
2330 connp->conn_rcvbuf);
2332 if ((coa->coa_changed & COA_SNDBUF_CHANGED) && !IPCL_IS_NONSTR(connp)) {
2333 connp->conn_wq->q_hiwat = connp->conn_sndbuf;
2339 mutex_enter(&connp->conn_lock);
2340 wroff = connp->conn_ht_iphc_allocated + is->is_wroff_extra;
2341 if (wroff > connp->conn_wroff) {
2342 connp->conn_wroff = wroff;
2343 mutex_exit(&connp->conn_lock);
2344 (void) proto_set_tx_wroff(connp->conn_rq, connp, wroff);
2346 mutex_exit(&connp->conn_lock);
2361 conn_t *connp = Q_TO_CONN(q);
2364 error = icmp_opt_set(connp, optset_context, level, name, inlen, invalp,
2376 icmp_prepend_hdr(conn_t *connp, ip_xmit_attr_t *ixa, const ip_pkt_t *ipp,
2381 icmp_stack_t *is = connp->conn_netstack->netstack_icmp;
2386 mp = conn_prepend_hdr(ixa, ipp, v6src, v6dst, connp->conn_proto,
2423 if (connp->conn_proto == IPPROTO_ICMPV6) {
2458 icmp_build_hdr_template(conn_t *connp, const in6_addr_t *v6src,
2463 ASSERT(MUTEX_HELD(&connp->conn_lock));
2468 connp->conn_v6lastdst = ipv6_all_zeros;
2470 error = conn_build_hdr_template(connp, 0, 0, v6src, v6dst, flowinfo);
2512 icmp_ulp_recv(conn_t *connp, mblk_t *mp, uint_t len)
2514 if (IPCL_IS_NONSTR(connp)) {
2515 icmp_t *icmp = connp->conn_icmp;
2519 if ((*connp->conn_upcalls->su_recv)
2520 (connp->conn_upper_handle, mp, len, 0, &error, NULL) < 0) {
2526 if ((*connp->conn_upcalls->su_recv)
2527 (connp->conn_upper_handle, NULL, 0, 0,
2531 connp->conn_flow_cntrld =
2541 putnext(connp->conn_rq, mp);
2546 putnext(connp->conn_rq, mp);
2559 conn_t *connp = (conn_t *)arg1;
2575 ASSERT(connp->conn_flags & IPCL_RAWIPCONN);
2577 icmp = connp->conn_icmp;
2591 mutex_enter(&connp->conn_lock);
2592 recv_ancillary = connp->conn_recv_ancillary;
2593 mutex_exit(&connp->conn_lock);
2648 ASSERT(connp->conn_family == AF_INET);
2662 udi_size += conn_recvancillary_size(connp,
2695 conn_recvancillary_add(connp, recv_ancillary, ira,
2707 ASSERT(connp->conn_family == AF_INET6);
2742 mutex_enter(&connp->conn_lock);
2751 mutex_exit(&connp->conn_lock);
2756 if (connp->conn_ixa->ixa_flags & IXAF_SET_RAW_CKSUM) {
2765 sum = htons(connp->conn_proto + remlen)
2775 mutex_exit(&connp->conn_lock);
2781 mutex_exit(&connp->conn_lock);
2786 udi_size += conn_recvancillary_size(connp,
2820 IPCL_ZONEID(connp), is->is_netstack);
2823 conn_recvancillary_add(connp, recv_ancillary, ira,
2833 icmp_ulp_recv(connp, mp1, pkt_len);
2845 conn_t *connp = Q_TO_CONN(q);
2846 icmp_stack_t *is = connp->conn_netstack->netstack_icmp;
2936 rawip_do_unbind(conn_t *connp)
2938 icmp_t *icmp = connp->conn_icmp;
2940 mutex_enter(&connp->conn_lock);
2943 mutex_exit(&connp->conn_lock);
2946 connp->conn_saddr_v6 = ipv6_all_zeros;
2947 connp->conn_bound_addr_v6 = ipv6_all_zeros;
2948 connp->conn_laddr_v6 = ipv6_all_zeros;
2949 connp->conn_mcbc_bind = B_FALSE;
2950 connp->conn_lport = 0;
2951 connp->conn_fport = 0;
2953 connp->conn_faddr_v6 = ipv6_all_zeros;
2954 connp->conn_v6lastdst = ipv6_all_zeros;
2958 (void) icmp_build_hdr_template(connp, &connp->conn_saddr_v6,
2959 &connp->conn_faddr_v6, connp->conn_flowinfo);
2960 mutex_exit(&connp->conn_lock);
2962 ip_unbind(connp);
2973 conn_t *connp = Q_TO_CONN(q);
2977 error = rawip_do_unbind(connp);
3013 icmp_output_hdrincl(conn_t *connp, mblk_t *mp, cred_t *cr, pid_t pid)
3015 icmp_t *icmp = connp->conn_icmp;
3035 ixa = conn_get_ixa_exclusive(connp);
3061 ixa->ixa_cred = connp->conn_cred; /* Restore */
3062 ixa->ixa_cpid = connp->conn_cpid;
3068 mutex_enter(&connp->conn_lock);
3069 error = ip_pkt_copy(&connp->conn_xmit_ipp, ipp, KM_NOSLEEP);
3070 mutex_exit(&connp->conn_lock);
3126 error = ip_attr_connect(connp, ixa, &v6src, &v6dst, &v6nexthop,
3127 connp->conn_fport, &v6src, NULL, IPDF_ALLOW_MCBC | IPDF_VERIFY_DST |
3188 error = conn_update_label(connp, ixa, &v6dst, ipp);
3206 mp = icmp_prepend_hdr(connp, ixa, ipp, &v6src, &v6dst, 0, mp, &error);
3267 mp = ip_output_attach_policy(mp, ipha, NULL, connp, ixa);
3284 (void) ixa_check_drain_insert(connp, ixa);
3297 ixa->ixa_cred = connp->conn_cred; /* Restore */
3298 ixa->ixa_cpid = connp->conn_cpid;
3306 icmp_output_attach_policy(mblk_t *mp, conn_t *connp, ip_xmit_attr_t *ixa)
3321 return (ip_output_attach_policy(mp, ipha, ip6h, connp, ixa));
3332 icmp_output_ancillary(conn_t *connp, sin_t *sin, sin6_t *sin6, mblk_t *mp,
3335 icmp_t *icmp = connp->conn_icmp;
3357 ixa = conn_get_ixa_exclusive(connp);
3379 ixa->ixa_cred = connp->conn_cred; /* Restore */
3380 ixa->ixa_cpid = connp->conn_cpid;
3386 mutex_enter(&connp->conn_lock);
3387 error = ip_pkt_copy(&connp->conn_xmit_ipp, ipp, KM_NOSLEEP);
3388 mutex_exit(&connp->conn_lock);
3400 coa->coa_connp = connp;
3407 error = process_auxiliary_options(connp, msg->msg_control,
3414 error = tpi_optcom_buf(connp->conn_wq, tudr_mp,
3429 mutex_enter(&connp->conn_lock);
3439 v6src = connp->conn_saddr_v6;
3466 if (!ip_srcid_find_id(srcid, &v6src, IPCL_ZONEID(connp),
3467 v4mapped, connp->conn_netstack)) {
3469 mutex_exit(&connp->conn_lock);
3476 v6dst = connp->conn_faddr_v6;
3477 flowinfo = connp->conn_flowinfo;
3479 mutex_exit(&connp->conn_lock);
3512 error = ip_attr_connect(connp, ixa, &v6src, &v6dst, &v6nexthop, dstport,
3572 error = conn_update_label(connp, ixa, &v6dst, ipp);
3579 mp = icmp_prepend_hdr(connp, ixa, ipp, &v6src, &v6dst, flowinfo, mp,
3594 mp = icmp_output_attach_policy(mp, connp, ixa);
3605 if (!connp->conn_unspec_src)
3612 (void) ixa_check_drain_insert(connp, ixa);
3623 mutex_enter(&connp->conn_lock);
3628 if (connp->conn_mcbc_bind)
3629 connp->conn_saddr_v6 = ipv6_all_zeros;
3631 connp->conn_saddr_v6 = connp->conn_bound_addr_v6;
3632 connp->conn_v6lastdst = ipv6_all_zeros;
3633 mutex_exit(&connp->conn_lock);
3638 ixa->ixa_cred = connp->conn_cred; /* Restore */
3639 ixa->ixa_cpid = connp->conn_cpid;
3651 icmp_output_connected(conn_t *connp, mblk_t *mp, cred_t *cr, pid_t pid)
3653 icmp_t *icmp = connp->conn_icmp;
3663 ixa = conn_get_ixa(connp, B_FALSE);
3685 mutex_enter(&connp->conn_lock);
3686 mp = icmp_prepend_header_template(connp, ixa, mp,
3687 &connp->conn_saddr_v6, connp->conn_flowinfo, &error);
3691 mutex_exit(&connp->conn_lock);
3693 ixa->ixa_cred = connp->conn_cred; /* Restore */
3694 ixa->ixa_cpid = connp->conn_cpid;
3703 mp = icmp_output_attach_policy(mp, connp, ixa);
3705 mutex_exit(&connp->conn_lock);
3708 ixa->ixa_cred = connp->conn_cred; /* Restore */
3709 ixa->ixa_cpid = connp->conn_cpid;
3724 saddr = connp->conn_saddr_v6;
3725 faddr = connp->conn_faddr_v6;
3726 fport = connp->conn_fport;
3727 ip_attr_nexthop(&connp->conn_xmit_ipp, ixa, &faddr, &nexthop);
3728 mutex_exit(&connp->conn_lock);
3730 error = ip_attr_connect(connp, ixa, &saddr, &faddr, &nexthop,
3765 ixa->ixa_cred = connp->conn_cred; /* Restore */
3766 ixa->ixa_cpid = connp->conn_cpid;
3774 mutex_exit(&connp->conn_lock);
3786 (void) ixa_check_drain_insert(connp, ixa);
3798 ixa->ixa_cred = connp->conn_cred; /* Restore */
3799 ixa->ixa_cpid = connp->conn_cpid;
3811 icmp_output_lastdst(conn_t *connp, mblk_t *mp, cred_t *cr, pid_t pid,
3814 icmp_t *icmp = connp->conn_icmp;
3819 ASSERT(MUTEX_HELD(&connp->conn_lock));
3838 mp = icmp_prepend_header_template(connp, ixa, mp,
3839 &connp->conn_v6lastsrc, connp->conn_lastflowinfo, &error);
3843 mutex_exit(&connp->conn_lock);
3845 ixa->ixa_cred = connp->conn_cred; /* Restore */
3846 ixa->ixa_cpid = connp->conn_cpid;
3855 mp = icmp_output_attach_policy(mp, connp, ixa);
3857 mutex_exit(&connp->conn_lock);
3860 ixa->ixa_cred = connp->conn_cred; /* Restore */
3861 ixa->ixa_cpid = connp->conn_cpid;
3876 lastsrc = connp->conn_v6lastsrc;
3877 lastdst = connp->conn_v6lastdst;
3878 lastport = connp->conn_lastdstport;
3879 ip_attr_nexthop(&connp->conn_xmit_ipp, ixa, &lastdst, &nexthop);
3880 mutex_exit(&connp->conn_lock);
3882 error = ip_attr_connect(connp, ixa, &lastsrc, &lastdst,
3917 ixa->ixa_cred = connp->conn_cred; /* Restore */
3918 ixa->ixa_cpid = connp->conn_cpid;
3926 mutex_exit(&connp->conn_lock);
3937 (void) ixa_check_drain_insert(connp, ixa);
3948 mutex_enter(&connp->conn_lock);
3953 if (connp->conn_mcbc_bind)
3954 connp->conn_saddr_v6 = ipv6_all_zeros;
3956 connp->conn_saddr_v6 = connp->conn_bound_addr_v6;
3957 connp->conn_v6lastdst = ipv6_all_zeros;
3958 mutex_exit(&connp->conn_lock);
3962 ixa->ixa_cred = connp->conn_cred; /* Restore */
3963 ixa->ixa_cpid = connp->conn_cpid;
3978 icmp_prepend_header_template(conn_t *connp, ip_xmit_attr_t *ixa, mblk_t *mp,
3981 icmp_t *icmp = connp->conn_icmp;
3990 ASSERT(MUTEX_HELD(&connp->conn_lock));
3995 copylen = connp->conn_ht_iphc_len;
4021 bcopy(connp->conn_ht_iphc, iph, copylen);
4022 ip_hdr_length = (uint_t)(connp->conn_ht_ulp - connp->conn_ht_iphc);
4038 cksum += connp->conn_sum;
4042 ipp = &connp->conn_xmit_ipp;
4080 if (connp->conn_proto == IPPROTO_ICMPV6) {
4125 conn_t *connp = Q_TO_CONN(q);
4126 icmp_t *icmp = connp->conn_icmp;
4202 switch (connp->conn_family) {
4225 if (IN6_IS_ADDR_V4MAPPED(&connp->conn_saddr_v6)) {
4239 !conn_same_as_last_v6(connp, sin6)) {
4243 error = icmp_output_ancillary(connp, NULL, sin6,
4254 ixa = conn_get_ixa(connp, B_FALSE);
4259 mutex_enter(&connp->conn_lock);
4261 if (conn_same_as_last_v6(connp, sin6) &&
4262 connp->conn_lastsrcid == srcid &&
4265 error = icmp_output_lastdst(connp, data_mp, cr,
4269 error = icmp_output_newdst(connp, data_mp, NULL,
4272 ASSERT(MUTEX_NOT_HELD(&connp->conn_lock));
4299 error = icmp_output_hdrincl(connp, data_mp, cr, pid);
4315 !conn_same_as_last_v4(connp, sin)) {
4319 error = icmp_output_ancillary(connp, sin, NULL,
4330 ixa = conn_get_ixa(connp, B_FALSE);
4335 mutex_enter(&connp->conn_lock);
4337 if (conn_same_as_last_v4(connp, sin) &&
4340 error = icmp_output_lastdst(connp, data_mp, cr,
4344 error = icmp_output_newdst(connp, data_mp, sin,
4347 ASSERT(MUTEX_NOT_HELD(&connp->conn_lock));
4375 icmp_output_newdst(conn_t *connp, mblk_t *data_mp, sin_t *sin, sin6_t *sin6,
4378 icmp_t *icmp = connp->conn_icmp;
4390 ASSERT(MUTEX_HELD(&connp->conn_lock));
4413 mutex_exit(&connp->conn_lock);
4430 v6src = connp->conn_saddr_v6;
4458 if (!ip_srcid_find_id(srcid, &v6src, IPCL_ZONEID(connp),
4459 v4mapped, connp->conn_netstack)) {
4461 mutex_exit(&connp->conn_lock);
4468 if (connp->conn_xmit_ipp.ipp_fields & IPPF_ADDR) {
4469 ip_pkt_t *ipp = &connp->conn_xmit_ipp;
4490 ip_attr_nexthop(&connp->conn_xmit_ipp, ixa, &v6dst, &v6nexthop);
4491 mutex_exit(&connp->conn_lock);
4493 error = ip_attr_connect(connp, ixa, &v6src, &v6dst, &v6nexthop, dstport,
4530 mutex_enter(&connp->conn_lock);
4538 mutex_exit(&connp->conn_lock);
4557 if (connp->conn_mlp_type != mlptSingle) {
4558 mutex_exit(&connp->conn_lock);
4574 error = conn_update_label(connp, ixa, &v6dst,
4575 &connp->conn_xmit_ipp);
4577 mutex_exit(&connp->conn_lock);
4581 error = icmp_build_hdr_template(connp, &v6src, &v6dst,
4584 mutex_exit(&connp->conn_lock);
4587 } else if (connp->conn_xmit_ipp.ipp_fields &
4589 IN6_IS_ADDR_UNSPECIFIED(&connp->conn_v6lastdst)) {
4591 error = icmp_build_hdr_template(connp, &v6src, &v6dst,
4594 mutex_exit(&connp->conn_lock);
4600 ipha_t *ipha = (ipha_t *)connp->conn_ht_iphc;
4611 ip6_t *ip6h = (ip6_t *)connp->conn_ht_iphc;
4620 oldixa = conn_replace_ixa(connp, ixa);
4621 connp->conn_v6lastdst = v6dst;
4622 connp->conn_lastflowinfo = flowinfo;
4623 connp->conn_lastscopeid = ixa->ixa_scopeid;
4624 connp->conn_lastsrcid = srcid;
4626 connp->conn_v6lastsrc = v6src;
4628 data_mp = icmp_prepend_header_template(connp, ixa, data_mp, &v6src,
4632 mutex_exit(&connp->conn_lock);
4642 data_mp = icmp_output_attach_policy(data_mp, connp, ixa);
4659 (void) ixa_check_drain_insert(connp, ixa);
4670 mutex_enter(&connp->conn_lock);
4675 if (connp->conn_mcbc_bind)
4676 connp->conn_saddr_v6 = ipv6_all_zeros;
4678 connp->conn_saddr_v6 = connp->conn_bound_addr_v6;
4679 connp->conn_v6lastdst = ipv6_all_zeros;
4680 mutex_exit(&connp->conn_lock);
4685 ixa->ixa_cred = connp->conn_cred; /* Restore */
4686 ixa->ixa_cpid = connp->conn_cpid;
4692 ixa->ixa_cred = connp->conn_cred; /* Restore */
4693 ixa->ixa_cpid = connp->conn_cpid;
4716 conn_t *connp = Q_TO_CONN(q);
4717 icmp_t *icmp = connp->conn_icmp;
4872 conn_t *connp = Q_TO_CONN(q);
4873 icmp_t *icmp = connp->conn_icmp;
4922 if (connp->conn_family == AF_INET)
4951 (void) conn_getsockname(connp, (struct sockaddr *)mp1->b_wptr,
4955 (void) conn_getpeername(connp, (struct sockaddr *)mp1->b_wptr,
5112 conn_t *connp = (conn_t *)proto_handle;
5120 error = rawip_do_unbind(connp);
5122 error = rawip_do_bind(connp, sa, len);
5134 rawip_implicit_bind(conn_t *connp)
5142 if (connp->conn_family == AF_INET) {
5149 ASSERT(connp->conn_family == AF_INET6);
5157 error = rawip_do_bind(connp, (struct sockaddr *)&sin6addr, len);
5163 rawip_unbind(conn_t *connp)
5167 error = rawip_do_unbind(connp);
5185 conn_t *connp = (conn_t *)proto_handle;
5186 icmp_t *icmp = connp->conn_icmp;
5202 error = icmp_disconnect(connp);
5206 error = proto_verify_ip_addr(connp->conn_family, sa, len);
5212 error = rawip_implicit_bind(connp);
5226 connp->conn_dgram_errind = B_TRUE;
5228 error = rawip_do_connect(connp, sa, len, cr, pid);
5232 unbind_err = rawip_unbind(connp);
5238 (*connp->conn_upcalls->su_connected)(connp->conn_upper_handle,
5252 conn_t *connp = (conn_t *)proto_handle;
5262 icmp = connp->conn_icmp;
5269 connp->conn_dev = (dev_t)RD(q)->q_ptr;
5270 connp->conn_minor_arena = WR(q)->q_ptr;
5272 RD(q)->q_ptr = WR(q)->q_ptr = connp;
5276 connp->conn_rq = RD(q);
5277 connp->conn_wq = WR(q);
5284 stropt->so_wroff = connp->conn_wroff;
5285 stropt->so_hiwat = connp->conn_rcvbuf;
5291 ip_free_helper_stream(connp);
5299 (void) rawip_getsockname((sock_lower_handle_t)connp,
5301 error = rawip_getpeername((sock_lower_handle_t)connp,
5306 if (connp->conn_dgram_errind)
5308 if (connp->conn_ixa->ixa_flags & IXAF_DONTROUTE)
5311 mp = (*quiesced_cb)(connp->conn_upper_handle, arg, &tca,
5337 mutex_enter(&connp->conn_lock);
5338 connp->conn_flags &= ~IPCL_NONSTR;
5339 mutex_exit(&connp->conn_lock);
5346 ASSERT(connp->conn_ref >= 1);
5356 conn_t *connp;
5363 connp = rawip_do_open(family, credp, errorp, flags);
5364 if (connp != NULL) {
5365 connp->conn_flags |= IPCL_NONSTR;
5367 mutex_enter(&connp->conn_lock);
5368 connp->conn_state_flags &= ~CONN_INCIPIENT;
5369 mutex_exit(&connp->conn_lock);
5376 return ((sock_lower_handle_t)connp);
5385 conn_t *connp = (conn_t *)proto_handle;
5391 connp->conn_upcalls = sock_upcalls;
5392 connp->conn_upper_handle = sock_handle;
5396 sopp.sopp_wroff = connp->conn_wroff;
5397 sopp.sopp_rxhiwat = connp->conn_rcvbuf;
5398 sopp.sopp_rxlowat = connp->conn_rcvlowat;
5404 (*connp->conn_upcalls->su_set_proto_props)
5405 (connp->conn_upper_handle, &sopp);
5407 icmp_bind_proto(connp->conn_icmp);
5415 conn_t *connp = (conn_t *)proto_handle;
5416 icmp_t *icmp = connp->conn_icmp;
5422 mutex_enter(&connp->conn_lock);
5426 error = conn_getpeername(connp, sa, salenp);
5427 mutex_exit(&connp->conn_lock);
5436 conn_t *connp = (conn_t *)proto_handle;
5442 mutex_enter(&connp->conn_lock);
5443 error = conn_getsockname(connp, sa, salenp);
5444 mutex_exit(&connp->conn_lock);
5452 conn_t *connp = (conn_t *)proto_handle;
5473 error = icmp_opt_set(connp, SETFN_OPTCOM_NEGOTIATE, level,
5487 conn_t *connp = (conn_t *)proto_handle;
5508 len = icmp_opt_get(connp, level, option_name, optvalp_buf);
5530 conn_t *connp = (conn_t *)proto_handle;
5535 (void) rawip_do_close(connp);
5543 conn_t *connp = (conn_t *)proto_handle;
5550 (*connp->conn_upcalls->su_opctl)(connp->conn_upper_handle,
5554 (*connp->conn_upcalls->su_opctl)(connp->conn_upper_handle,
5562 conn_t *connp = (conn_t *)proto_handle;
5563 icmp_t *icmp = connp->conn_icmp;
5566 connp->conn_flow_cntrld = B_FALSE;
5574 conn_t *connp = (conn_t *)proto_handle;
5585 if (connp->conn_helper_info == NULL) {
5586 icmp_stack_t *is = connp->conn_icmp->icmp_is;
5593 error = ip_create_helper_stream(connp, is->is_ldi_ident);
5615 error = ldi_ioctl(connp->conn_helper_info->iphs_handle,
5629 conn_t *connp = (conn_t *)proto_handle;
5630 icmp_t *icmp = connp->conn_icmp;
5643 error = rawip_implicit_bind(connp);
5658 ASSERT(connp->conn_ipversion == IPV4_VERSION);
5666 error = icmp_output_hdrincl(connp, mp, cr, pid);
5680 error = icmp_output_ancillary(connp, NULL, NULL, mp,
5683 error = icmp_output_connected(connp, mp, cr, pid);
5694 error = proto_verify_ip_addr(connp->conn_family,
5700 switch (connp->conn_family) {
5718 if (IN6_IS_ADDR_V4MAPPED(&connp->conn_saddr_v6)) {
5733 ixa = conn_get_ixa(connp, B_FALSE);
5741 mutex_enter(&connp->conn_lock);
5753 mutex_exit(&connp->conn_lock);
5761 mutex_exit(&connp->conn_lock);
5763 error = icmp_output_ancillary(connp, NULL, sin6, mp,
5765 } else if (conn_same_as_last_v6(connp, sin6) &&
5766 connp->conn_lastsrcid == srcid &&
5769 error = icmp_output_lastdst(connp, mp, cr, pid, ixa);
5772 error = icmp_output_newdst(connp, mp, NULL, sin6, cr,
5775 ASSERT(MUTEX_NOT_HELD(&connp->conn_lock));
5792 ixa = conn_get_ixa(connp, B_FALSE);
5800 mutex_enter(&connp->conn_lock);
5810 mutex_exit(&connp->conn_lock);
5819 mutex_exit(&connp->conn_lock);
5821 error = icmp_output_ancillary(connp, sin, NULL, mp,
5823 } else if (conn_same_as_last_v4(connp, sin) &&
5826 error = icmp_output_lastdst(connp, mp, cr, pid, ixa);
5829 error = icmp_output_newdst(connp, mp, sin, NULL, cr,
5832 ASSERT(MUTEX_NOT_HELD(&connp->conn_lock));