Author: jhb
Date: Wed Jan 23 21:44:48 2013
New Revision: 245849
URL: http://svnweb.freebsd.org/changeset/base/245849

Log:
  Don't assume that all Linux TCP-level socket options are identical to
  FreeBSD TCP-level socket options (only the first two are).  Instead,
  using a mapping function and fail unsupported options as we do for other
  socket option levels.
  
  MFC after:    2 weeks

Modified:
  head/sys/amd64/linux32/linux.h
  head/sys/compat/linux/linux_socket.c
  head/sys/i386/linux/linux.h

Modified: head/sys/amd64/linux32/linux.h
==============================================================================
--- head/sys/amd64/linux32/linux.h      Wed Jan 23 18:34:21 2013        
(r245848)
+++ head/sys/amd64/linux32/linux.h      Wed Jan 23 21:44:48 2013        
(r245849)
@@ -725,6 +725,13 @@ union l_semun {
 #define        LINUX_IP_ADD_MEMBERSHIP         35
 #define        LINUX_IP_DROP_MEMBERSHIP        36
 
+#define        LINUX_TCP_NODELAY       1
+#define        LINUX_TCP_MAXSEG        2
+#define        LINUX_TCP_KEEPIDLE      4
+#define        LINUX_TCP_KEEPINTVL     5
+#define        LINUX_TCP_KEEPCNT       6
+#define        LINUX_TCP_MD5SIG        14
+
 struct l_sockaddr {
        l_ushort        sa_family;
        char            sa_data[14];

Modified: head/sys/compat/linux/linux_socket.c
==============================================================================
--- head/sys/compat/linux/linux_socket.c        Wed Jan 23 18:34:21 2013        
(r245848)
+++ head/sys/compat/linux/linux_socket.c        Wed Jan 23 21:44:48 2013        
(r245849)
@@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$");
 #include <netinet/in.h>
 #include <netinet/in_systm.h>
 #include <netinet/ip.h>
+#include <netinet/tcp.h>
 #ifdef INET6
 #include <netinet/ip6.h>
 #include <netinet6/ip6_var.h>
@@ -326,6 +327,27 @@ linux_to_bsd_so_sockopt(int opt)
 }
 
 static int
+linux_to_bsd_tcp_sockopt(int opt)
+{
+
+       switch (opt) {
+       case LINUX_TCP_NODELAY:
+               return (TCP_NODELAY);
+       case LINUX_TCP_MAXSEG:
+               return (TCP_MAXSEG);
+       case LINUX_TCP_KEEPIDLE:
+               return (TCP_KEEPIDLE);
+       case LINUX_TCP_KEEPINTVL:
+               return (TCP_KEEPINTVL);
+       case LINUX_TCP_KEEPCNT:
+               return (TCP_KEEPCNT);
+       case LINUX_TCP_MD5SIG:
+               return (TCP_MD5SIG);
+       }
+       return (-1);
+}
+
+static int
 linux_to_bsd_msg_flags(int flags)
 {
        int ret_flags = 0;
@@ -1496,8 +1518,7 @@ linux_setsockopt(struct thread *td, stru
                name = linux_to_bsd_ip_sockopt(args->optname);
                break;
        case IPPROTO_TCP:
-               /* Linux TCP option values match BSD's */
-               name = args->optname;
+               name = linux_to_bsd_tcp_sockopt(args->optname);
                break;
        default:
                name = -1;
@@ -1591,8 +1612,7 @@ linux_getsockopt(struct thread *td, stru
                name = linux_to_bsd_ip_sockopt(args->optname);
                break;
        case IPPROTO_TCP:
-               /* Linux TCP option values match BSD's */
-               name = args->optname;
+               name = linux_to_bsd_tcp_sockopt(args->optname);
                break;
        default:
                name = -1;

Modified: head/sys/i386/linux/linux.h
==============================================================================
--- head/sys/i386/linux/linux.h Wed Jan 23 18:34:21 2013        (r245848)
+++ head/sys/i386/linux/linux.h Wed Jan 23 21:44:48 2013        (r245849)
@@ -701,6 +701,13 @@ union l_semun {
 #define        LINUX_IP_ADD_MEMBERSHIP         35
 #define        LINUX_IP_DROP_MEMBERSHIP        36
 
+#define        LINUX_TCP_NODELAY       1
+#define        LINUX_TCP_MAXSEG        2
+#define        LINUX_TCP_KEEPIDLE      4
+#define        LINUX_TCP_KEEPINTVL     5
+#define        LINUX_TCP_KEEPCNT       6
+#define        LINUX_TCP_MD5SIG        14
+
 struct l_sockaddr {
        l_ushort        sa_family;
        char            sa_data[14];
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to