]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - net/ipv4/ip_sockglue.c
pkt_sched: Add multiqueue scheduler support
[linux-2.6-omap-h63xx.git] / net / ipv4 / ip_sockglue.c
index c2921d01e925d2b06c7f43620c16673bfba92df4..105d92a039b931c0bc485503cc913057eb3b96e1 100644 (file)
@@ -5,8 +5,6 @@
  *
  *             The IP to API glue.
  *
- * Version:    $Id: ip_sockglue.c,v 1.62 2002/02/01 22:01:04 davem Exp $
- *
  * Authors:    see ip.c
  *
  * Fixes:
@@ -36,6 +34,7 @@
 #include <linux/mroute.h>
 #include <net/route.h>
 #include <net/xfrm.h>
+#include <net/compat.h>
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
 #include <net/transp_v6.h>
 #endif
@@ -57,7 +56,7 @@
 static void ip_cmsg_recv_pktinfo(struct msghdr *msg, struct sk_buff *skb)
 {
        struct in_pktinfo info;
-       struct rtable *rt = (struct rtable *)skb->dst;
+       struct rtable *rt = skb->rtable;
 
        info.ipi_addr.s_addr = ip_hdr(skb)->daddr;
        if (rt) {
@@ -163,7 +162,7 @@ void ip_cmsg_recv(struct msghdr *msg, struct sk_buff *skb)
                ip_cmsg_recv_security(msg, skb);
 }
 
-int ip_cmsg_send(struct msghdr *msg, struct ipcm_cookie *ipc)
+int ip_cmsg_send(struct net *net, struct msghdr *msg, struct ipcm_cookie *ipc)
 {
        int err;
        struct cmsghdr *cmsg;
@@ -176,7 +175,7 @@ int ip_cmsg_send(struct msghdr *msg, struct ipcm_cookie *ipc)
                switch (cmsg->cmsg_type) {
                case IP_RETOPTS:
                        err = cmsg->cmsg_len - CMSG_ALIGN(sizeof(struct cmsghdr));
-                       err = ip_options_get(&ipc->opt, CMSG_DATA(cmsg), err < 40 ? err : 40);
+                       err = ip_options_get(net, &ipc->opt, CMSG_DATA(cmsg), err < 40 ? err : 40);
                        if (err)
                                return err;
                        break;
@@ -449,7 +448,8 @@ static int do_ip_setsockopt(struct sock *sk, int level,
                struct ip_options * opt = NULL;
                if (optlen > 40 || optlen < 0)
                        goto e_inval;
-               err = ip_options_get_from_user(&opt, optval, optlen);
+               err = ip_options_get_from_user(sock_net(sk), &opt,
+                                              optval, optlen);
                if (err)
                        break;
                if (inet->is_icsk) {
@@ -589,13 +589,13 @@ static int do_ip_setsockopt(struct sock *sk, int level,
                                err = 0;
                                break;
                        }
-                       dev = ip_dev_find(&init_net, mreq.imr_address.s_addr);
+                       dev = ip_dev_find(sock_net(sk), mreq.imr_address.s_addr);
                        if (dev) {
                                mreq.imr_ifindex = dev->ifindex;
                                dev_put(dev);
                        }
                } else
-                       dev = __dev_get_by_index(&init_net, mreq.imr_ifindex);
+                       dev = __dev_get_by_index(sock_net(sk), mreq.imr_ifindex);
 
 
                err = -EADDRNOTAVAIL;
@@ -922,6 +922,10 @@ int compat_ip_setsockopt(struct sock *sk, int level, int optname,
        if (level != SOL_IP)
                return -ENOPROTOOPT;
 
+       if (optname >= MCAST_JOIN_GROUP && optname <= MCAST_MSFILTER)
+               return compat_mc_setsockopt(sk, level, optname, optval, optlen,
+                       ip_setsockopt);
+
        err = do_ip_setsockopt(sk, level, optname, optval, optlen);
 #ifdef CONFIG_NETFILTER
        /* we need to exclude all possible ENOPROTOOPTs except default case */
@@ -1180,7 +1184,14 @@ int ip_getsockopt(struct sock *sk, int level,
 int compat_ip_getsockopt(struct sock *sk, int level, int optname,
                         char __user *optval, int __user *optlen)
 {
-       int err = do_ip_getsockopt(sk, level, optname, optval, optlen);
+       int err;
+
+       if (optname == MCAST_MSFILTER)
+               return compat_mc_getsockopt(sk, level, optname, optval, optlen,
+                       ip_getsockopt);
+
+       err = do_ip_getsockopt(sk, level, optname, optval, optlen);
+
 #ifdef CONFIG_NETFILTER
        /* we need to exclude all possible ENOPROTOOPTs except default case */
        if (err == -ENOPROTOOPT && optname != IP_PKTOPTIONS &&