Print this page
13175 Add support for IP_RECVTOS
13182 CMSG_ macros should have man pages
Change-ID: I784aa36cfd3c17e3cccbf1fd329fa7e69b663ef9
*** 19,28 ****
--- 19,29 ----
* CDDL HEADER END
*/
/*
* Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
*/
/* Copyright (c) 1990 Mentat Inc. */
#include <sys/types.h>
#include <sys/stream.h>
*** 233,247 ****
sizeof (timestruc_t) + _POINTER_ALIGNMENT;
IP_STAT(ipst, conn_in_timestamp);
}
/*
* If IP_RECVTTL is set allocate the appropriate sized buffer
*/
if (recv_ancillary.crb_recvttl &&
(ira->ira_flags & IRAF_IS_IPV4)) {
! ancil_size += sizeof (struct T_opthdr) + sizeof (uint8_t);
IP_STAT(ipst, conn_in_recvttl);
}
return (ancil_size);
}
--- 234,259 ----
sizeof (timestruc_t) + _POINTER_ALIGNMENT;
IP_STAT(ipst, conn_in_timestamp);
}
/*
+ * If IP_RECVTOS is set allocate the appropriately sized buffer
+ */
+ if (recv_ancillary.crb_recvtos &&
+ (ira->ira_flags & IRAF_IS_IPV4)) {
+ ancil_size += sizeof (struct T_opthdr) +
+ P2ROUNDUP(sizeof (uint8_t), __TPI_ALIGN_SIZE);
+ IP_STAT(ipst, conn_in_recvtos);
+ }
+
+ /*
* If IP_RECVTTL is set allocate the appropriate sized buffer
*/
if (recv_ancillary.crb_recvttl &&
(ira->ira_flags & IRAF_IS_IPV4)) {
! ancil_size += sizeof (struct T_opthdr) +
! P2ROUNDUP(sizeof (uint8_t), __TPI_ALIGN_SIZE);
IP_STAT(ipst, conn_in_recvttl);
}
return (ancil_size);
}
*** 547,579 ****
gethrestime((timestruc_t *)ancil_buf);
ancil_buf = (uchar_t *)toh + toh->len;
ancil_size -= toh->len;
}
! /*
! * CAUTION:
! * Due to aligment issues
! * Processing of IP_RECVTTL option
! * should always be the last. Adding
! * any option processing after this will
! * cause alignment panic.
! */
if (recv_ancillary.crb_recvttl &&
(ira->ira_flags & IRAF_IS_IPV4)) {
struct T_opthdr *toh;
uint8_t *dstptr;
toh = (struct T_opthdr *)ancil_buf;
toh->level = IPPROTO_IP;
toh->name = IP_RECVTTL;
! toh->len = sizeof (struct T_opthdr) + sizeof (uint8_t);
toh->status = 0;
ancil_buf += sizeof (struct T_opthdr);
dstptr = (uint8_t *)ancil_buf;
*dstptr = ipp->ipp_hoplimit;
! ancil_buf += sizeof (uint8_t);
ancil_size -= toh->len;
}
/* Consumed all of allocated space */
ASSERT(ancil_size == 0);
--- 559,604 ----
gethrestime((timestruc_t *)ancil_buf);
ancil_buf = (uchar_t *)toh + toh->len;
ancil_size -= toh->len;
}
! if (recv_ancillary.crb_recvtos &&
! (ira->ira_flags & IRAF_IS_IPV4)) {
! struct T_opthdr *toh;
! uint8_t *dstptr;
!
! toh = (struct T_opthdr *)ancil_buf;
! toh->level = IPPROTO_IP;
! toh->name = IP_RECVTOS;
! toh->len = sizeof (struct T_opthdr) +
! P2ROUNDUP(sizeof (uint8_t), __TPI_ALIGN_SIZE);
! toh->status = 0;
! ancil_buf += sizeof (struct T_opthdr);
! dstptr = (uint8_t *)ancil_buf;
! *dstptr = ipp->ipp_type_of_service;
! ancil_buf = (uchar_t *)toh + toh->len;
! ancil_size -= toh->len;
! ASSERT(__TPI_TOPT_ISALIGNED(toh));
! }
!
if (recv_ancillary.crb_recvttl &&
(ira->ira_flags & IRAF_IS_IPV4)) {
struct T_opthdr *toh;
uint8_t *dstptr;
toh = (struct T_opthdr *)ancil_buf;
toh->level = IPPROTO_IP;
toh->name = IP_RECVTTL;
! toh->len = sizeof (struct T_opthdr) +
! P2ROUNDUP(sizeof (uint8_t), __TPI_ALIGN_SIZE);
toh->status = 0;
ancil_buf += sizeof (struct T_opthdr);
dstptr = (uint8_t *)ancil_buf;
*dstptr = ipp->ipp_hoplimit;
! ancil_buf = (uchar_t *)toh + toh->len;
ancil_size -= toh->len;
+ ASSERT(__TPI_TOPT_ISALIGNED(toh));
}
/* Consumed all of allocated space */
ASSERT(ancil_size == 0);
*** 771,780 ****
--- 796,808 ----
*i1 = connp->conn_recv_ancillary.crb_recvslla;
break; /* goto sizeof (int) option return */
case IP_RECVTTL:
*i1 = connp->conn_recv_ancillary.crb_recvttl;
break; /* goto sizeof (int) option return */
+ case IP_RECVTOS:
+ *i1 = connp->conn_recv_ancillary.crb_recvtos;
+ break; /* goto sizeof (int) option return */
case IP_ADD_MEMBERSHIP:
case IP_DROP_MEMBERSHIP:
case MCAST_JOIN_GROUP:
case MCAST_LEAVE_GROUP:
case IP_BLOCK_SOURCE:
*** 1363,1372 ****
--- 1391,1405 ----
case IP_RECVTTL:
mutex_enter(&connp->conn_lock);
connp->conn_recv_ancillary.crb_recvttl = onoff;
mutex_exit(&connp->conn_lock);
break;
+ case IP_RECVTOS:
+ mutex_enter(&connp->conn_lock);
+ connp->conn_recv_ancillary.crb_recvtos = onoff;
+ mutex_exit(&connp->conn_lock);
+ break;
case IP_PKTINFO: {
/*
* This also handles IP_RECVPKTINFO.
* IP_PKTINFO and IP_RECVPKTINFO have same value.
* Differentiation is based on the size of the