3446 } else if (sin6 != NULL) {
3447 boolean_t v4mapped;
3448 uint_t srcid;
3449
3450 v6dst = sin6->sin6_addr;
3451 dstport = sin6->sin6_port;
3452 flowinfo = sin6->sin6_flowinfo;
3453 srcid = sin6->__sin6_src_id;
3454 if (IN6_IS_ADDR_LINKSCOPE(&v6dst) && sin6->sin6_scope_id != 0) {
3455 ixa->ixa_scopeid = sin6->sin6_scope_id;
3456 ixa->ixa_flags |= IXAF_SCOPEID_SET;
3457 } else {
3458 ixa->ixa_flags &= ~IXAF_SCOPEID_SET;
3459 }
3460 v4mapped = IN6_IS_ADDR_V4MAPPED(&v6dst);
3461 if (v4mapped)
3462 ixa->ixa_flags |= IXAF_IS_IPV4;
3463 else
3464 ixa->ixa_flags &= ~IXAF_IS_IPV4;
3465 if (srcid != 0 && IN6_IS_ADDR_UNSPECIFIED(&v6src)) {
3466 if (ip_srcid_find_id(srcid, &v6src, IPCL_ZONEID(connp),
3467 v4mapped, connp->conn_netstack)) {
3468 /* Mismatched v4mapped/v6 specified by srcid. */
3469 mutex_exit(&connp->conn_lock);
3470 error = EADDRNOTAVAIL;
3471 goto failed; /* Does freemsg() and mib. */
3472 }
3473 }
3474 } else {
3475 /* Connected case */
3476 v6dst = connp->conn_faddr_v6;
3477 flowinfo = connp->conn_flowinfo;
3478 }
3479 mutex_exit(&connp->conn_lock);
3480 /* Handle IP_PKTINFO/IPV6_PKTINFO setting source address. */
3481 if (ipp->ipp_fields & IPPF_ADDR) {
3482 if (ixa->ixa_flags & IXAF_IS_IPV4) {
3483 if (IN6_IS_ADDR_V4MAPPED(&ipp->ipp_addr))
3484 v6src = ipp->ipp_addr;
3485 } else {
3486 if (!IN6_IS_ADDR_V4MAPPED(&ipp->ipp_addr))
4438 ixa->ixa_flags |= IXAF_IS_IPV4;
4439 } else {
4440 boolean_t v4mapped;
4441
4442 v6dst = sin6->sin6_addr;
4443 dstport = sin6->sin6_port;
4444 flowinfo = sin6->sin6_flowinfo;
4445 srcid = sin6->__sin6_src_id;
4446 if (IN6_IS_ADDR_LINKSCOPE(&v6dst) && sin6->sin6_scope_id != 0) {
4447 ixa->ixa_scopeid = sin6->sin6_scope_id;
4448 ixa->ixa_flags |= IXAF_SCOPEID_SET;
4449 } else {
4450 ixa->ixa_flags &= ~IXAF_SCOPEID_SET;
4451 }
4452 v4mapped = IN6_IS_ADDR_V4MAPPED(&v6dst);
4453 if (v4mapped)
4454 ixa->ixa_flags |= IXAF_IS_IPV4;
4455 else
4456 ixa->ixa_flags &= ~IXAF_IS_IPV4;
4457 if (srcid != 0 && IN6_IS_ADDR_UNSPECIFIED(&v6src)) {
4458 if (ip_srcid_find_id(srcid, &v6src, IPCL_ZONEID(connp),
4459 v4mapped, connp->conn_netstack)) {
4460 /* Mismatched v4mapped/v6 specified by srcid. */
4461 mutex_exit(&connp->conn_lock);
4462 error = EADDRNOTAVAIL;
4463 goto ud_error;
4464 }
4465 }
4466 }
4467 /* Handle IP_PKTINFO/IPV6_PKTINFO setting source address. */
4468 if (connp->conn_xmit_ipp.ipp_fields & IPPF_ADDR) {
4469 ip_pkt_t *ipp = &connp->conn_xmit_ipp;
4470
4471 if (ixa->ixa_flags & IXAF_IS_IPV4) {
4472 if (IN6_IS_ADDR_V4MAPPED(&ipp->ipp_addr))
4473 v6src = ipp->ipp_addr;
4474 } else {
4475 if (!IN6_IS_ADDR_V4MAPPED(&ipp->ipp_addr))
4476 v6src = ipp->ipp_addr;
4477 }
4478 }
|
3446 } else if (sin6 != NULL) {
3447 boolean_t v4mapped;
3448 uint_t srcid;
3449
3450 v6dst = sin6->sin6_addr;
3451 dstport = sin6->sin6_port;
3452 flowinfo = sin6->sin6_flowinfo;
3453 srcid = sin6->__sin6_src_id;
3454 if (IN6_IS_ADDR_LINKSCOPE(&v6dst) && sin6->sin6_scope_id != 0) {
3455 ixa->ixa_scopeid = sin6->sin6_scope_id;
3456 ixa->ixa_flags |= IXAF_SCOPEID_SET;
3457 } else {
3458 ixa->ixa_flags &= ~IXAF_SCOPEID_SET;
3459 }
3460 v4mapped = IN6_IS_ADDR_V4MAPPED(&v6dst);
3461 if (v4mapped)
3462 ixa->ixa_flags |= IXAF_IS_IPV4;
3463 else
3464 ixa->ixa_flags &= ~IXAF_IS_IPV4;
3465 if (srcid != 0 && IN6_IS_ADDR_UNSPECIFIED(&v6src)) {
3466 if (!ip_srcid_find_id(srcid, &v6src, IPCL_ZONEID(connp),
3467 v4mapped, connp->conn_netstack)) {
3468 /* Mismatched v4mapped/v6 specified by srcid. */
3469 mutex_exit(&connp->conn_lock);
3470 error = EADDRNOTAVAIL;
3471 goto failed; /* Does freemsg() and mib. */
3472 }
3473 }
3474 } else {
3475 /* Connected case */
3476 v6dst = connp->conn_faddr_v6;
3477 flowinfo = connp->conn_flowinfo;
3478 }
3479 mutex_exit(&connp->conn_lock);
3480 /* Handle IP_PKTINFO/IPV6_PKTINFO setting source address. */
3481 if (ipp->ipp_fields & IPPF_ADDR) {
3482 if (ixa->ixa_flags & IXAF_IS_IPV4) {
3483 if (IN6_IS_ADDR_V4MAPPED(&ipp->ipp_addr))
3484 v6src = ipp->ipp_addr;
3485 } else {
3486 if (!IN6_IS_ADDR_V4MAPPED(&ipp->ipp_addr))
4438 ixa->ixa_flags |= IXAF_IS_IPV4;
4439 } else {
4440 boolean_t v4mapped;
4441
4442 v6dst = sin6->sin6_addr;
4443 dstport = sin6->sin6_port;
4444 flowinfo = sin6->sin6_flowinfo;
4445 srcid = sin6->__sin6_src_id;
4446 if (IN6_IS_ADDR_LINKSCOPE(&v6dst) && sin6->sin6_scope_id != 0) {
4447 ixa->ixa_scopeid = sin6->sin6_scope_id;
4448 ixa->ixa_flags |= IXAF_SCOPEID_SET;
4449 } else {
4450 ixa->ixa_flags &= ~IXAF_SCOPEID_SET;
4451 }
4452 v4mapped = IN6_IS_ADDR_V4MAPPED(&v6dst);
4453 if (v4mapped)
4454 ixa->ixa_flags |= IXAF_IS_IPV4;
4455 else
4456 ixa->ixa_flags &= ~IXAF_IS_IPV4;
4457 if (srcid != 0 && IN6_IS_ADDR_UNSPECIFIED(&v6src)) {
4458 if (!ip_srcid_find_id(srcid, &v6src, IPCL_ZONEID(connp),
4459 v4mapped, connp->conn_netstack)) {
4460 /* Mismatched v4mapped/v6 specified by srcid. */
4461 mutex_exit(&connp->conn_lock);
4462 error = EADDRNOTAVAIL;
4463 goto ud_error;
4464 }
4465 }
4466 }
4467 /* Handle IP_PKTINFO/IPV6_PKTINFO setting source address. */
4468 if (connp->conn_xmit_ipp.ipp_fields & IPPF_ADDR) {
4469 ip_pkt_t *ipp = &connp->conn_xmit_ipp;
4470
4471 if (ixa->ixa_flags & IXAF_IS_IPV4) {
4472 if (IN6_IS_ADDR_V4MAPPED(&ipp->ipp_addr))
4473 v6src = ipp->ipp_addr;
4474 } else {
4475 if (!IN6_IS_ADDR_V4MAPPED(&ipp->ipp_addr))
4476 v6src = ipp->ipp_addr;
4477 }
4478 }
|