summaryrefslogtreecommitdiffstats
path: root/sys/compat/linux
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2013-01-23 21:44:48 +0000
committerjhb <jhb@FreeBSD.org>2013-01-23 21:44:48 +0000
commitaf17a55dfd7a008dea74152e32f5d6c803b46bdd (patch)
treea6b7f34b7adf2be04584d7416af6c86369b5fe56 /sys/compat/linux
parentc6a2bfeec066725730c03ff9ad88cd84173400d7 (diff)
downloadFreeBSD-src-af17a55dfd7a008dea74152e32f5d6c803b46bdd.zip
FreeBSD-src-af17a55dfd7a008dea74152e32f5d6c803b46bdd.tar.gz
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
Diffstat (limited to 'sys/compat/linux')
-rw-r--r--sys/compat/linux/linux_socket.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/sys/compat/linux/linux_socket.c b/sys/compat/linux/linux_socket.c
index 7271a18..cd288f8 100644
--- a/sys/compat/linux/linux_socket.c
+++ b/sys/compat/linux/linux_socket.c
@@ -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, struct linux_setsockopt_args *args)
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, struct linux_getsockopt_args *args)
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;
OpenPOWER on IntegriCloud