Print this page
OS-4699 lxbrand netty complains about SO_LINGER (really IP_TOS)
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
OS-4018 lxbrand support TCP SO_REUSEPORT
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Cody Mello <cody.mello@joyent.com>
        
@@ -19,10 +19,11 @@
  * CDDL HEADER END
  */
 
 /*
  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2016 Joyent, Inc.
  */
 /* Copyright (c) 1990 Mentat Inc. */
 
 #include <sys/types.h>
 #include <sys/stream.h>
@@ -617,10 +618,13 @@
                         *i1 = connp->conn_oobinline ? SO_OOBINLINE : 0;
                         break;
                 case SO_REUSEADDR:
                         *i1 = connp->conn_reuseaddr ? SO_REUSEADDR : 0;
                         break;  /* goto sizeof (int) option return */
+                case SO_REUSEPORT:
+                        *i1 = connp->conn_reuseport;
+                        break;  /* goto sizeof (int) option return */
                 case SO_TYPE:
                         *i1 = connp->conn_so_type;
                         break;  /* goto sizeof (int) option return */
                 case SO_DONTROUTE:
                         *i1 = (ixa->ixa_flags & IXAF_DONTROUTE) ?
@@ -1184,12 +1188,28 @@
         zoneid_t        zoneid = IPCL_ZONEID(connp);
         ipif_t          *ipif;
         ip_stack_t      *ipst = connp->conn_netstack->netstack_ip;
         int             error;
 
-        if (connp->conn_family != AF_INET)
+        if (connp->conn_family == AF_INET6 &&
+            connp->conn_ipversion == IPV4_VERSION) {
+                /*
+                 * Allow certain IPv4 options to be set on an AF_INET6 socket
+                 * if the connection is still IPv4.
+                 */
+                switch (name) {
+                case IP_TOS:
+                case T_IP_TOS:
+                case IP_TTL:
+                case IP_DONTFRAG:
+                        break;
+                default:
                 return (EINVAL);
+                }
+        } else if (connp->conn_family != AF_INET) {
+                return (EINVAL);
+        }
 
         switch (name) {
         case IP_TTL:
                 /* Don't allow zero */
                 if (*i1 < 1 || *i1 > 255)