]> git.karo-electronics.de Git - linux-beck.git/commitdiff
Merge branch 'upstream-net26' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik...
authorDavid S. Miller <davem@davemloft.net>
Wed, 26 Mar 2008 06:11:25 +0000 (23:11 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 26 Mar 2008 06:11:25 +0000 (23:11 -0700)
155 files changed:
arch/ia64/hp/sim/simeth.c
drivers/block/aoe/aoenet.c
drivers/net/bonding/bond_3ad.c
drivers/net/bonding/bond_alb.c
drivers/net/bonding/bond_main.c
drivers/net/hamradio/bpqether.c
drivers/net/loopback.c
drivers/net/macvlan.c
drivers/net/pppoe.c
drivers/net/veth.c
drivers/net/via-velocity.c
drivers/net/wan/dlci.c
drivers/net/wan/hdlc.c
drivers/net/wan/lapbether.c
drivers/net/wan/syncppp.c
drivers/s390/net/qeth_l3_main.c
fs/proc/proc_net.c
include/linux/inetdevice.h
include/linux/ipv6.h
include/linux/netdevice.h
include/linux/netfilter.h
include/linux/netfilter/nf_conntrack_sip.h
include/linux/seq_file.h
include/net/inet_hashtables.h
include/net/inet_timewait_sock.h
include/net/neighbour.h
include/net/net_namespace.h
include/net/netfilter/nf_conntrack.h
include/net/netfilter/nf_conntrack_expect.h
include/net/netfilter/nf_conntrack_helper.h
include/net/netfilter/nf_conntrack_tuple.h
include/net/route.h
include/net/sock.h
net/8021q/vlan.c
net/8021q/vlan_dev.c
net/appletalk/aarp.c
net/appletalk/ddp.c
net/atm/clip.c
net/atm/mpc.c
net/atm/svc.c
net/ax25/af_ax25.c
net/ax25/ax25_in.c
net/bluetooth/l2cap.c
net/bluetooth/rfcomm/sock.c
net/bluetooth/sco.c
net/bridge/br_netlink.c
net/bridge/br_notify.c
net/bridge/br_stp_bpdu.c
net/can/af_can.c
net/can/bcm.c
net/can/raw.c
net/core/dev.c
net/core/dst.c
net/core/fib_rules.c
net/core/neighbour.c
net/core/pktgen.c
net/core/rtnetlink.c
net/core/sock.c
net/decnet/af_decnet.c
net/decnet/dn_dev.c
net/decnet/dn_fib.c
net/decnet/dn_route.c
net/decnet/dn_table.c
net/econet/af_econet.c
net/ipv4/af_inet.c
net/ipv4/arp.c
net/ipv4/devinet.c
net/ipv4/fib_frontend.c
net/ipv4/fib_hash.c
net/ipv4/fib_rules.c
net/ipv4/fib_trie.c
net/ipv4/icmp.c
net/ipv4/igmp.c
net/ipv4/inet_connection_sock.c
net/ipv4/inet_hashtables.c
net/ipv4/inet_timewait_sock.c
net/ipv4/ip_fragment.c
net/ipv4/ip_gre.c
net/ipv4/ip_input.c
net/ipv4/ip_options.c
net/ipv4/ip_output.c
net/ipv4/ip_sockglue.c
net/ipv4/ipconfig.c
net/ipv4/ipmr.c
net/ipv4/netfilter/arp_tables.c
net/ipv4/netfilter/ip_queue.c
net/ipv4/netfilter/ip_tables.c
net/ipv4/netfilter/ipt_CLUSTERIP.c
net/ipv4/netfilter/ipt_MASQUERADE.c
net/ipv4/netfilter/nf_nat_sip.c
net/ipv4/netfilter/nf_nat_snmp_basic.c
net/ipv4/raw.c
net/ipv4/route.c
net/ipv4/tcp_ipv4.c
net/ipv4/udp.c
net/ipv4/xfrm4_policy.c
net/ipv6/addrconf.c
net/ipv6/addrlabel.c
net/ipv6/af_inet6.c
net/ipv6/fib6_rules.c
net/ipv6/icmp.c
net/ipv6/inet6_hashtables.c
net/ipv6/ip6_fib.c
net/ipv6/ip6_output.c
net/ipv6/ipv6_sockglue.c
net/ipv6/mcast.c
net/ipv6/ndisc.c
net/ipv6/netfilter/ip6_queue.c
net/ipv6/netfilter/ip6_tables.c
net/ipv6/proc.c
net/ipv6/raw.c
net/ipv6/reassembly.c
net/ipv6/route.c
net/ipv6/tcp_ipv6.c
net/ipv6/udp.c
net/ipv6/xfrm6_policy.c
net/ipx/af_ipx.c
net/irda/af_irda.c
net/irda/irlap_frame.c
net/llc/llc_conn.c
net/llc/llc_input.c
net/netfilter/core.c
net/netfilter/nf_conntrack_amanda.c
net/netfilter/nf_conntrack_expect.c
net/netfilter/nf_conntrack_ftp.c
net/netfilter/nf_conntrack_h323_main.c
net/netfilter/nf_conntrack_helper.c
net/netfilter/nf_conntrack_irc.c
net/netfilter/nf_conntrack_netbios_ns.c
net/netfilter/nf_conntrack_pptp.c
net/netfilter/nf_conntrack_sane.c
net/netfilter/nf_conntrack_sip.c
net/netfilter/nf_conntrack_tftp.c
net/netfilter/nf_sockopt.c
net/netfilter/nfnetlink_queue.c
net/netfilter/x_tables.c
net/netlabel/netlabel_unlabeled.c
net/netlink/af_netlink.c
net/netrom/af_netrom.c
net/packet/af_packet.c
net/rose/af_rose.c
net/sched/act_api.c
net/sched/cls_api.c
net/sched/sch_api.c
net/sctp/ipv6.c
net/sctp/protocol.c
net/socket.c
net/tipc/eth_media.c
net/tipc/socket.c
net/unix/af_unix.c
net/wireless/wext.c
net/x25/af_x25.c
net/x25/x25_dev.c
net/xfrm/xfrm_policy.c
security/selinux/netif.c

index 969fe9f443c4f69883949e6a3b64d74cb46da8ad..3d47839a0c488c5625bb6903b68e74d31b0489e8 100644 (file)
@@ -294,7 +294,7 @@ simeth_device_event(struct notifier_block *this,unsigned long event, void *ptr)
                return NOTIFY_DONE;
        }
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        if ( event != NETDEV_UP && event != NETDEV_DOWN ) return NOTIFY_DONE;
index 8460ef736d560405318a62d7737f8afdc1db9ece..18d243c73eee0b34966a1a4eea6da1e673ece772 100644 (file)
@@ -115,7 +115,7 @@ aoenet_rcv(struct sk_buff *skb, struct net_device *ifp, struct packet_type *pt,
        struct aoe_hdr *h;
        u32 n;
 
-       if (ifp->nd_net != &init_net)
+       if (dev_net(ifp) != &init_net)
                goto exit;
 
        skb = skb_share_check(skb, GFP_ATOMIC);
index cb3c6faa7888c55b74771053a4c80660ef317a4a..457d81f73e3926a32fcc472da2a26b0dc822b5f5 100644 (file)
@@ -2429,7 +2429,7 @@ int bond_3ad_lacpdu_recv(struct sk_buff *skb, struct net_device *dev, struct pac
        struct slave *slave = NULL;
        int ret = NET_RX_DROP;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                goto out;
 
        if (!(dev->flags & IFF_MASTER))
index b57bc9467dbe7a22d1c609fffa1ca5154daf9382..b986dacf5d3306c6dee28514993758ef99e21bfb 100644 (file)
@@ -345,7 +345,7 @@ static int rlb_arp_recv(struct sk_buff *skb, struct net_device *bond_dev, struct
        struct arp_pkt *arp = (struct arp_pkt *)skb->data;
        int res = NET_RX_DROP;
 
-       if (bond_dev->nd_net != &init_net)
+       if (dev_net(bond_dev) != &init_net)
                goto out;
 
        if (!(bond_dev->flags & IFF_MASTER))
index 5fc9d8d58ecef06e25c0cfc99444e8d298f65c48..ac688fcb27d77a7613c1fa92df4967d360b17689 100644 (file)
@@ -2629,7 +2629,7 @@ static int bond_arp_rcv(struct sk_buff *skb, struct net_device *dev, struct pack
        unsigned char *arp_ptr;
        __be32 sip, tip;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                goto out;
 
        if (!(dev->priv_flags & IFF_BONDING) || !(dev->flags & IFF_MASTER))
@@ -3470,7 +3470,7 @@ static int bond_netdev_event(struct notifier_block *this, unsigned long event, v
 {
        struct net_device *event_dev = (struct net_device *)ptr;
 
-       if (event_dev->nd_net != &init_net)
+       if (dev_net(event_dev) != &init_net)
                return NOTIFY_DONE;
 
        dprintk("event_dev: %s, event: %lx\n",
@@ -3508,7 +3508,7 @@ static int bond_inetaddr_event(struct notifier_block *this, unsigned long event,
        struct bonding *bond, *bond_next;
        struct vlan_entry *vlan, *vlan_next;
 
-       if (ifa->ifa_dev->dev->nd_net != &init_net)
+       if (dev_net(ifa->ifa_dev->dev) != &init_net)
                return NOTIFY_DONE;
 
        list_for_each_entry_safe(bond, bond_next, &bond_dev_list, bond_list) {
index 5ddf8b0c34f9286fe7fe61060088d4327fe30481..5f4b4c6c9f761075db2967d1e1f1343e2454602e 100644 (file)
@@ -172,7 +172,7 @@ static int bpq_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_ty
        struct ethhdr *eth;
        struct bpqdev *bpq;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                goto drop;
 
        if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL)
@@ -553,7 +553,7 @@ static int bpq_device_event(struct notifier_block *this,unsigned long event, voi
 {
        struct net_device *dev = (struct net_device *)ptr;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        if (!dev_is_ethdev(dev))
index f2a6e713224153bb5e6861aebce481089d227597..41b774baac4d4ce6651b51f051ecc9b003d5a623 100644 (file)
@@ -258,7 +258,7 @@ static __net_init int loopback_net_init(struct net *net)
        if (!dev)
                goto out;
 
-       dev->nd_net = net;
+       dev_net_set(dev, net);
        err = register_netdev(dev);
        if (err)
                goto out_free_netdev;
index f651a816b280bfcb04d1d6fdda8d12e2819b4ce5..2056cfc624dc6da62d2777c016920e86d01b5876 100644 (file)
@@ -402,7 +402,7 @@ static int macvlan_newlink(struct net_device *dev,
        if (!tb[IFLA_LINK])
                return -EINVAL;
 
-       lowerdev = __dev_get_by_index(dev->nd_net, nla_get_u32(tb[IFLA_LINK]));
+       lowerdev = __dev_get_by_index(dev_net(dev), nla_get_u32(tb[IFLA_LINK]));
        if (lowerdev == NULL)
                return -ENODEV;
 
index ac0ac98b19cda96aa3be88a9483e145d6aae5531..4fad4ddb35048419beb3484ea4d14acd4ac6b241 100644 (file)
@@ -301,7 +301,7 @@ static int pppoe_device_event(struct notifier_block *this,
 {
        struct net_device *dev = (struct net_device *) ptr;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        /* Only look at sockets that are using this specific device. */
@@ -392,7 +392,7 @@ static int pppoe_rcv(struct sk_buff *skb,
        if (!(skb = skb_share_check(skb, GFP_ATOMIC)))
                goto out;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                goto drop;
 
        if (!pskb_may_pull(skb, sizeof(struct pppoe_hdr)))
@@ -424,7 +424,7 @@ static int pppoe_disc_rcv(struct sk_buff *skb,
        struct pppoe_hdr *ph;
        struct pppox_sock *po;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                goto abort;
 
        if (!pskb_may_pull(skb, sizeof(struct pppoe_hdr)))
index e2ad98bee6e7d9921a6f67c6d5560fd70d4b84e5..31cd817f33f97be658d31bed4ba93ec101312255 100644 (file)
@@ -375,7 +375,7 @@ static int veth_newlink(struct net_device *dev,
        else
                snprintf(ifname, IFNAMSIZ, DRV_NAME "%%d");
 
-       peer = rtnl_create_link(dev->nd_net, ifname, &veth_link_ops, tbp);
+       peer = rtnl_create_link(dev_net(dev), ifname, &veth_link_ops, tbp);
        if (IS_ERR(peer))
                return PTR_ERR(peer);
 
index 1525e8a8984477a7f361dc82645c2394e356a575..ed1afaf683a4bb96481325165929542bf04e6db8 100644 (file)
@@ -3464,7 +3464,7 @@ static int velocity_netdev_event(struct notifier_block *nb, unsigned long notifi
        struct velocity_info *vptr;
        unsigned long flags;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        spin_lock_irqsave(&velocity_dev_list_lock, flags);
index 96b232446c0b03533851be84da4b158e775f38a1..b14242768fad19c381cff1d3d232d4abcf5f7e24 100644 (file)
@@ -517,7 +517,7 @@ static int dlci_dev_event(struct notifier_block *unused,
 {
        struct net_device *dev = (struct net_device *) ptr;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        if (event == NETDEV_UNREGISTER) {
index 39951d0c34d6598b44a9d701fe3c5f1df2df5ceb..9a83c9d5b8cfe89cffd2b99a234f594018fb7e09 100644 (file)
@@ -68,7 +68,7 @@ static int hdlc_rcv(struct sk_buff *skb, struct net_device *dev,
 {
        struct hdlc_device *hdlc = dev_to_hdlc(dev);
 
-       if (dev->nd_net != &init_net) {
+       if (dev_net(dev) != &init_net) {
                kfree_skb(skb);
                return 0;
        }
@@ -105,7 +105,7 @@ static int hdlc_device_event(struct notifier_block *this, unsigned long event,
        unsigned long flags;
        int on;
  
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        if (dev->get_stats != hdlc_get_stats)
index fb37b809523150d2424710d7cdfdb5c1bff206e7..629c909e05f9a4fd9033c14be65b4e11bc0ad9e3 100644 (file)
@@ -91,7 +91,7 @@ static int lapbeth_rcv(struct sk_buff *skb, struct net_device *dev, struct packe
        int len, err;
        struct lapbethdev *lapbeth;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                goto drop;
 
        if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL)
@@ -393,7 +393,7 @@ static int lapbeth_device_event(struct notifier_block *this,
        struct lapbethdev *lapbeth;
        struct net_device *dev = ptr;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        if (!dev_is_ethdev(dev))
index 61e24b7a45a306da29fe20916a3e8ca40e45c1d6..29b4b94e49473228da69c848d1c1c4e50287a1cc 100644 (file)
@@ -1444,7 +1444,7 @@ static void sppp_print_bytes (u_char *p, u16 len)
 
 static int sppp_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *p, struct net_device *orig_dev)
 {
-       if (dev->nd_net != &init_net) {
+       if (dev_net(dev) != &init_net) {
                kfree_skb(skb);
                return 0;
        }
index a856cb47fc7839d35518b7b599a2b5042ead0aa7..21c439046b3c81a6e56b44dfaf686b14bd86d4b1 100644 (file)
@@ -3250,7 +3250,7 @@ static int qeth_l3_ip_event(struct notifier_block *this,
        struct qeth_ipaddr *addr;
        struct qeth_card *card;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        QETH_DBF_TEXT(trace, 3, "ipevent");
index 4caa5f774fb7975136d04e2baf81826e1c392dba..13cd7835d0dfdc5027c61df7270bbb61d51d2273 100644 (file)
@@ -44,7 +44,9 @@ int seq_open_net(struct inode *ino, struct file *f,
                put_net(net);
                return -ENOMEM;
        }
+#ifdef CONFIG_NET_NS
        p->net = net;
+#endif
        return 0;
 }
 EXPORT_SYMBOL_GPL(seq_open_net);
@@ -52,12 +54,10 @@ EXPORT_SYMBOL_GPL(seq_open_net);
 int seq_release_net(struct inode *ino, struct file *f)
 {
        struct seq_file *seq;
-       struct seq_net_private *p;
 
        seq = f->private_data;
-       p = seq->private;
 
-       put_net(p->net);
+       put_net(seq_file_net(seq));
        seq_release_private(ino, f);
        return 0;
 }
index da05ab47ff2f51767ebffebc7e356cbf720477d6..7009b0cdd06fe1dc7b294e788ff61b6d3db1c141 100644 (file)
@@ -70,13 +70,13 @@ static inline void ipv4_devconf_setall(struct in_device *in_dev)
        ipv4_devconf_set((in_dev), NET_IPV4_CONF_ ## attr, (val))
 
 #define IN_DEV_ANDCONF(in_dev, attr) \
-       (IPV4_DEVCONF_ALL(in_dev->dev->nd_net, attr) && \
+       (IPV4_DEVCONF_ALL(dev_net(in_dev->dev), attr) && \
         IN_DEV_CONF_GET((in_dev), attr))
 #define IN_DEV_ORCONF(in_dev, attr) \
-       (IPV4_DEVCONF_ALL(in_dev->dev->nd_net, attr) || \
+       (IPV4_DEVCONF_ALL(dev_net(in_dev->dev), attr) || \
         IN_DEV_CONF_GET((in_dev), attr))
 #define IN_DEV_MAXCONF(in_dev, attr) \
-       (max(IPV4_DEVCONF_ALL(in_dev->dev->nd_net, attr), \
+       (max(IPV4_DEVCONF_ALL(dev_net(in_dev->dev), attr), \
             IN_DEV_CONF_GET((in_dev), attr)))
 
 #define IN_DEV_FORWARD(in_dev)         IN_DEV_CONF_GET((in_dev), FORWARDING)
index c9ba0da16ce96526ad665d311c4c1a856580c2e5..b90d3d461d4e57d4a6897370a1399a3c3f7f3a05 100644 (file)
@@ -481,7 +481,7 @@ static inline struct raw6_sock *raw6_sk(const struct sock *sk)
 #endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */
 
 #define INET6_MATCH(__sk, __net, __hash, __saddr, __daddr, __ports, __dif)\
-       (((__sk)->sk_hash == (__hash)) && ((__sk)->sk_net == (__net))   && \
+       (((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net)   && \
         ((*((__portpair *)&(inet_sk(__sk)->dport))) == (__ports))      && \
         ((__sk)->sk_family             == AF_INET6)            && \
         ipv6_addr_equal(&inet6_sk(__sk)->daddr, (__saddr))     && \
@@ -489,7 +489,7 @@ static inline struct raw6_sock *raw6_sk(const struct sock *sk)
         (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif))))
 
 #define INET6_TW_MATCH(__sk, __net, __hash, __saddr, __daddr, __ports, __dif) \
-       (((__sk)->sk_hash == (__hash)) && ((__sk)->sk_net == (__net))   && \
+       (((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net)   && \
         (*((__portpair *)&(inet_twsk(__sk)->tw_dport)) == (__ports))   && \
         ((__sk)->sk_family            == PF_INET6)                     && \
         (ipv6_addr_equal(&inet6_twsk(__sk)->tw_v6_daddr, (__saddr)))   && \
index ced61f87660eeb2d3a529deaa50a664b9b5185d4..d146be40f46c50df1a63cc3619af248ced86a3b9 100644 (file)
@@ -708,8 +708,10 @@ struct net_device
        void                    (*poll_controller)(struct net_device *dev);
 #endif
 
+#ifdef CONFIG_NET_NS
        /* Network namespace this network device is inside */
        struct net              *nd_net;
+#endif
 
        /* bridge stuff */
        struct net_bridge_port  *br_port;
@@ -737,6 +739,27 @@ struct net_device
 #define        NETDEV_ALIGN            32
 #define        NETDEV_ALIGN_CONST      (NETDEV_ALIGN - 1)
 
+/*
+ * Net namespace inlines
+ */
+static inline
+struct net *dev_net(const struct net_device *dev)
+{
+#ifdef CONFIG_NET_NS
+       return dev->nd_net;
+#else
+       return &init_net;
+#endif
+}
+
+static inline
+void dev_net_set(struct net_device *dev, const struct net *net)
+{
+#ifdef CONFIG_NET_NS
+       dev->nd_dev = net;
+#endif
+}
+
 /**
  *     netdev_priv - access network device private data
  *     @dev: network device
@@ -813,7 +836,7 @@ static inline struct net_device *next_net_device(struct net_device *dev)
        struct list_head *lh;
        struct net *net;
 
-       net = dev->nd_net;
+       net = dev_net(dev);
        lh = dev->dev_list.next;
        return lh == &net->dev_base_head ? NULL : net_device_entry(lh);
 }
index f0680c2bee73b16cc8b642f1d7de2e1f9133d43c..89e6c72ad2959411523648fc53ec76f58cb557aa 100644 (file)
@@ -61,6 +61,15 @@ union nf_inet_addr {
 #ifdef __KERNEL__
 #ifdef CONFIG_NETFILTER
 
+static inline int nf_inet_addr_cmp(const union nf_inet_addr *a1,
+                                  const union nf_inet_addr *a2)
+{
+       return a1->all[0] == a2->all[0] &&
+              a1->all[1] == a2->all[1] &&
+              a1->all[2] == a2->all[2] &&
+              a1->all[3] == a2->all[3];
+}
+
 extern void netfilter_init(void);
 
 /* Largest hook number + 1 */
index 8e5ce1ca7bfcd48276c5b17c8572824abb3f7ea1..5da04e586a3fb399fcda285cb23f6046bc8e447b 100644 (file)
 #define SIP_PORT       5060
 #define SIP_TIMEOUT    3600
 
-enum sip_header_pos {
-       POS_REG_REQ_URI,
-       POS_REQ_URI,
-       POS_FROM,
-       POS_TO,
-       POS_VIA,
-       POS_CONTACT,
-       POS_CONTENT,
-       POS_MEDIA,
-       POS_OWNER_IP4,
-       POS_CONNECTION_IP4,
-       POS_OWNER_IP6,
-       POS_CONNECTION_IP6,
-       POS_SDP_HEADER,
+struct nf_ct_sip_master {
+       unsigned int    register_cseq;
+};
+
+enum sip_expectation_classes {
+       SIP_EXPECT_SIGNALLING,
+       SIP_EXPECT_AUDIO,
+       SIP_EXPECT_VIDEO,
+       __SIP_EXPECT_MAX
+};
+#define SIP_EXPECT_MAX (__SIP_EXPECT_MAX - 1)
+
+struct sdp_media_type {
+       const char                      *name;
+       unsigned int                    len;
+       enum sip_expectation_classes    class;
+};
+
+#define SDP_MEDIA_TYPE(__name, __class)                                        \
+{                                                                      \
+       .name   = (__name),                                             \
+       .len    = sizeof(__name) - 1,                                   \
+       .class  = (__class),                                            \
+}
+
+struct sip_handler {
+       const char      *method;
+       unsigned int    len;
+       int             (*request)(struct sk_buff *skb,
+                                  const char **dptr, unsigned int *datalen,
+                                  unsigned int cseq);
+       int             (*response)(struct sk_buff *skb,
+                                   const char **dptr, unsigned int *datalen,
+                                   unsigned int cseq, unsigned int code);
+};
+
+#define SIP_HANDLER(__method, __request, __response)                   \
+{                                                                      \
+       .method         = (__method),                                   \
+       .len            = sizeof(__method) - 1,                         \
+       .request        = (__request),                                  \
+       .response       = (__response),                                 \
+}
+
+struct sip_header {
+       const char      *name;
+       const char      *cname;
+       const char      *search;
+       unsigned int    len;
+       unsigned int    clen;
+       unsigned int    slen;
+       int             (*match_len)(const struct nf_conn *ct,
+                                    const char *dptr, const char *limit,
+                                    int *shift);
+};
+
+#define __SIP_HDR(__name, __cname, __search, __match)                  \
+{                                                                      \
+       .name           = (__name),                                     \
+       .len            = sizeof(__name) - 1,                           \
+       .cname          = (__cname),                                    \
+       .clen           = (__cname) ? sizeof(__cname) - 1 : 0,          \
+       .search         = (__search),                                   \
+       .slen           = (__search) ? sizeof(__search) - 1 : 0,        \
+       .match_len      = (__match),                                    \
+}
+
+#define SIP_HDR(__name, __cname, __search, __match) \
+       __SIP_HDR(__name, __cname, __search, __match)
+
+#define SDP_HDR(__name, __search, __match) \
+       __SIP_HDR(__name, NULL, __search, __match)
+
+enum sip_header_types {
+       SIP_HDR_CSEQ,
+       SIP_HDR_FROM,
+       SIP_HDR_TO,
+       SIP_HDR_CONTACT,
+       SIP_HDR_VIA,
+       SIP_HDR_EXPIRES,
+       SIP_HDR_CONTENT_LENGTH,
+};
+
+enum sdp_header_types {
+       SDP_HDR_UNSPEC,
+       SDP_HDR_VERSION,
+       SDP_HDR_OWNER_IP4,
+       SDP_HDR_CONNECTION_IP4,
+       SDP_HDR_OWNER_IP6,
+       SDP_HDR_CONNECTION_IP6,
+       SDP_HDR_MEDIA,
 };
 
 extern unsigned int (*nf_nat_sip_hook)(struct sk_buff *skb,
-                                      enum ip_conntrack_info ctinfo,
-                                      struct nf_conn *ct,
-                                      const char **dptr);
-extern unsigned int (*nf_nat_sdp_hook)(struct sk_buff *skb,
-                                      enum ip_conntrack_info ctinfo,
-                                      struct nf_conntrack_expect *exp,
-                                      const char *dptr);
-
-extern int ct_sip_get_info(const struct nf_conn *ct, const char *dptr,
-                           size_t dlen, unsigned int *matchoff,
-                           unsigned int *matchlen, enum sip_header_pos pos);
-extern int ct_sip_lnlen(const char *line, const char *limit);
-extern const char *ct_sip_search(const char *needle, const char *haystack,
-                                size_t needle_len, size_t haystack_len,
-                                int case_sensitive);
+                                      const char **dptr,
+                                      unsigned int *datalen);
+extern unsigned int (*nf_nat_sip_expect_hook)(struct sk_buff *skb,
+                                             const char **dptr,
+                                             unsigned int *datalen,
+                                             struct nf_conntrack_expect *exp,
+                                             unsigned int matchoff,
+                                             unsigned int matchlen);
+extern unsigned int (*nf_nat_sdp_addr_hook)(struct sk_buff *skb,
+                                           const char **dptr,
+                                           unsigned int dataoff,
+                                           unsigned int *datalen,
+                                           enum sdp_header_types type,
+                                           enum sdp_header_types term,
+                                           const union nf_inet_addr *addr);
+extern unsigned int (*nf_nat_sdp_port_hook)(struct sk_buff *skb,
+                                           const char **dptr,
+                                           unsigned int *datalen,
+                                           unsigned int matchoff,
+                                           unsigned int matchlen,
+                                           u_int16_t port);
+extern unsigned int (*nf_nat_sdp_session_hook)(struct sk_buff *skb,
+                                              const char **dptr,
+                                              unsigned int dataoff,
+                                              unsigned int *datalen,
+                                              const union nf_inet_addr *addr);
+extern unsigned int (*nf_nat_sdp_media_hook)(struct sk_buff *skb,
+                                            const char **dptr,
+                                            unsigned int *datalen,
+                                            struct nf_conntrack_expect *rtp_exp,
+                                            struct nf_conntrack_expect *rtcp_exp,
+                                            unsigned int mediaoff,
+                                            unsigned int medialen,
+                                            union nf_inet_addr *rtp_addr);
+
+extern int ct_sip_parse_request(const struct nf_conn *ct,
+                               const char *dptr, unsigned int datalen,
+                               unsigned int *matchoff, unsigned int *matchlen,
+                               union nf_inet_addr *addr, __be16 *port);
+extern int ct_sip_get_header(const struct nf_conn *ct, const char *dptr,
+                            unsigned int dataoff, unsigned int datalen,
+                            enum sip_header_types type,
+                            unsigned int *matchoff, unsigned int *matchlen);
+extern int ct_sip_parse_header_uri(const struct nf_conn *ct, const char *dptr,
+                                  unsigned int *dataoff, unsigned int datalen,
+                                  enum sip_header_types type, int *in_header,
+                                  unsigned int *matchoff, unsigned int *matchlen,
+                                  union nf_inet_addr *addr, __be16 *port);
+extern int ct_sip_parse_address_param(const struct nf_conn *ct, const char *dptr,
+                                     unsigned int dataoff, unsigned int datalen,
+                                     const char *name,
+                                     unsigned int *matchoff, unsigned int *matchlen,
+                                     union nf_inet_addr *addr);
+extern int ct_sip_parse_numerical_param(const struct nf_conn *ct, const char *dptr,
+                                       unsigned int off, unsigned int datalen,
+                                       const char *name,
+                                       unsigned int *matchoff, unsigned int *matchen,
+                                       unsigned int *val);
+
+extern int ct_sip_get_sdp_header(const struct nf_conn *ct, const char *dptr,
+                                unsigned int dataoff, unsigned int datalen,
+                                enum sdp_header_types type,
+                                enum sdp_header_types term,
+                                unsigned int *matchoff, unsigned int *matchlen);
+
 #endif /* __KERNEL__ */
 #endif /* __NF_CONNTRACK_SIP_H__ */
index 67c2563961f393c75ac4a5d4d013a6c11fdee4db..d870a825376999171829f3ef6aedc0c6109506a5 100644 (file)
@@ -5,6 +5,7 @@
 #include <linux/types.h>
 #include <linux/string.h>
 #include <linux/mutex.h>
+#include <net/net_namespace.h>
 
 struct seq_operations;
 struct file;
@@ -64,7 +65,9 @@ extern struct list_head *seq_list_next(void *v, struct list_head *head,
 
 struct net;
 struct seq_net_private {
+#ifdef CONFIG_NET_NS
        struct net *net;
+#endif
 };
 
 int seq_open_net(struct inode *, struct file *,
@@ -72,7 +75,11 @@ int seq_open_net(struct inode *, struct file *,
 int seq_release_net(struct inode *, struct file *);
 static inline struct net *seq_file_net(struct seq_file *seq)
 {
+#ifdef CONFIG_NET_NS
        return ((struct seq_net_private *)seq->private)->net;
+#else
+       return &init_net;
+#endif
 }
 
 #endif
index d99c1ba2ece0e0ff98488859abc30e8cde549b77..5525227c5e9254234e86474c3c0c5f3507a53025 100644 (file)
@@ -314,25 +314,25 @@ typedef __u64 __bitwise __addrpair;
                                   ((__force __u64)(__be32)(__saddr)));
 #endif /* __BIG_ENDIAN */
 #define INET_MATCH(__sk, __net, __hash, __cookie, __saddr, __daddr, __ports, __dif)\
-       (((__sk)->sk_hash == (__hash)) && ((__sk)->sk_net == (__net))   &&      \
+       (((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net)   &&      \
         ((*((__addrpair *)&(inet_sk(__sk)->daddr))) == (__cookie))     &&      \
         ((*((__portpair *)&(inet_sk(__sk)->dport))) == (__ports))      &&      \
         (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif))))
 #define INET_TW_MATCH(__sk, __net, __hash, __cookie, __saddr, __daddr, __ports, __dif)\
-       (((__sk)->sk_hash == (__hash)) && ((__sk)->sk_net == (__net))   &&      \
+       (((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net)   &&      \
         ((*((__addrpair *)&(inet_twsk(__sk)->tw_daddr))) == (__cookie)) &&     \
         ((*((__portpair *)&(inet_twsk(__sk)->tw_dport))) == (__ports)) &&      \
         (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif))))
 #else /* 32-bit arch */
 #define INET_ADDR_COOKIE(__name, __saddr, __daddr)
 #define INET_MATCH(__sk, __net, __hash, __cookie, __saddr, __daddr, __ports, __dif)    \
-       (((__sk)->sk_hash == (__hash)) && ((__sk)->sk_net == (__net))   &&      \
+       (((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net)   &&      \
         (inet_sk(__sk)->daddr          == (__saddr))           &&      \
         (inet_sk(__sk)->rcv_saddr      == (__daddr))           &&      \
         ((*((__portpair *)&(inet_sk(__sk)->dport))) == (__ports))      &&      \
         (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif))))
 #define INET_TW_MATCH(__sk, __net, __hash,__cookie, __saddr, __daddr, __ports, __dif)  \
-       (((__sk)->sk_hash == (__hash)) && ((__sk)->sk_net == (__net))   &&      \
+       (((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net)   &&      \
         (inet_twsk(__sk)->tw_daddr     == (__saddr))           &&      \
         (inet_twsk(__sk)->tw_rcv_saddr == (__daddr))           &&      \
         ((*((__portpair *)&(inet_twsk(__sk)->tw_dport))) == (__ports)) &&      \
index 296547bfb0b726610141c511504d358e518e4d94..07fe0d1a4f0398b5e95c9a2e7135b0f79feb6923 100644 (file)
@@ -207,4 +207,22 @@ extern void inet_twsk_schedule(struct inet_timewait_sock *tw,
                               const int timeo, const int timewait_len);
 extern void inet_twsk_deschedule(struct inet_timewait_sock *tw,
                                 struct inet_timewait_death_row *twdr);
+
+static inline
+struct net *twsk_net(const struct inet_timewait_sock *twsk)
+{
+#ifdef CONFIG_NET_NS
+       return twsk->tw_net;
+#else
+       return &init_net;
+#endif
+}
+
+static inline
+void twsk_net_set(struct inet_timewait_sock *twsk, const struct net *net)
+{
+#ifdef CONFIG_NET_NS
+       twsk->tw_net = net;
+#endif
+}
 #endif /* _INET_TIMEWAIT_SOCK_ */
index 06228187206404fe0daa9e6036625fcc95f2544e..8bec0d69b270cea34c0aefad115517544aeece34 100644 (file)
@@ -38,7 +38,9 @@ struct neighbour;
 
 struct neigh_parms
 {
+#ifdef CONFIG_NET_NS
        struct net *net;
+#endif
        struct net_device *dev;
        struct neigh_parms *next;
        int     (*neigh_setup)(struct neighbour *);
@@ -131,7 +133,9 @@ struct neigh_ops
 struct pneigh_entry
 {
        struct pneigh_entry     *next;
+#ifdef CONFIG_NET_NS
        struct net              *net;
+#endif
        struct net_device       *dev;
        u8                      flags;
        u8                      key[0];
@@ -213,6 +217,17 @@ extern struct neighbour    *neigh_event_ns(struct neigh_table *tbl,
 
 extern struct neigh_parms      *neigh_parms_alloc(struct net_device *dev, struct neigh_table *tbl);
 extern void                    neigh_parms_release(struct neigh_table *tbl, struct neigh_parms *parms);
+
+static inline
+struct net                     *neigh_parms_net(const struct neigh_parms *parms)
+{
+#ifdef CONFIG_NET_NS
+       return parms->net;
+#else
+       return &init_net;
+#endif
+}
+
 extern unsigned long           neigh_rand_reach_time(unsigned long base);
 
 extern void                    pneigh_enqueue(struct neigh_table *tbl, struct neigh_parms *p,
@@ -220,6 +235,16 @@ extern void                        pneigh_enqueue(struct neigh_table *tbl, struct neigh_parms *p,
 extern struct pneigh_entry     *pneigh_lookup(struct neigh_table *tbl, struct net *net, const void *key, struct net_device *dev, int creat);
 extern int                     pneigh_delete(struct neigh_table *tbl, struct net *net, const void *key, struct net_device *dev);
 
+static inline
+struct net                     *pneigh_net(const struct pneigh_entry *pneigh)
+{
+#ifdef CONFIG_NET_NS
+       return pneigh->net;
+#else
+       return &init_net;
+#endif
+}
+
 extern void neigh_app_ns(struct neighbour *n);
 extern void neigh_for_each(struct neigh_table *tbl, void (*cb)(struct neighbour *, void *), void *cookie);
 extern void __neigh_for_each_release(struct neigh_table *tbl, int (*cb)(struct neighbour *));
index 923f2b8b909600b3962035f714308ddc5e8acf9d..f8f3d1a5fc35ec3abeb5739b911769d3c698e603 100644 (file)
@@ -118,6 +118,12 @@ static inline void release_net(struct net *net)
 {
        atomic_dec(&net->use_count);
 }
+
+static inline
+int net_eq(const struct net *net1, const struct net *net2)
+{
+       return net1 == net2;
+}
 #else
 static inline struct net *get_net(struct net *net)
 {
@@ -141,6 +147,12 @@ static inline struct net *maybe_get_net(struct net *net)
 {
        return net;
 }
+
+static inline
+int net_eq(const struct net *net1, const struct net *net2)
+{
+       return 1;
+}
 #endif
 
 #define for_each_net(VAR)                              \
index 90b3e7f5df5fdf5fd34cb7469bc45a6957ae98c4..a3567a7a6d678a249dd9771d1f65bcdc9cdc3fb3 100644 (file)
@@ -46,6 +46,7 @@ union nf_conntrack_expect_proto {
 #include <linux/netfilter/nf_conntrack_pptp.h>
 #include <linux/netfilter/nf_conntrack_h323.h>
 #include <linux/netfilter/nf_conntrack_sane.h>
+#include <linux/netfilter/nf_conntrack_sip.h>
 
 /* per conntrack: application helper private data */
 union nf_conntrack_help {
@@ -54,6 +55,7 @@ union nf_conntrack_help {
        struct nf_ct_pptp_master ct_pptp_info;
        struct nf_ct_h323_master ct_h323_info;
        struct nf_ct_sane_master ct_sane_info;
+       struct nf_ct_sip_master ct_sip_info;
 };
 
 #include <linux/types.h>
@@ -75,6 +77,9 @@ do {                                                                  \
 
 struct nf_conntrack_helper;
 
+/* Must be kept in sync with the classes defined by helpers */
+#define NF_CT_MAX_EXPECT_CLASSES       3
+
 /* nf_conn feature for connections that have a helper */
 struct nf_conn_help {
        /* Helper. if any */
@@ -85,7 +90,7 @@ struct nf_conn_help {
        struct hlist_head expectations;
 
        /* Current number of expected connections */
-       unsigned int expecting;
+       u8 expecting[NF_CT_MAX_EXPECT_CLASSES];
 };
 
 
index cb608a1b44e59812876c1c3db00b2150fc538e1c..dfdf4b4594751b00f8d21c7e136490307debe8d5 100644 (file)
@@ -41,6 +41,9 @@ struct nf_conntrack_expect
        /* Flags */
        unsigned int flags;
 
+       /* Expectation class */
+       unsigned int class;
+
 #ifdef CONFIG_NF_NAT_NEEDED
        __be32 saved_ip;
        /* This is the original per-proto part, used to map the
@@ -53,7 +56,16 @@ struct nf_conntrack_expect
        struct rcu_head rcu;
 };
 
-#define NF_CT_EXPECT_PERMANENT 0x1
+struct nf_conntrack_expect_policy
+{
+       unsigned int    max_expected;
+       unsigned int    timeout;
+};
+
+#define NF_CT_EXPECT_CLASS_DEFAULT     0
+
+#define NF_CT_EXPECT_PERMANENT 0x1
+#define NF_CT_EXPECT_INACTIVE  0x2
 
 int nf_conntrack_expect_init(void);
 void nf_conntrack_expect_fini(void);
@@ -74,10 +86,10 @@ void nf_ct_unexpect_related(struct nf_conntrack_expect *exp);
 /* Allocate space for an expectation: this is mandatory before calling
    nf_ct_expect_related.  You will have to call put afterwards. */
 struct nf_conntrack_expect *nf_ct_expect_alloc(struct nf_conn *me);
-void nf_ct_expect_init(struct nf_conntrack_expect *, int,
-                      union nf_inet_addr *,
-                      union nf_inet_addr *,
-                      u_int8_t, __be16 *, __be16 *);
+void nf_ct_expect_init(struct nf_conntrack_expect *, unsigned int, int,
+                      const union nf_inet_addr *,
+                      const union nf_inet_addr *,
+                      u_int8_t, const __be16 *, const __be16 *);
 void nf_ct_expect_put(struct nf_conntrack_expect *exp);
 int nf_ct_expect_related(struct nf_conntrack_expect *expect);
 
index 4ca125e9b3ce30870cfde5182d4b8000c4925920..f8060ab5a0839d39373249d778db5b8e1fbe6830 100644 (file)
@@ -20,9 +20,7 @@ struct nf_conntrack_helper
 
        const char *name;               /* name of the module */
        struct module *me;              /* pointer to self */
-       unsigned int max_expected;      /* Maximum number of concurrent 
-                                        * expected connections */
-       unsigned int timeout;           /* timeout for expecteds */
+       const struct nf_conntrack_expect_policy *expect_policy;
 
        /* Tuple of things we will help (compared against server response) */
        struct nf_conntrack_tuple tuple;
@@ -37,6 +35,7 @@ struct nf_conntrack_helper
        void (*destroy)(struct nf_conn *ct);
 
        int (*to_nlattr)(struct sk_buff *skb, const struct nf_conn *ct);
+       unsigned int expect_class_max;
 };
 
 extern struct nf_conntrack_helper *
index e69ab2e875973f205cd9e569c82dbfb6e08ab0d4..168c91754d895ebda49e2bb5f520e4c3a7a7443a 100644 (file)
@@ -113,11 +113,39 @@ struct nf_conntrack_tuple_mask
 
 #ifdef __KERNEL__
 
-#define NF_CT_DUMP_TUPLE(tp)                                                \
-pr_debug("tuple %p: %u %u " NIP6_FMT " %hu -> " NIP6_FMT " %hu\n",          \
-        (tp), (tp)->src.l3num, (tp)->dst.protonum,                          \
-        NIP6(*(struct in6_addr *)(tp)->src.u3.all), ntohs((tp)->src.u.all), \
-        NIP6(*(struct in6_addr *)(tp)->dst.u3.all), ntohs((tp)->dst.u.all))
+static inline void nf_ct_dump_tuple_ip(const struct nf_conntrack_tuple *t)
+{
+#ifdef DEBUG
+       printk("tuple %p: %u " NIPQUAD_FMT ":%hu -> " NIPQUAD_FMT ":%hu\n",
+              t, t->dst.protonum,
+              NIPQUAD(t->src.u3.ip), ntohs(t->src.u.all),
+              NIPQUAD(t->dst.u3.ip), ntohs(t->dst.u.all));
+#endif
+}
+
+static inline void nf_ct_dump_tuple_ipv6(const struct nf_conntrack_tuple *t)
+{
+#ifdef DEBUG
+       printk("tuple %p: %u " NIP6_FMT " %hu -> " NIP6_FMT " %hu\n",
+              t, t->dst.protonum,
+              NIP6(*(struct in6_addr *)t->src.u3.all), ntohs(t->src.u.all),
+              NIP6(*(struct in6_addr *)t->dst.u3.all), ntohs(t->dst.u.all));
+#endif
+}
+
+static inline void nf_ct_dump_tuple(const struct nf_conntrack_tuple *t)
+{
+       switch (t->src.l3num) {
+       case AF_INET:
+               nf_ct_dump_tuple_ip(t);
+               break;
+       case AF_INET6:
+               nf_ct_dump_tuple_ipv6(t);
+               break;
+       }
+}
+
+#define NF_CT_DUMP_TUPLE(tp)   nf_ct_dump_tuple(tp)
 
 /* If we're the first tuple, it's the original dir. */
 #define NF_CT_DIRECTION(h)                                             \
@@ -135,10 +163,7 @@ struct nf_conntrack_tuple_hash
 static inline int __nf_ct_tuple_src_equal(const struct nf_conntrack_tuple *t1,
                                          const struct nf_conntrack_tuple *t2)
 { 
-       return (t1->src.u3.all[0] == t2->src.u3.all[0] &&
-               t1->src.u3.all[1] == t2->src.u3.all[1] &&
-               t1->src.u3.all[2] == t2->src.u3.all[2] &&
-               t1->src.u3.all[3] == t2->src.u3.all[3] &&
+       return (nf_inet_addr_cmp(&t1->src.u3, &t2->src.u3) &&
                t1->src.u.all == t2->src.u.all &&
                t1->src.l3num == t2->src.l3num);
 }
@@ -146,10 +171,7 @@ static inline int __nf_ct_tuple_src_equal(const struct nf_conntrack_tuple *t1,
 static inline int __nf_ct_tuple_dst_equal(const struct nf_conntrack_tuple *t1,
                                          const struct nf_conntrack_tuple *t2)
 {
-       return (t1->dst.u3.all[0] == t2->dst.u3.all[0] &&
-               t1->dst.u3.all[1] == t2->dst.u3.all[1] &&
-               t1->dst.u3.all[2] == t2->dst.u3.all[2] &&
-               t1->dst.u3.all[3] == t2->dst.u3.all[3] &&
+       return (nf_inet_addr_cmp(&t1->dst.u3, &t2->dst.u3) &&
                t1->dst.u.all == t2->dst.u.all &&
                t1->dst.protonum == t2->dst.protonum);
 }
@@ -164,10 +186,7 @@ static inline int nf_ct_tuple_equal(const struct nf_conntrack_tuple *t1,
 static inline int nf_ct_tuple_mask_equal(const struct nf_conntrack_tuple_mask *m1,
                                         const struct nf_conntrack_tuple_mask *m2)
 {
-       return (m1->src.u3.all[0] == m2->src.u3.all[0] &&
-               m1->src.u3.all[1] == m2->src.u3.all[1] &&
-               m1->src.u3.all[2] == m2->src.u3.all[2] &&
-               m1->src.u3.all[3] == m2->src.u3.all[3] &&
+       return (nf_inet_addr_cmp(&m1->src.u3, &m2->src.u3) &&
                m1->src.u.all == m2->src.u.all);
 }
 
index 28dba925663c01817743209429593413bef6a1af..c6338802e8f11a4f727b4a45959dcb32725c6760 100644 (file)
@@ -160,7 +160,7 @@ static inline int ip_route_connect(struct rtable **rp, __be32 dst,
                                         .dport = dport } } };
 
        int err;
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
        if (!dst || !src) {
                err = __ip_route_output_key(net, rp, &fl);
                if (err)
@@ -188,7 +188,7 @@ static inline int ip_route_newports(struct rtable **rp, u8 protocol,
                ip_rt_put(*rp);
                *rp = NULL;
                security_sk_classify_flow(sk, &fl);
-               return ip_route_output_flow(sk->sk_net, rp, &fl, sk, 0);
+               return ip_route_output_flow(sock_net(sk), rp, &fl, sk, 0);
        }
        return 0;
 }
index b433b1ed203dae905d5b6284625775ce1a6c7405..7e0d4a0c4d122e6ff5afe9b3e68af4378db51dc8 100644 (file)
@@ -126,7 +126,9 @@ struct sock_common {
        atomic_t                skc_refcnt;
        unsigned int            skc_hash;
        struct proto            *skc_prot;
+#ifdef CONFIG_NET_NS
        struct net              *skc_net;
+#endif
 };
 
 /**
@@ -1345,6 +1347,24 @@ static inline void sk_eat_skb(struct sock *sk, struct sk_buff *skb, int copied_e
 }
 #endif
 
+static inline
+struct net *sock_net(const struct sock *sk)
+{
+#ifdef CONFIG_NET_NS
+       return sk->sk_net;
+#else
+       return &init_net;
+#endif
+}
+
+static inline
+void sock_net_set(struct sock *sk, const struct net *net)
+{
+#ifdef CONFIG_NET_NS
+       sk->sk_net = net;
+#endif
+}
+
 /*
  * Kernel sockets, f.e. rtnl or icmp_socket, are a part of a namespace.
  * They should not hold a referrence to a namespace in order to allow
@@ -1353,8 +1373,8 @@ static inline void sk_eat_skb(struct sock *sk, struct sk_buff *skb, int copied_e
  */
 static inline void sk_change_net(struct sock *sk, struct net *net)
 {
-       put_net(sk->sk_net);
-       sk->sk_net = net;
+       put_net(sock_net(sk));
+       sock_net_set(sk, net);
 }
 
 extern void sock_enable_timestamp(struct sock *sk);
index dbc81b96509666595a7e02265446be3c8076e45b..c35dc230365c7cbc0f52ecfd976b6e933f7b7b8d 100644 (file)
@@ -382,7 +382,7 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
        int i, flgs;
        struct net_device *vlandev;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        if (!grp)
index 1e5c9904571d27a78a90761aeb3882f1bf3bfa57..e536162b1ebc59a8b44c311ea72807e12cd15c2c 100644 (file)
@@ -153,7 +153,7 @@ int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev,
        struct net_device_stats *stats;
        unsigned short vlan_TCI;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                goto err_free;
 
        skb = skb_share_check(skb, GFP_ATOMIC);
index 61166f66479f770a1e63701a4597ec80709a2972..25aa37ce94306c4aad182e2da71ada5b579eceee 100644 (file)
@@ -333,7 +333,7 @@ static int aarp_device_event(struct notifier_block *this, unsigned long event,
        struct net_device *dev = ptr;
        int ct;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        if (event == NETDEV_DOWN) {
@@ -716,7 +716,7 @@ static int aarp_rcv(struct sk_buff *skb, struct net_device *dev,
        struct atalk_addr sa, *ma, da;
        struct atalk_iface *ifa;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                goto out0;
 
        /* We only do Ethernet SNAP AARP. */
index 3be55c8ca4ef660f8cabab3786d0ace8daa4de9d..44cd42f7786b8de0763fd29a3dfcee084726b6cc 100644 (file)
@@ -648,7 +648,7 @@ static int ddp_device_event(struct notifier_block *this, unsigned long event,
 {
        struct net_device *dev = ptr;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        if (event == NETDEV_DOWN)
@@ -1405,7 +1405,7 @@ static int atalk_rcv(struct sk_buff *skb, struct net_device *dev,
        int origlen;
        __u16 len_hops;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                goto freeit;
 
        /* Don't mangle buffer if shared */
@@ -1493,7 +1493,7 @@ freeit:
 static int ltalk_rcv(struct sk_buff *skb, struct net_device *dev,
                     struct packet_type *pt, struct net_device *orig_dev)
 {
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                goto freeit;
 
        /* Expand any short form frames */
index e82da674672355e5db011a6f00df73456e4e5a70..6f8223ebf551546d8be39503ba4c6489adeb0348 100644 (file)
@@ -612,7 +612,7 @@ static int clip_device_event(struct notifier_block *this, unsigned long event,
 {
        struct net_device *dev = arg;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        if (event == NETDEV_UNREGISTER) {
index 9c7f712fc7e9c331e4dcd3c3b1d9c0fbdae3b01b..9db332e7a6c091f1b3996da838af5b1d52b10f7e 100644 (file)
@@ -964,7 +964,7 @@ static int mpoa_event_listener(struct notifier_block *mpoa_notifier, unsigned lo
 
        dev = (struct net_device *)dev_ptr;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        if (dev->name == NULL || strncmp(dev->name, "lec", 3))
index daf9a48a7db04454392fda10fd1f8c142f27b930..de1e4f2f3a43ea983f9a4eef973618772b69cc82 100644 (file)
@@ -326,7 +326,7 @@ static int svc_accept(struct socket *sock,struct socket *newsock,int flags)
 
        lock_sock(sk);
 
-       error = svc_create(sk->sk_net, newsock,0);
+       error = svc_create(sock_net(sk), newsock,0);
        if (error)
                goto out;
 
index 48bfcc741f2595db4f8d4f674e43f6a65751f608..2712544cf0cac124fcc2d9985d005d01968a3cec 100644 (file)
@@ -116,7 +116,7 @@ static int ax25_device_event(struct notifier_block *this, unsigned long event,
 {
        struct net_device *dev = (struct net_device *)ptr;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        /* Reject non AX.25 devices */
@@ -869,7 +869,7 @@ struct sock *ax25_make_new(struct sock *osk, struct ax25_dev *ax25_dev)
        struct sock *sk;
        ax25_cb *ax25, *oax25;
 
-       sk = sk_alloc(osk->sk_net, PF_AX25, GFP_ATOMIC, osk->sk_prot);
+       sk = sk_alloc(sock_net(osk), PF_AX25, GFP_ATOMIC,       osk->sk_prot);
        if (sk == NULL)
                return NULL;
 
index d1be080dcb25c242d9af620470f20bd3cf8de307..33790a8efbc89ad1b02f3e39f99fbb2a48cc6ff6 100644 (file)
@@ -451,7 +451,7 @@ int ax25_kiss_rcv(struct sk_buff *skb, struct net_device *dev,
        skb->sk = NULL;         /* Initially we don't know who it's for */
        skb->destructor = NULL; /* Who initializes this, dammit?! */
 
-       if (dev->nd_net != &init_net) {
+       if (dev_net(dev) != &init_net) {
                kfree_skb(skb);
                return 0;
        }
index 34f8bf98bc0529b4d69f7c60ff6f739ed63077a3..6b995ac832f5f4fa5f7ab6c9e66c239afdd68bcf 100644 (file)
@@ -1499,7 +1499,7 @@ static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hd
                goto response;
        }
 
-       sk = l2cap_sock_alloc(parent->sk_net, NULL, BTPROTO_L2CAP, GFP_ATOMIC);
+       sk = l2cap_sock_alloc(sock_net(parent), NULL, BTPROTO_L2CAP, GFP_ATOMIC);
        if (!sk)
                goto response;
 
index c46d51035e77fa9e1f4db6e95fadb3f2e17f3e60..c103fa02893b23015802f3dd28f623b8b8a146d2 100644 (file)
@@ -868,7 +868,7 @@ int rfcomm_connect_ind(struct rfcomm_session *s, u8 channel, struct rfcomm_dlc *
                goto done;
        }
 
-       sk = rfcomm_sock_alloc(parent->sk_net, NULL, BTPROTO_RFCOMM, GFP_ATOMIC);
+       sk = rfcomm_sock_alloc(sock_net(parent), NULL, BTPROTO_RFCOMM, GFP_ATOMIC);
        if (!sk)
                goto done;
 
index b91d3c81a73c58981ab105dd952bcafc65df35c6..2a5953b4405d05b6908439134e73179ece873483 100644 (file)
@@ -803,7 +803,7 @@ static void sco_conn_ready(struct sco_conn *conn)
 
                bh_lock_sock(parent);
 
-               sk = sco_sock_alloc(parent->sk_net, NULL, BTPROTO_SCO, GFP_ATOMIC);
+               sk = sco_sock_alloc(sock_net(parent), NULL, BTPROTO_SCO, GFP_ATOMIC);
                if (!sk) {
                        bh_unlock_sock(parent);
                        goto done;
index f5d69336d97b037eff3e912cd3e596b639e0ef0c..f155e6ce8a215de9a8172443348bc13c6732cec2 100644 (file)
@@ -108,7 +108,7 @@ errout:
  */
 static int br_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct net_device *dev;
        int idx;
 
@@ -140,7 +140,7 @@ skip:
  */
 static int br_rtm_setlink(struct sk_buff *skb,  struct nlmsghdr *nlh, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct ifinfomsg *ifm;
        struct nlattr *protinfo;
        struct net_device *dev;
index 07ac3ae68d8ff089000a78c19024a5d40c3baf9a..00644a544e3cdbb276975ce619ae0e7a93be9dbf 100644 (file)
@@ -37,7 +37,7 @@ static int br_device_event(struct notifier_block *unused, unsigned long event, v
        struct net_bridge_port *p = dev->br_port;
        struct net_bridge *br;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        /* not a port of a bridge */
index 0edbd2a1c3f3cafe6d2046360f92b5a9084235f3..8deab645ef757d5f415e91f7ef1e07b81c3738b0 100644 (file)
@@ -142,7 +142,7 @@ int br_stp_rcv(struct sk_buff *skb, struct net_device *dev,
        struct net_bridge *br;
        const unsigned char *buf;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                goto err;
 
        if (!p)
index 36b9f22ed83a4aa668478a2a0b3502fcb2a7b3ba..2759b76f731c30461d6205db15e1c2bad4efb8c4 100644 (file)
@@ -599,7 +599,7 @@ static int can_rcv(struct sk_buff *skb, struct net_device *dev,
        struct dev_rcv_lists *d;
        int matches;
 
-       if (dev->type != ARPHRD_CAN || dev->nd_net != &init_net) {
+       if (dev->type != ARPHRD_CAN || dev_net(dev) != &init_net) {
                kfree_skb(skb);
                return 0;
        }
@@ -710,7 +710,7 @@ static int can_notifier(struct notifier_block *nb, unsigned long msg,
        struct net_device *dev = (struct net_device *)data;
        struct dev_rcv_lists *d;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        if (dev->type != ARPHRD_CAN)
index bd4282dae7540cf8eeeab7d8605c08e06aca8c95..e9f99b2c6bc9c985697348f8965f438eb7998789 100644 (file)
@@ -1285,7 +1285,7 @@ static int bcm_notifier(struct notifier_block *nb, unsigned long msg,
        struct bcm_op *op;
        int notify_enodev = 0;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        if (dev->type != ARPHRD_CAN)
index 94cd7f27c44470109263bd653301e9944b403496..ead50c7c0d40f54e8b05d7b1c9e04cdef5b92fb2 100644 (file)
@@ -210,7 +210,7 @@ static int raw_notifier(struct notifier_block *nb,
        struct raw_sock *ro = container_of(nb, struct raw_sock, notifier);
        struct sock *sk = &ro->sk;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        if (dev->type != ARPHRD_CAN)
index aebd0860604089ac262dbc44832385e660ee6452..75c3f7f4edd59521c6923b02115f55166af36072 100644 (file)
@@ -216,7 +216,7 @@ static inline struct hlist_head *dev_index_hash(struct net *net, int ifindex)
 /* Device list insertion */
 static int list_netdevice(struct net_device *dev)
 {
-       struct net *net = dev->nd_net;
+       struct net *net = dev_net(dev);
 
        ASSERT_RTNL();
 
@@ -852,8 +852,8 @@ int dev_alloc_name(struct net_device *dev, const char *name)
        struct net *net;
        int ret;
 
-       BUG_ON(!dev->nd_net);
-       net = dev->nd_net;
+       BUG_ON(!dev_net(dev));
+       net = dev_net(dev);
        ret = __dev_alloc_name(net, name, buf);
        if (ret >= 0)
                strlcpy(dev->name, buf, IFNAMSIZ);
@@ -877,9 +877,9 @@ int dev_change_name(struct net_device *dev, char *newname)
        struct net *net;
 
        ASSERT_RTNL();
-       BUG_ON(!dev->nd_net);
+       BUG_ON(!dev_net(dev));
 
-       net = dev->nd_net;
+       net = dev_net(dev);
        if (dev->flags & IFF_UP)
                return -EBUSY;
 
@@ -2615,7 +2615,7 @@ static int ptype_seq_show(struct seq_file *seq, void *v)
 
        if (v == SEQ_START_TOKEN)
                seq_puts(seq, "Type Device      Function\n");
-       else if (pt->dev == NULL || pt->dev->nd_net == seq_file_net(seq)) {
+       else if (pt->dev == NULL || dev_net(pt->dev) == seq_file_net(seq)) {
                if (pt->type == htons(ETH_P_ALL))
                        seq_puts(seq, "ALL ");
                else
@@ -3689,8 +3689,8 @@ int register_netdevice(struct net_device *dev)
 
        /* When net_device's are persistent, this will be fatal. */
        BUG_ON(dev->reg_state != NETREG_UNINITIALIZED);
-       BUG_ON(!dev->nd_net);
-       net = dev->nd_net;
+       BUG_ON(!dev_net(dev));
+       net = dev_net(dev);
 
        spin_lock_init(&dev->queue_lock);
        spin_lock_init(&dev->_xmit_lock);
@@ -4011,7 +4011,7 @@ struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name,
        dev = (struct net_device *)
                (((long)p + NETDEV_ALIGN_CONST) & ~NETDEV_ALIGN_CONST);
        dev->padded = (char *)dev - (char *)p;
-       dev->nd_net = &init_net;
+       dev_net_set(dev, &init_net);
 
        if (sizeof_priv) {
                dev->priv = ((char *)dev +
@@ -4136,7 +4136,7 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char
 
        /* Get out if there is nothing todo */
        err = 0;
-       if (dev->nd_net == net)
+       if (net_eq(dev_net(dev), net))
                goto out;
 
        /* Pick the destination device name, and ensure
@@ -4187,7 +4187,7 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char
        dev_addr_discard(dev);
 
        /* Actually switch the network namespace */
-       dev->nd_net = net;
+       dev_net_set(dev, net);
 
        /* Assign the new device name */
        if (destname != dev->name)
index 3a01a819ba478112168e4a3c2db3b3ac023b8e67..694cd2a3f6d2411fadae740293f1545e452e35c4 100644 (file)
@@ -279,7 +279,7 @@ static inline void dst_ifdown(struct dst_entry *dst, struct net_device *dev,
        if (!unregister) {
                dst->input = dst->output = dst_discard;
        } else {
-               dst->dev = dst->dev->nd_net->loopback_dev;
+               dst->dev = dev_net(dst->dev)->loopback_dev;
                dev_hold(dst->dev);
                dev_put(dev);
                if (dst->neighbour && dst->neighbour->dev == dev) {
index 42ccaf5b85097f43842a9e394dbc082795e80b30..540c07283e3128b7a836127440d0176c735cc1d3 100644 (file)
@@ -214,7 +214,7 @@ errout:
 
 static int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct fib_rule_hdr *frh = nlmsg_data(nlh);
        struct fib_rules_ops *ops = NULL;
        struct fib_rule *rule, *r, *last = NULL;
@@ -352,7 +352,7 @@ errout:
 
 static int fib_nl_delrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct fib_rule_hdr *frh = nlmsg_data(nlh);
        struct fib_rules_ops *ops = NULL;
        struct fib_rule *rule, *tmp;
@@ -534,7 +534,7 @@ skip:
 
 static int fib_nl_dumprule(struct sk_buff *skb, struct netlink_callback *cb)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct fib_rules_ops *ops;
        int idx = 0, family;
 
@@ -618,7 +618,7 @@ static int fib_rules_event(struct notifier_block *this, unsigned long event,
                            void *ptr)
 {
        struct net_device *dev = ptr;
-       struct net *net = dev->nd_net;
+       struct net *net = dev_net(dev);
        struct fib_rules_ops *ops;
 
        ASSERT_RTNL();
index 23c0a10c0c379463258d0a86bf2a4bb0139d84fa..857915a12c15d67c2b87da2cfa499c283dbce918 100644 (file)
@@ -388,7 +388,7 @@ struct neighbour *neigh_lookup_nodev(struct neigh_table *tbl, struct net *net,
        hash_val = tbl->hash(pkey, NULL);
        for (n = tbl->hash_buckets[hash_val & tbl->hash_mask]; n; n = n->next) {
                if (!memcmp(n->primary_key, pkey, key_len) &&
-                   (net == n->dev->nd_net)) {
+                   net_eq(dev_net(n->dev), net)) {
                        neigh_hold(n);
                        NEIGH_CACHE_STAT_INC(tbl, hits);
                        break;
@@ -483,7 +483,7 @@ struct pneigh_entry * pneigh_lookup(struct neigh_table *tbl,
 
        for (n = tbl->phash_buckets[hash_val]; n; n = n->next) {
                if (!memcmp(n->key, pkey, key_len) &&
-                   (n->net == net) &&
+                   net_eq(pneigh_net(n), net) &&
                    (n->dev == dev || !n->dev)) {
                        read_unlock_bh(&tbl->lock);
                        goto out;
@@ -500,7 +500,9 @@ struct pneigh_entry * pneigh_lookup(struct neigh_table *tbl,
        if (!n)
                goto out;
 
+#ifdef CONFIG_NET_NS
        n->net = hold_net(net);
+#endif
        memcpy(n->key, pkey, key_len);
        n->dev = dev;
        if (dev)
@@ -540,14 +542,14 @@ int pneigh_delete(struct neigh_table *tbl, struct net *net, const void *pkey,
        for (np = &tbl->phash_buckets[hash_val]; (n = *np) != NULL;
             np = &n->next) {
                if (!memcmp(n->key, pkey, key_len) && n->dev == dev &&
-                   (n->net == net)) {
+                   net_eq(pneigh_net(n), net)) {
                        *np = n->next;
                        write_unlock_bh(&tbl->lock);
                        if (tbl->pdestructor)
                                tbl->pdestructor(n);
                        if (n->dev)
                                dev_put(n->dev);
-                       release_net(n->net);
+                       release_net(pneigh_net(n));
                        kfree(n);
                        return 0;
                }
@@ -570,7 +572,7 @@ static int pneigh_ifdown(struct neigh_table *tbl, struct net_device *dev)
                                        tbl->pdestructor(n);
                                if (n->dev)
                                        dev_put(n->dev);
-                               release_net(n->net);
+                               release_net(pneigh_net(n));
                                kfree(n);
                                continue;
                        }
@@ -1284,7 +1286,7 @@ static inline struct neigh_parms *lookup_neigh_params(struct neigh_table *tbl,
        struct neigh_parms *p;
 
        for (p = &tbl->parms; p; p = p->next) {
-               if ((p->dev && p->dev->ifindex == ifindex && p->net == net) ||
+               if ((p->dev && p->dev->ifindex == ifindex && net_eq(neigh_parms_net(p), net)) ||
                    (!p->dev && !ifindex))
                        return p;
        }
@@ -1298,7 +1300,7 @@ struct neigh_parms *neigh_parms_alloc(struct net_device *dev,
        struct neigh_parms *p, *ref;
        struct net *net;
 
-       net = dev->nd_net;
+       net = dev_net(dev);
        ref = lookup_neigh_params(tbl, net, 0);
        if (!ref)
                return NULL;
@@ -1318,7 +1320,9 @@ struct neigh_parms *neigh_parms_alloc(struct net_device *dev,
 
                dev_hold(dev);
                p->dev = dev;
+#ifdef CONFIG_NET_NS
                p->net = hold_net(net);
+#endif
                p->sysctl_table = NULL;
                write_lock_bh(&tbl->lock);
                p->next         = tbl->parms.next;
@@ -1360,7 +1364,7 @@ void neigh_parms_release(struct neigh_table *tbl, struct neigh_parms *parms)
 
 static void neigh_parms_destroy(struct neigh_parms *parms)
 {
-       release_net(parms->net);
+       release_net(neigh_parms_net(parms));
        kfree(parms);
 }
 
@@ -1371,7 +1375,9 @@ void neigh_table_init_no_netlink(struct neigh_table *tbl)
        unsigned long now = jiffies;
        unsigned long phsize;
 
+#ifdef CONFIG_NET_NS
        tbl->parms.net = &init_net;
+#endif
        atomic_set(&tbl->parms.refcnt, 1);
        INIT_RCU_HEAD(&tbl->parms.rcu_head);
        tbl->parms.reachable_time =
@@ -1478,7 +1484,7 @@ int neigh_table_clear(struct neigh_table *tbl)
 
 static int neigh_delete(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct ndmsg *ndm;
        struct nlattr *dst_attr;
        struct neigh_table *tbl;
@@ -1544,7 +1550,7 @@ out:
 
 static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct ndmsg *ndm;
        struct nlattr *tb[NDA_MAX+1];
        struct neigh_table *tbl;
@@ -1812,7 +1818,7 @@ static const struct nla_policy nl_ntbl_parm_policy[NDTPA_MAX+1] = {
 
 static int neightbl_set(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct neigh_table *tbl;
        struct ndtmsg *ndtmsg;
        struct nlattr *tb[NDTA_MAX+1];
@@ -1937,7 +1943,7 @@ errout:
 
 static int neightbl_dump_info(struct sk_buff *skb, struct netlink_callback *cb)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        int family, tidx, nidx = 0;
        int tbl_skip = cb->args[0];
        int neigh_skip = cb->args[1];
@@ -1958,7 +1964,7 @@ static int neightbl_dump_info(struct sk_buff *skb, struct netlink_callback *cb)
                        break;
 
                for (nidx = 0, p = tbl->parms.next; p; p = p->next) {
-                       if (net != p->net)
+                       if (!net_eq(neigh_parms_net(p), net))
                                continue;
 
                        if (nidx++ < neigh_skip)
@@ -2037,7 +2043,7 @@ static void neigh_update_notify(struct neighbour *neigh)
 static int neigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb,
                            struct netlink_callback *cb)
 {
-       struct net * net = skb->sk->sk_net;
+       struct net * net = sock_net(skb->sk);
        struct neighbour *n;
        int rc, h, s_h = cb->args[1];
        int idx, s_idx = idx = cb->args[2];
@@ -2050,7 +2056,7 @@ static int neigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb,
                        s_idx = 0;
                for (n = tbl->hash_buckets[h], idx = 0; n; n = n->next) {
                        int lidx;
-                       if (n->dev->nd_net != net)
+                       if (dev_net(n->dev) != net)
                                continue;
                        lidx = idx++;
                        if (lidx < s_idx)
@@ -2145,7 +2151,7 @@ EXPORT_SYMBOL(__neigh_for_each_release);
 static struct neighbour *neigh_get_first(struct seq_file *seq)
 {
        struct neigh_seq_state *state = seq->private;
-       struct net *net = state->p.net;
+       struct net *net = seq_file_net(seq);
        struct neigh_table *tbl = state->tbl;
        struct neighbour *n = NULL;
        int bucket = state->bucket;
@@ -2155,7 +2161,7 @@ static struct neighbour *neigh_get_first(struct seq_file *seq)
                n = tbl->hash_buckets[bucket];
 
                while (n) {
-                       if (n->dev->nd_net != net)
+                       if (!net_eq(dev_net(n->dev), net))
                                goto next;
                        if (state->neigh_sub_iter) {
                                loff_t fakep = 0;
@@ -2186,7 +2192,7 @@ static struct neighbour *neigh_get_next(struct seq_file *seq,
                                        loff_t *pos)
 {
        struct neigh_seq_state *state = seq->private;
-       struct net *net = state->p.net;
+       struct net *net = seq_file_net(seq);
        struct neigh_table *tbl = state->tbl;
 
        if (state->neigh_sub_iter) {
@@ -2198,7 +2204,7 @@ static struct neighbour *neigh_get_next(struct seq_file *seq,
 
        while (1) {
                while (n) {
-                       if (n->dev->nd_net != net)
+                       if (!net_eq(dev_net(n->dev), net))
                                goto next;
                        if (state->neigh_sub_iter) {
                                void *v = state->neigh_sub_iter(state, n, pos);
@@ -2246,7 +2252,7 @@ static struct neighbour *neigh_get_idx(struct seq_file *seq, loff_t *pos)
 static struct pneigh_entry *pneigh_get_first(struct seq_file *seq)
 {
        struct neigh_seq_state *state = seq->private;
-       struct net * net = state->p.net;
+       struct net *net = seq_file_net(seq);
        struct neigh_table *tbl = state->tbl;
        struct pneigh_entry *pn = NULL;
        int bucket = state->bucket;
@@ -2254,7 +2260,7 @@ static struct pneigh_entry *pneigh_get_first(struct seq_file *seq)
        state->flags |= NEIGH_SEQ_IS_PNEIGH;
        for (bucket = 0; bucket <= PNEIGH_HASHMASK; bucket++) {
                pn = tbl->phash_buckets[bucket];
-               while (pn && (pn->net != net))
+               while (pn && !net_eq(pneigh_net(pn), net))
                        pn = pn->next;
                if (pn)
                        break;
@@ -2269,7 +2275,7 @@ static struct pneigh_entry *pneigh_get_next(struct seq_file *seq,
                                            loff_t *pos)
 {
        struct neigh_seq_state *state = seq->private;
-       struct net * net = state->p.net;
+       struct net *net = seq_file_net(seq);
        struct neigh_table *tbl = state->tbl;
 
        pn = pn->next;
@@ -2277,7 +2283,7 @@ static struct pneigh_entry *pneigh_get_next(struct seq_file *seq,
                if (++state->bucket > PNEIGH_HASHMASK)
                        break;
                pn = tbl->phash_buckets[state->bucket];
-               while (pn && (pn->net != net))
+               while (pn && !net_eq(pneigh_net(pn), net))
                        pn = pn->next;
                if (pn)
                        break;
@@ -2482,7 +2488,7 @@ static inline size_t neigh_nlmsg_size(void)
 
 static void __neigh_notify(struct neighbour *n, int type, int flags)
 {
-       struct net *net = n->dev->nd_net;
+       struct net *net = dev_net(n->dev);
        struct sk_buff *skb;
        int err = -ENOBUFS;
 
@@ -2740,7 +2746,7 @@ int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p,
        neigh_path[NEIGH_CTL_PATH_PROTO].ctl_name = p_id;
 
        t->sysctl_header =
-               register_net_sysctl_table(p->net, neigh_path, t->neigh_vars);
+               register_net_sysctl_table(neigh_parms_net(p), neigh_path, t->neigh_vars);
        if (!t->sysctl_header)
                goto free_procname;
 
index 20e63b302ba613ea7112365376d0773f4a7a8fbf..a803b442234c5ae1ddee3a89fe9cf04e126f97b3 100644 (file)
@@ -1874,7 +1874,7 @@ static int pktgen_device_event(struct notifier_block *unused,
 {
        struct net_device *dev = ptr;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        /* It is OK that we do not hold the group lock right now,
index 2bd9c5f7627dd84b450ec3f105263979adda77e3..da99ac0871bfefe6f3384ce297f2187261907e1a 100644 (file)
@@ -662,7 +662,7 @@ nla_put_failure:
 
 static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        int idx;
        int s_idx = cb->args[0];
        struct net_device *dev;
@@ -879,7 +879,7 @@ errout:
 
 static int rtnl_setlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct ifinfomsg *ifm;
        struct net_device *dev;
        int err;
@@ -921,7 +921,7 @@ errout:
 
 static int rtnl_dellink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        const struct rtnl_link_ops *ops;
        struct net_device *dev;
        struct ifinfomsg *ifm;
@@ -972,7 +972,7 @@ struct net_device *rtnl_create_link(struct net *net, char *ifname,
                        goto err_free;
        }
 
-       dev->nd_net = net;
+       dev_net_set(dev, net);
        dev->rtnl_link_ops = ops;
 
        if (tb[IFLA_MTU])
@@ -1000,7 +1000,7 @@ err:
 
 static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        const struct rtnl_link_ops *ops;
        struct net_device *dev;
        struct ifinfomsg *ifm;
@@ -1132,7 +1132,7 @@ replay:
 
 static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct ifinfomsg *ifm;
        struct nlattr *tb[IFLA_MAX+1];
        struct net_device *dev = NULL;
@@ -1198,7 +1198,7 @@ static int rtnl_dump_all(struct sk_buff *skb, struct netlink_callback *cb)
 
 void rtmsg_ifinfo(int type, struct net_device *dev, unsigned change)
 {
-       struct net *net = dev->nd_net;
+       struct net *net = dev_net(dev);
        struct sk_buff *skb;
        int err = -ENOBUFS;
 
@@ -1227,7 +1227,7 @@ static int rtattr_max;
 
 static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        rtnl_doit_func doit;
        int sz_idx, kind;
        int min_len;
index b1a6ed4d33c19ec7a9d58f9f0249445708473e81..3ee95060dbd0b9eb9e73a9ae9f30a4b043d91f64 100644 (file)
@@ -372,7 +372,7 @@ static int sock_bindtodevice(struct sock *sk, char __user *optval, int optlen)
 {
        int ret = -ENOPROTOOPT;
 #ifdef CONFIG_NETDEVICES
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
        char devname[IFNAMSIZ];
        int index;
 
@@ -958,7 +958,7 @@ struct sock *sk_alloc(struct net *net, int family, gfp_t priority,
                 */
                sk->sk_prot = sk->sk_prot_creator = prot;
                sock_lock_init(sk);
-               sk->sk_net = get_net(net);
+               sock_net_set(sk, get_net(net));
        }
 
        return sk;
@@ -983,7 +983,7 @@ void sk_free(struct sock *sk)
                printk(KERN_DEBUG "%s: optmem leakage (%d bytes) detected.\n",
                       __func__, atomic_read(&sk->sk_omem_alloc));
 
-       put_net(sk->sk_net);
+       put_net(sock_net(sk));
        sk_prot_free(sk->sk_prot_creator, sk);
 }
 
@@ -1001,7 +1001,7 @@ void sk_release_kernel(struct sock *sk)
 
        sock_hold(sk);
        sock_release(sk->sk_socket);
-       sk->sk_net = get_net(&init_net);
+       sock_net_set(sk, get_net(&init_net));
        sock_put(sk);
 }
 EXPORT_SYMBOL(sk_release_kernel);
@@ -1017,7 +1017,7 @@ struct sock *sk_clone(const struct sock *sk, const gfp_t priority)
                sock_copy(newsk, sk);
 
                /* SANITY */
-               get_net(newsk->sk_net);
+               get_net(sock_net(newsk));
                sk_node_init(&newsk->sk_node);
                sock_lock_init(newsk);
                bh_lock_sock(newsk);
index 23fd95a7ad15bc758f1335d46d451b291268bffd..fc2efe899e9104fe9f91a8deb4bb28974dbb4381 100644 (file)
@@ -1094,7 +1094,7 @@ static int dn_accept(struct socket *sock, struct socket *newsock, int flags)
 
        cb = DN_SKB_CB(skb);
        sk->sk_ack_backlog--;
-       newsk = dn_alloc_sock(sk->sk_net, newsock, sk->sk_allocation);
+       newsk = dn_alloc_sock(sock_net(sk), newsock, sk->sk_allocation);
        if (newsk == NULL) {
                release_sock(sk);
                kfree_skb(skb);
@@ -2089,7 +2089,7 @@ static int dn_device_event(struct notifier_block *this, unsigned long event,
 {
        struct net_device *dev = (struct net_device *)ptr;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        switch(event) {
index 1bbfce5f7a2dc851094d2a3e286f2e17a642864d..2f0ac3c3eb710e409ee41323b22f6f64fa2a5342 100644 (file)
@@ -625,7 +625,7 @@ static const struct nla_policy dn_ifa_policy[IFA_MAX+1] = {
 
 static int dn_nl_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct nlattr *tb[IFA_MAX+1];
        struct dn_dev *dn_db;
        struct ifaddrmsg *ifm;
@@ -663,7 +663,7 @@ errout:
 
 static int dn_nl_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct nlattr *tb[IFA_MAX+1];
        struct net_device *dev;
        struct dn_dev *dn_db;
@@ -779,7 +779,7 @@ errout:
 
 static int dn_nl_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        int idx, dn_idx = 0, skip_ndevs, skip_naddr;
        struct net_device *dev;
        struct dn_dev *dn_db;
index 4aa9a423e606360e959ad54d83595d9281bde2a4..27ea2e9b080a47a195f99f96370d4db06dbfa186 100644 (file)
@@ -504,7 +504,7 @@ static int dn_fib_check_attr(struct rtmsg *r, struct rtattr **rta)
 
 static int dn_fib_rtm_delroute(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct dn_fib_table *tb;
        struct rtattr **rta = arg;
        struct rtmsg *r = NLMSG_DATA(nlh);
@@ -524,7 +524,7 @@ static int dn_fib_rtm_delroute(struct sk_buff *skb, struct nlmsghdr *nlh, void *
 
 static int dn_fib_rtm_newroute(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct dn_fib_table *tb;
        struct rtattr **rta = arg;
        struct rtmsg *r = NLMSG_DATA(nlh);
index 9dc0abb50eaf05ba0db41ed0566a0c4a9516f1c8..2f665a516476a019460046d61195310aecf5654a 100644 (file)
@@ -580,7 +580,7 @@ int dn_route_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type
        struct dn_dev *dn = (struct dn_dev *)dev->dn_ptr;
        unsigned char padlen = 0;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                goto dump_it;
 
        if (dn == NULL)
@@ -1512,7 +1512,7 @@ rtattr_failure:
  */
 static int dn_cache_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void *arg)
 {
-       struct net *net = in_skb->sk->sk_net;
+       struct net *net = sock_net(in_skb->sk);
        struct rtattr **rta = arg;
        struct rtmsg *rtm = NLMSG_DATA(nlh);
        struct dn_route *rt = NULL;
@@ -1601,7 +1601,7 @@ out_free:
  */
 int dn_cache_dump(struct sk_buff *skb, struct netlink_callback *cb)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct dn_route *rt;
        int h, s_h;
        int idx, s_idx;
index e09d915dbd776598bb66d5e142beeef8cbe4fcd8..3a2830ac89c26cbaefa8b97977d9efee26d768ed 100644 (file)
@@ -463,7 +463,7 @@ static int dn_fib_table_dump(struct dn_fib_table *tb, struct sk_buff *skb,
 
 int dn_fib_dump(struct sk_buff *skb, struct netlink_callback *cb)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        unsigned int h, s_h;
        unsigned int e = 0, s_e;
        struct dn_fib_table *tb;
index bc0f6252613f1adc43aa72258831a39989b4c39e..68d154480043577572b976b871bdeb7188075a72 100644 (file)
@@ -1064,7 +1064,7 @@ static int econet_rcv(struct sk_buff *skb, struct net_device *dev, struct packet
        struct sock *sk;
        struct ec_device *edev = dev->ec_ptr;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                goto drop;
 
        if (skb->pkt_type == PACKET_OTHERHOST)
@@ -1121,7 +1121,7 @@ static int econet_notifier(struct notifier_block *this, unsigned long msg, void
        struct net_device *dev = (struct net_device *)data;
        struct ec_device *edev;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        switch (msg) {
index 06cfb0bed631833aceeeb4b82ff00780f1b5626b..5882a13164418bb29ed985181009d0b6514d5a79 100644 (file)
@@ -464,7 +464,7 @@ int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
        if (addr_len < sizeof(struct sockaddr_in))
                goto out;
 
-       chk_addr_ret = inet_addr_type(sk->sk_net, addr->sin_addr.s_addr);
+       chk_addr_ret = inet_addr_type(sock_net(sk), addr->sin_addr.s_addr);
 
        /* Not specified by any standard per-se, however it breaks too
         * many applications when removed.  It is unfortunate since
@@ -802,7 +802,7 @@ int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 {
        struct sock *sk = sock->sk;
        int err = 0;
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
 
        switch (cmd) {
                case SIOCGSTAMP:
@@ -1132,7 +1132,7 @@ int inet_sk_rebuild_header(struct sock *sk)
        };
 
        security_sk_classify_flow(sk, &fl);
-       err = ip_route_output_flow(sk->sk_net, &rt, &fl, sk, 0);
+       err = ip_route_output_flow(sock_net(sk), &rt, &fl, sk, 0);
 }
        if (!err)
                sk_setup_caps(sk, &rt->u.dst);
index 832473e30b36637a01c2f8f8ae9920053ccd713a..3ce2e137e7bc134d6397c278e8994e8804df84be 100644 (file)
@@ -242,7 +242,7 @@ static int arp_constructor(struct neighbour *neigh)
                return -EINVAL;
        }
 
-       neigh->type = inet_addr_type(dev->nd_net, addr);
+       neigh->type = inet_addr_type(dev_net(dev), addr);
 
        parms = in_dev->arp_parms;
        __neigh_parms_put(neigh->parms);
@@ -341,14 +341,14 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb)
        switch (IN_DEV_ARP_ANNOUNCE(in_dev)) {
        default:
        case 0:         /* By default announce any local IP */
-               if (skb && inet_addr_type(dev->nd_net, ip_hdr(skb)->saddr) == RTN_LOCAL)
+               if (skb && inet_addr_type(dev_net(dev), ip_hdr(skb)->saddr) == RTN_LOCAL)
                        saddr = ip_hdr(skb)->saddr;
                break;
        case 1:         /* Restrict announcements of saddr in same subnet */
                if (!skb)
                        break;
                saddr = ip_hdr(skb)->saddr;
-               if (inet_addr_type(dev->nd_net, saddr) == RTN_LOCAL) {
+               if (inet_addr_type(dev_net(dev), saddr) == RTN_LOCAL) {
                        /* saddr should be known to target */
                        if (inet_addr_onlink(in_dev, target, saddr))
                                break;
@@ -424,7 +424,7 @@ static int arp_filter(__be32 sip, __be32 tip, struct net_device *dev)
        int flag = 0;
        /*unsigned long now; */
 
-       if (ip_route_output_key(dev->nd_net, &rt, &fl) < 0)
+       if (ip_route_output_key(dev_net(dev), &rt, &fl) < 0)
                return 1;
        if (rt->u.dst.dev != dev) {
                NET_INC_STATS_BH(LINUX_MIB_ARPFILTER);
@@ -477,7 +477,7 @@ int arp_find(unsigned char *haddr, struct sk_buff *skb)
 
        paddr = skb->rtable->rt_gateway;
 
-       if (arp_set_predefined(inet_addr_type(dev->nd_net, paddr), haddr, paddr, dev))
+       if (arp_set_predefined(inet_addr_type(dev_net(dev), paddr), haddr, paddr, dev))
                return 0;
 
        n = __neigh_lookup(&arp_tbl, &paddr, dev, 1);
@@ -709,7 +709,7 @@ static int arp_process(struct sk_buff *skb)
        u16 dev_type = dev->type;
        int addr_type;
        struct neighbour *n;
-       struct net *net = dev->nd_net;
+       struct net *net = dev_net(dev);
 
        /* arp_rcv below verifies the ARP header and verifies the device
         * is ARP'able.
@@ -858,7 +858,7 @@ static int arp_process(struct sk_buff *skb)
 
        n = __neigh_lookup(&arp_tbl, &sip, dev, 0);
 
-       if (IPV4_DEVCONF_ALL(dev->nd_net, ARP_ACCEPT)) {
+       if (IPV4_DEVCONF_ALL(dev_net(dev), ARP_ACCEPT)) {
                /* Unsolicited ARP is not accepted by default.
                   It is possible, that this option should be enabled for some
                   devices (strip is candidate)
index 4a10dbbbe0a1a653a6440f37603c39303cb1aa16..6848e4760f3454910de56008226a10b5335a22e7 100644 (file)
@@ -165,7 +165,7 @@ static struct in_device *inetdev_init(struct net_device *dev)
        if (!in_dev)
                goto out;
        INIT_RCU_HEAD(&in_dev->rcu_head);
-       memcpy(&in_dev->cnf, dev->nd_net->ipv4.devconf_dflt,
+       memcpy(&in_dev->cnf, dev_net(dev)->ipv4.devconf_dflt,
                        sizeof(in_dev->cnf));
        in_dev->cnf.sysctl = NULL;
        in_dev->dev = dev;
@@ -437,7 +437,7 @@ struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix,
 
 static int inet_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct nlattr *tb[IFA_MAX+1];
        struct in_device *in_dev;
        struct ifaddrmsg *ifm;
@@ -552,7 +552,7 @@ errout:
 
 static int inet_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct in_ifaddr *ifa;
 
        ASSERT_RTNL();
@@ -872,7 +872,7 @@ __be32 inet_select_addr(const struct net_device *dev, __be32 dst, int scope)
 {
        __be32 addr = 0;
        struct in_device *in_dev;
-       struct net *net = dev->nd_net;
+       struct net *net = dev_net(dev);
 
        rcu_read_lock();
        in_dev = __in_dev_get_rcu(dev);
@@ -974,7 +974,7 @@ __be32 inet_confirm_addr(struct in_device *in_dev,
        if (scope != RT_SCOPE_LINK)
                return confirm_addr_indev(in_dev, dst, local, scope);
 
-       net = in_dev->dev->nd_net;
+       net = dev_net(in_dev->dev);
        read_lock(&dev_base_lock);
        rcu_read_lock();
        for_each_netdev(net, dev) {
@@ -1158,7 +1158,7 @@ nla_put_failure:
 
 static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        int idx, ip_idx;
        struct net_device *dev;
        struct in_device *in_dev;
@@ -1203,7 +1203,7 @@ static void rtmsg_ifa(int event, struct in_ifaddr* ifa, struct nlmsghdr *nlh,
        int err = -ENOBUFS;
        struct net *net;
 
-       net = ifa->ifa_dev->dev->nd_net;
+       net = dev_net(ifa->ifa_dev->dev);
        skb = nlmsg_new(inet_nlmsg_size(), GFP_KERNEL);
        if (skb == NULL)
                goto errout;
@@ -1517,7 +1517,7 @@ static void devinet_sysctl_register(struct in_device *idev)
 {
        neigh_sysctl_register(idev->dev, idev->arp_parms, NET_IPV4,
                        NET_IPV4_NEIGH, "ipv4", NULL, NULL);
-       __devinet_sysctl_register(idev->dev->nd_net, idev->dev->name,
+       __devinet_sysctl_register(dev_net(idev->dev), idev->dev->name,
                        idev->dev->ifindex, &idev->cnf);
 }
 
index 86ff2711fc957977f179da841a0ffc3b698e75ac..0f1557a4ac7a06b519cadbdfa8968e40a530d18b 100644 (file)
@@ -257,7 +257,7 @@ int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif,
        if (in_dev == NULL)
                goto e_inval;
 
-       net = dev->nd_net;
+       net = dev_net(dev);
        if (fib_lookup(net, &fl, &res))
                goto last_resort;
        if (res.type != RTN_UNICAST)
@@ -583,7 +583,7 @@ errout:
 
 static int inet_rtm_delroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct fib_config cfg;
        struct fib_table *tb;
        int err;
@@ -605,7 +605,7 @@ errout:
 
 static int inet_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct fib_config cfg;
        struct fib_table *tb;
        int err;
@@ -627,7 +627,7 @@ errout:
 
 static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        unsigned int h, s_h;
        unsigned int e = 0, s_e;
        struct fib_table *tb;
@@ -674,7 +674,7 @@ out:
 
 static void fib_magic(int cmd, int type, __be32 dst, int dst_len, struct in_ifaddr *ifa)
 {
-       struct net *net = ifa->ifa_dev->dev->nd_net;
+       struct net *net = dev_net(ifa->ifa_dev->dev);
        struct fib_table *tb;
        struct fib_config cfg = {
                .fc_protocol = RTPROT_KERNEL,
@@ -801,15 +801,15 @@ static void fib_del_ifaddr(struct in_ifaddr *ifa)
                fib_magic(RTM_DELROUTE, RTN_LOCAL, ifa->ifa_local, 32, prim);
 
                /* Check, that this local address finally disappeared. */
-               if (inet_addr_type(dev->nd_net, ifa->ifa_local) != RTN_LOCAL) {
+               if (inet_addr_type(dev_net(dev), ifa->ifa_local) != RTN_LOCAL) {
                        /* And the last, but not the least thing.
                           We must flush stray FIB entries.
 
                           First of all, we scan fib_info list searching
                           for stray nexthop entries, then ignite fib_flush.
                        */
-                       if (fib_sync_down_addr(dev->nd_net, ifa->ifa_local))
-                               fib_flush(dev->nd_net);
+                       if (fib_sync_down_addr(dev_net(dev), ifa->ifa_local))
+                               fib_flush(dev_net(dev));
                }
        }
 #undef LOCAL_OK
@@ -857,7 +857,7 @@ static void nl_fib_input(struct sk_buff *skb)
        struct fib_table *tb;
        u32 pid;
 
-       net = skb->sk->sk_net;
+       net = sock_net(skb->sk);
        nlh = nlmsg_hdr(skb);
        if (skb->len < NLMSG_SPACE(0) || skb->len < nlh->nlmsg_len ||
            nlh->nlmsg_len < NLMSG_LENGTH(sizeof(*frn)))
@@ -899,7 +899,7 @@ static void nl_fib_lookup_exit(struct net *net)
 static void fib_disable_ip(struct net_device *dev, int force)
 {
        if (fib_sync_down_dev(dev, force))
-               fib_flush(dev->nd_net);
+               fib_flush(dev_net(dev));
        rt_cache_flush(0);
        arp_ifdown(dev);
 }
index 8d58d85dfac678f4485078efe4f28c6a143f03d3..02088deb046193262b81342bcca1cd5f2bf88506 100644 (file)
@@ -821,7 +821,7 @@ static struct fib_alias *fib_get_first(struct seq_file *seq)
        struct fib_table *main_table;
        struct fn_hash *table;
 
-       main_table = fib_get_table(iter->p.net, RT_TABLE_MAIN);
+       main_table = fib_get_table(seq_file_net(seq), RT_TABLE_MAIN);
        table = (struct fn_hash *)main_table->tb_data;
 
        iter->bucket    = 0;
@@ -959,11 +959,10 @@ static struct fib_alias *fib_get_idx(struct seq_file *seq, loff_t pos)
 static void *fib_seq_start(struct seq_file *seq, loff_t *pos)
        __acquires(fib_hash_lock)
 {
-       struct fib_iter_state *iter = seq->private;
        void *v = NULL;
 
        read_lock(&fib_hash_lock);
-       if (fib_get_table(iter->p.net, RT_TABLE_MAIN))
+       if (fib_get_table(seq_file_net(seq), RT_TABLE_MAIN))
                v = *pos ? fib_get_idx(seq, *pos - 1) : SEQ_START_TOKEN;
        return v;
 }
index 19274d01afa4a36c3777b5ff34816fa63783734a..1fb56876be54ab77f035abbd0afd51618edb2da8 100644 (file)
@@ -137,7 +137,7 @@ static int fib4_rule_configure(struct fib_rule *rule, struct sk_buff *skb,
                               struct nlmsghdr *nlh, struct fib_rule_hdr *frh,
                               struct nlattr **tb)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        int err = -EINVAL;
        struct fib4_rule *rule4 = (struct fib4_rule *) rule;
 
index ce6cb34e28e1bab0269bdd9c5d16fac8d39ddd4a..9e491e70e8552fa213d826333c4ff31088ca5fe0 100644 (file)
@@ -2279,9 +2279,10 @@ static const struct file_operations fib_triestat_fops = {
        .release = fib_triestat_seq_release,
 };
 
-static struct node *fib_trie_get_idx(struct fib_trie_iter *iter, loff_t pos)
+static struct node *fib_trie_get_idx(struct seq_file *seq, loff_t pos)
 {
-       struct net *net = iter->p.net;
+       struct fib_trie_iter *iter = seq->private;
+       struct net *net = seq_file_net(seq);
        loff_t idx = 0;
        unsigned int h;
 
@@ -2309,16 +2310,14 @@ static struct node *fib_trie_get_idx(struct fib_trie_iter *iter, loff_t pos)
 static void *fib_trie_seq_start(struct seq_file *seq, loff_t *pos)
        __acquires(RCU)
 {
-       struct fib_trie_iter *iter = seq->private;
-
        rcu_read_lock();
-       return fib_trie_get_idx(iter, *pos);
+       return fib_trie_get_idx(seq, *pos);
 }
 
 static void *fib_trie_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 {
        struct fib_trie_iter *iter = seq->private;
-       struct net *net = iter->p.net;
+       struct net *net = seq_file_net(seq);
        struct fib_table *tb = iter->tb;
        struct hlist_node *tb_node;
        unsigned int h;
@@ -2513,7 +2512,7 @@ static void *fib_route_seq_start(struct seq_file *seq, loff_t *pos)
        struct fib_table *tb;
 
        rcu_read_lock();
-       tb = fib_get_table(iter->p.net, RT_TABLE_MAIN);
+       tb = fib_get_table(seq_file_net(seq), RT_TABLE_MAIN);
        if (!tb)
                return NULL;
 
index ff9a8e643fccbe1ee08e76f9190b6409bd07cc59..f38f093ef751b65b1c7b7c6e9322ff26a7be5cd0 100644 (file)
@@ -351,7 +351,7 @@ static void icmp_push_reply(struct icmp_bxm *icmp_param,
        struct sock *sk;
        struct sk_buff *skb;
 
-       sk = icmp_sk(rt->u.dst.dev->nd_net);
+       sk = icmp_sk(dev_net(rt->u.dst.dev));
        if (ip_append_data(sk, icmp_glue_bits, icmp_param,
                           icmp_param->data_len+icmp_param->head_len,
                           icmp_param->head_len,
@@ -382,7 +382,7 @@ static void icmp_reply(struct icmp_bxm *icmp_param, struct sk_buff *skb)
 {
        struct ipcm_cookie ipc;
        struct rtable *rt = skb->rtable;
-       struct net *net = rt->u.dst.dev->nd_net;
+       struct net *net = dev_net(rt->u.dst.dev);
        struct sock *sk = icmp_sk(net);
        struct inet_sock *inet = inet_sk(sk);
        __be32 daddr;
@@ -447,7 +447,7 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
 
        if (!rt)
                goto out;
-       net = rt->u.dst.dev->nd_net;
+       net = dev_net(rt->u.dst.dev);
        sk = icmp_sk(net);
 
        /*
@@ -677,7 +677,7 @@ static void icmp_unreach(struct sk_buff *skb)
        u32 info = 0;
        struct net *net;
 
-       net = skb->dst->dev->nd_net;
+       net = dev_net(skb->dst->dev);
 
        /*
         *      Incomplete header ?
index 6a4ee8da69942d2764edd0f9a80b1d57dd2f9cf8..6250f4239b619e516e694207be49e29c2988c9ea 100644 (file)
  */
 
 #define IGMP_V1_SEEN(in_dev) \
-       (IPV4_DEVCONF_ALL(in_dev->dev->nd_net, FORCE_IGMP_VERSION) == 1 || \
+       (IPV4_DEVCONF_ALL(dev_net(in_dev->dev), FORCE_IGMP_VERSION) == 1 || \
         IN_DEV_CONF_GET((in_dev), FORCE_IGMP_VERSION) == 1 || \
         ((in_dev)->mr_v1_seen && \
          time_before(jiffies, (in_dev)->mr_v1_seen)))
 #define IGMP_V2_SEEN(in_dev) \
-       (IPV4_DEVCONF_ALL(in_dev->dev->nd_net, FORCE_IGMP_VERSION) == 2 || \
+       (IPV4_DEVCONF_ALL(dev_net(in_dev->dev), FORCE_IGMP_VERSION) == 2 || \
         IN_DEV_CONF_GET((in_dev), FORCE_IGMP_VERSION) == 2 || \
         ((in_dev)->mr_v2_seen && \
          time_before(jiffies, (in_dev)->mr_v2_seen)))
@@ -1198,7 +1198,7 @@ void ip_mc_inc_group(struct in_device *in_dev, __be32 addr)
 
        ASSERT_RTNL();
 
-       if (in_dev->dev->nd_net != &init_net)
+       if (dev_net(in_dev->dev) != &init_net)
                return;
 
        for (im=in_dev->mc_list; im; im=im->next) {
@@ -1280,7 +1280,7 @@ void ip_mc_dec_group(struct in_device *in_dev, __be32 addr)
 
        ASSERT_RTNL();
 
-       if (in_dev->dev->nd_net != &init_net)
+       if (dev_net(in_dev->dev) != &init_net)
                return;
 
        for (ip=&in_dev->mc_list; (i=*ip)!=NULL; ip=&i->next) {
@@ -1310,7 +1310,7 @@ void ip_mc_down(struct in_device *in_dev)
 
        ASSERT_RTNL();
 
-       if (in_dev->dev->nd_net != &init_net)
+       if (dev_net(in_dev->dev) != &init_net)
                return;
 
        for (i=in_dev->mc_list; i; i=i->next)
@@ -1333,7 +1333,7 @@ void ip_mc_init_dev(struct in_device *in_dev)
 {
        ASSERT_RTNL();
 
-       if (in_dev->dev->nd_net != &init_net)
+       if (dev_net(in_dev->dev) != &init_net)
                return;
 
        in_dev->mc_tomb = NULL;
@@ -1359,7 +1359,7 @@ void ip_mc_up(struct in_device *in_dev)
 
        ASSERT_RTNL();
 
-       if (in_dev->dev->nd_net != &init_net)
+       if (dev_net(in_dev->dev) != &init_net)
                return;
 
        ip_mc_inc_group(in_dev, IGMP_ALL_HOSTS);
@@ -1378,7 +1378,7 @@ void ip_mc_destroy_dev(struct in_device *in_dev)
 
        ASSERT_RTNL();
 
-       if (in_dev->dev->nd_net != &init_net)
+       if (dev_net(in_dev->dev) != &init_net)
                return;
 
        /* Deactivate timers */
@@ -1762,7 +1762,7 @@ int ip_mc_join_group(struct sock *sk , struct ip_mreqn *imr)
        if (!ipv4_is_multicast(addr))
                return -EINVAL;
 
-       if (sk->sk_net != &init_net)
+       if (sock_net(sk) != &init_net)
                return -EPROTONOSUPPORT;
 
        rtnl_lock();
@@ -1833,7 +1833,7 @@ int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr)
        u32 ifindex;
        int ret = -EADDRNOTAVAIL;
 
-       if (sk->sk_net != &init_net)
+       if (sock_net(sk) != &init_net)
                return -EPROTONOSUPPORT;
 
        rtnl_lock();
@@ -1881,7 +1881,7 @@ int ip_mc_source(int add, int omode, struct sock *sk, struct
        if (!ipv4_is_multicast(addr))
                return -EINVAL;
 
-       if (sk->sk_net != &init_net)
+       if (sock_net(sk) != &init_net)
                return -EPROTONOSUPPORT;
 
        rtnl_lock();
@@ -2017,7 +2017,7 @@ int ip_mc_msfilter(struct sock *sk, struct ip_msfilter *msf, int ifindex)
            msf->imsf_fmode != MCAST_EXCLUDE)
                return -EINVAL;
 
-       if (sk->sk_net != &init_net)
+       if (sock_net(sk) != &init_net)
                return -EPROTONOSUPPORT;
 
        rtnl_lock();
@@ -2100,7 +2100,7 @@ int ip_mc_msfget(struct sock *sk, struct ip_msfilter *msf,
        if (!ipv4_is_multicast(addr))
                return -EINVAL;
 
-       if (sk->sk_net != &init_net)
+       if (sock_net(sk) != &init_net)
                return -EPROTONOSUPPORT;
 
        rtnl_lock();
@@ -2165,7 +2165,7 @@ int ip_mc_gsfget(struct sock *sk, struct group_filter *gsf,
        if (!ipv4_is_multicast(addr))
                return -EINVAL;
 
-       if (sk->sk_net != &init_net)
+       if (sock_net(sk) != &init_net)
                return -EPROTONOSUPPORT;
 
        rtnl_lock();
@@ -2252,7 +2252,7 @@ void ip_mc_drop_socket(struct sock *sk)
        if (inet->mc_list == NULL)
                return;
 
-       if (sk->sk_net != &init_net)
+       if (sock_net(sk) != &init_net)
                return;
 
        rtnl_lock();
index d13c5f12bb329f2cf79b4954cec15ee2d57d8ef8..a7fcaf20564409f40622e40bba63eed0b013e1fa 100644 (file)
@@ -85,7 +85,7 @@ int inet_csk_get_port(struct sock *sk, unsigned short snum)
        struct hlist_node *node;
        struct inet_bind_bucket *tb;
        int ret;
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
 
        local_bh_disable();
        if (!snum) {
@@ -333,7 +333,7 @@ struct dst_entry* inet_csk_route_req(struct sock *sk,
                                         .dport = ireq->rmt_port } } };
 
        security_req_classify_flow(req, &fl);
-       if (ip_route_output_flow(sk->sk_net, &rt, &fl, sk, 0)) {
+       if (ip_route_output_flow(sock_net(sk), &rt, &fl, sk, 0)) {
                IP_INC_STATS_BH(IPSTATS_MIB_OUTNOROUTES);
                return NULL;
        }
index 8cd1ad9b91118248e2fb8243afc2c7f3e413c6ed..1b6ff513c75d16b3fd63d362d98bdb71d5f0ad21 100644 (file)
@@ -139,7 +139,7 @@ static struct sock *inet_lookup_listener_slow(struct net *net,
        sk_for_each(sk, node, head) {
                const struct inet_sock *inet = inet_sk(sk);
 
-               if (sk->sk_net == net && inet->num == hnum &&
+               if (net_eq(sock_net(sk), net) && inet->num == hnum &&
                                !ipv6_only_sock(sk)) {
                        const __be32 rcv_saddr = inet->rcv_saddr;
                        int score = sk->sk_family == PF_INET ? 1 : 0;
@@ -182,7 +182,7 @@ struct sock *__inet_lookup_listener(struct net *net,
                if (inet->num == hnum && !sk->sk_node.next &&
                    (!inet->rcv_saddr || inet->rcv_saddr == daddr) &&
                    (sk->sk_family == PF_INET || !ipv6_only_sock(sk)) &&
-                   !sk->sk_bound_dev_if && sk->sk_net == net)
+                   !sk->sk_bound_dev_if && net_eq(sock_net(sk), net))
                        goto sherry_cache;
                sk = inet_lookup_listener_slow(net, head, daddr, hnum, dif);
        }
@@ -254,7 +254,7 @@ static int __inet_check_established(struct inet_timewait_death_row *death_row,
        struct sock *sk2;
        const struct hlist_node *node;
        struct inet_timewait_sock *tw;
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
 
        prefetch(head->chain.first);
        write_lock(lock);
@@ -406,7 +406,7 @@ int __inet_hash_connect(struct inet_timewait_death_row *death_row,
        struct inet_bind_hashbucket *head;
        struct inet_bind_bucket *tb;
        int ret;
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
 
        if (!snum) {
                int i, remaining, low, high, port;
index 717c411a5c6be876311c65ddc76dcb8bb24ac873..f12bc24de46fab010bdf0585f5b619180cf8a41f 100644 (file)
@@ -124,7 +124,7 @@ struct inet_timewait_sock *inet_twsk_alloc(const struct sock *sk, const int stat
                tw->tw_hash         = sk->sk_hash;
                tw->tw_ipv6only     = 0;
                tw->tw_prot         = sk->sk_prot_creator;
-               tw->tw_net          = sk->sk_net;
+               twsk_net_set(tw, sock_net(sk));
                atomic_set(&tw->tw_refcnt, 1);
                inet_twsk_dead_node_init(tw);
                __module_get(tw->tw_prot->owner);
index 8b448c4b90802f23c83c43770bc38b9d6d8b0249..fcb60e76b234bc88665084b20728d1521284cef7 100644 (file)
@@ -571,7 +571,7 @@ int ip_defrag(struct sk_buff *skb, u32 user)
 
        IP_INC_STATS_BH(IPSTATS_MIB_REASMREQDS);
 
-       net = skb->dev ? skb->dev->nd_net : skb->dst->dev->nd_net;
+       net = skb->dev ? dev_net(skb->dev) : dev_net(skb->dst->dev);
        /* Start by cleaning up the memory. */
        if (atomic_read(&net->ipv4.frags.mem) > net->ipv4.frags.high_thresh)
                ip_evictor(net);
index f9ee84420cb33005798f47c87e98bf01d5bc7216..50972b397a9a9460f43b1111226ae77b85e62c0e 100644 (file)
@@ -1190,7 +1190,7 @@ static int ipgre_close(struct net_device *dev)
        struct ip_tunnel *t = netdev_priv(dev);
        if (ipv4_is_multicast(t->parms.iph.daddr) && t->mlink) {
                struct in_device *in_dev;
-               in_dev = inetdev_by_index(dev->nd_net, t->mlink);
+               in_dev = inetdev_by_index(dev_net(dev), t->mlink);
                if (in_dev) {
                        ip_mc_dec_group(in_dev, t->parms.iph.daddr);
                        in_dev_put(in_dev);
index 2aeea5d154252a9e7d96043420658f0db674ae6f..4be00959b74893f1846a4ffd08f422836c007587 100644 (file)
@@ -172,7 +172,7 @@ int ip_call_ra_chain(struct sk_buff *skb)
                if (sk && inet_sk(sk)->num == protocol &&
                    (!sk->sk_bound_dev_if ||
                     sk->sk_bound_dev_if == dev->ifindex) &&
-                   sk->sk_net == dev->nd_net) {
+                   sock_net(sk) == dev_net(dev)) {
                        if (ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)) {
                                if (ip_defrag(skb, IP_DEFRAG_CALL_RA_CHAIN)) {
                                        read_unlock(&ip_ra_lock);
@@ -199,7 +199,7 @@ int ip_call_ra_chain(struct sk_buff *skb)
 
 static int ip_local_deliver_finish(struct sk_buff *skb)
 {
-       struct net *net = skb->dev->nd_net;
+       struct net *net = dev_net(skb->dev);
 
        __skb_pull(skb, ip_hdrlen(skb));
 
@@ -291,7 +291,7 @@ static inline int ip_rcv_options(struct sk_buff *skb)
        opt = &(IPCB(skb)->opt);
        opt->optlen = iph->ihl*4 - sizeof(struct iphdr);
 
-       if (ip_options_compile(dev->nd_net, opt, skb)) {
+       if (ip_options_compile(dev_net(dev), opt, skb)) {
                IP_INC_STATS_BH(IPSTATS_MIB_INHDRERRORS);
                goto drop;
        }
index 87cc1222c600d81641cd7550ba7b320cc36208ed..d107543d3f81b4d13a0e788272a6ac8243c9a155 100644 (file)
@@ -145,7 +145,7 @@ int ip_options_echo(struct ip_options * dopt, struct sk_buff * skb)
                                                __be32 addr;
 
                                                memcpy(&addr, sptr+soffset-1, 4);
-                                               if (inet_addr_type(skb->dst->dev->nd_net, addr) != RTN_LOCAL) {
+                                               if (inet_addr_type(dev_net(skb->dst->dev), addr) != RTN_LOCAL) {
                                                        dopt->ts_needtime = 1;
                                                        soffset += 8;
                                                }
index 913266cd9902c3fe9b0ff51d258c1fd315849fda..08349267ceb4c091285c1b44dfdc719a1936447e 100644 (file)
@@ -351,7 +351,7 @@ int ip_queue_xmit(struct sk_buff *skb, int ipfragok)
                         * itself out.
                         */
                        security_sk_classify_flow(sk, &fl);
-                       if (ip_route_output_flow(sk->sk_net, &rt, &fl, sk, 0))
+                       if (ip_route_output_flow(sock_net(sk), &rt, &fl, sk, 0))
                                goto no_route;
                }
                sk_setup_caps(sk, &rt->u.dst);
@@ -1382,7 +1382,7 @@ void ip_send_reply(struct sock *sk, struct sk_buff *skb, struct ip_reply_arg *ar
                                                 .dport = tcp_hdr(skb)->source } },
                                    .proto = sk->sk_protocol };
                security_skb_classify_flow(skb, &fl);
-               if (ip_route_output_key(sk->sk_net, &rt, &fl))
+               if (ip_route_output_key(sock_net(sk), &rt, &fl))
                        return;
        }
 
index b854431047a46adffbe09ee621f2d4344c06ec80..d6e76f5229ccb4d9eb1c3193b8e8e0443a7fadc4 100644 (file)
@@ -449,7 +449,7 @@ 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(sk->sk_net, &opt,
+               err = ip_options_get_from_user(sock_net(sk), &opt,
                                               optval, optlen);
                if (err)
                        break;
@@ -590,13 +590,13 @@ static int do_ip_setsockopt(struct sock *sk, int level,
                                err = 0;
                                break;
                        }
-                       dev = ip_dev_find(sk->sk_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(sk->sk_net, mreq.imr_ifindex);
+                       dev = __dev_get_by_index(sock_net(sk), mreq.imr_ifindex);
 
 
                err = -EADDRNOTAVAIL;
index 96138b128de89f5133c7bf15ec699fc522e8f2ca..08e8fb60d3159e4e8543217f621851ed027894a8 100644 (file)
@@ -434,7 +434,7 @@ ic_rarp_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt
        unsigned char *sha, *tha;               /* s for "source", t for "target" */
        struct ic_device *d;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                goto drop;
 
        if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL)
@@ -854,7 +854,7 @@ static int __init ic_bootp_recv(struct sk_buff *skb, struct net_device *dev, str
        struct ic_device *d;
        int len, ext_len;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                goto drop;
 
        /* Perform verifications before taking the lock.  */
index 7d63d74ef62a2c56f045a3c242d18725de4cf234..11700a4dcd95cb493b44f94336517eb50d4d73bb 100644 (file)
@@ -849,7 +849,7 @@ static void mrtsock_destruct(struct sock *sk)
 {
        rtnl_lock();
        if (sk == mroute_socket) {
-               IPV4_DEVCONF_ALL(sk->sk_net, MC_FORWARDING)--;
+               IPV4_DEVCONF_ALL(sock_net(sk), MC_FORWARDING)--;
 
                write_lock_bh(&mrt_lock);
                mroute_socket=NULL;
@@ -898,7 +898,7 @@ int ip_mroute_setsockopt(struct sock *sk,int optname,char __user *optval,int opt
                        mroute_socket=sk;
                        write_unlock_bh(&mrt_lock);
 
-                       IPV4_DEVCONF_ALL(sk->sk_net, MC_FORWARDING)++;
+                       IPV4_DEVCONF_ALL(sock_net(sk), MC_FORWARDING)++;
                }
                rtnl_unlock();
                return ret;
@@ -1089,7 +1089,7 @@ static int ipmr_device_event(struct notifier_block *this, unsigned long event, v
        struct vif_device *v;
        int ct;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        if (event != NETDEV_UNREGISTER)
index 756bc0e1a7c60b9a45e96a825c8b4ad4750e5372..1563f29b5117c83a656c674f4b02ed9a2043a06a 100644 (file)
@@ -1496,11 +1496,11 @@ static int compat_do_arpt_set_ctl(struct sock *sk, int cmd, void __user *user,
 
        switch (cmd) {
        case ARPT_SO_SET_REPLACE:
-               ret = compat_do_replace(sk->sk_net, user, len);
+               ret = compat_do_replace(sock_net(sk), user, len);
                break;
 
        case ARPT_SO_SET_ADD_COUNTERS:
-               ret = do_add_counters(sk->sk_net, user, len, 1);
+               ret = do_add_counters(sock_net(sk), user, len, 1);
                break;
 
        default:
@@ -1644,10 +1644,10 @@ static int compat_do_arpt_get_ctl(struct sock *sk, int cmd, void __user *user,
 
        switch (cmd) {
        case ARPT_SO_GET_INFO:
-               ret = get_info(sk->sk_net, user, len, 1);
+               ret = get_info(sock_net(sk), user, len, 1);
                break;
        case ARPT_SO_GET_ENTRIES:
-               ret = compat_get_entries(sk->sk_net, user, len);
+               ret = compat_get_entries(sock_net(sk), user, len);
                break;
        default:
                ret = do_arpt_get_ctl(sk, cmd, user, len);
@@ -1665,11 +1665,11 @@ static int do_arpt_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned
 
        switch (cmd) {
        case ARPT_SO_SET_REPLACE:
-               ret = do_replace(sk->sk_net, user, len);
+               ret = do_replace(sock_net(sk), user, len);
                break;
 
        case ARPT_SO_SET_ADD_COUNTERS:
-               ret = do_add_counters(sk->sk_net, user, len, 0);
+               ret = do_add_counters(sock_net(sk), user, len, 0);
                break;
 
        default:
@@ -1689,11 +1689,11 @@ static int do_arpt_get_ctl(struct sock *sk, int cmd, void __user *user, int *len
 
        switch (cmd) {
        case ARPT_SO_GET_INFO:
-               ret = get_info(sk->sk_net, user, len, 0);
+               ret = get_info(sock_net(sk), user, len, 0);
                break;
 
        case ARPT_SO_GET_ENTRIES:
-               ret = get_entries(sk->sk_net, user, len);
+               ret = get_entries(sock_net(sk), user, len);
                break;
 
        case ARPT_SO_GET_REVISION_TARGET: {
index fe05da41d6ba6b74947eaaace92eb79d2de408ab..500998a2dec1945c3208b88a9b4e814e62e656d4 100644 (file)
@@ -481,7 +481,7 @@ ipq_rcv_dev_event(struct notifier_block *this,
 {
        struct net_device *dev = ptr;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        /* Drop any packets associated with the downed device */
index 85a75e186b4b059ae89d3d6bfde06f103594deaa..a819d191e1aa344399e221b4313da8f3118696d3 100644 (file)
@@ -1852,11 +1852,11 @@ compat_do_ipt_set_ctl(struct sock *sk,  int cmd, void __user *user,
 
        switch (cmd) {
        case IPT_SO_SET_REPLACE:
-               ret = compat_do_replace(sk->sk_net, user, len);
+               ret = compat_do_replace(sock_net(sk), user, len);
                break;
 
        case IPT_SO_SET_ADD_COUNTERS:
-               ret = do_add_counters(sk->sk_net, user, len, 1);
+               ret = do_add_counters(sock_net(sk), user, len, 1);
                break;
 
        default:
@@ -1963,10 +1963,10 @@ compat_do_ipt_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)
 
        switch (cmd) {
        case IPT_SO_GET_INFO:
-               ret = get_info(sk->sk_net, user, len, 1);
+               ret = get_info(sock_net(sk), user, len, 1);
                break;
        case IPT_SO_GET_ENTRIES:
-               ret = compat_get_entries(sk->sk_net, user, len);
+               ret = compat_get_entries(sock_net(sk), user, len);
                break;
        default:
                ret = do_ipt_get_ctl(sk, cmd, user, len);
@@ -1985,11 +1985,11 @@ do_ipt_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len)
 
        switch (cmd) {
        case IPT_SO_SET_REPLACE:
-               ret = do_replace(sk->sk_net, user, len);
+               ret = do_replace(sock_net(sk), user, len);
                break;
 
        case IPT_SO_SET_ADD_COUNTERS:
-               ret = do_add_counters(sk->sk_net, user, len, 0);
+               ret = do_add_counters(sock_net(sk), user, len, 0);
                break;
 
        default:
@@ -2010,11 +2010,11 @@ do_ipt_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)
 
        switch (cmd) {
        case IPT_SO_GET_INFO:
-               ret = get_info(sk->sk_net, user, len, 0);
+               ret = get_info(sock_net(sk), user, len, 0);
                break;
 
        case IPT_SO_GET_ENTRIES:
-               ret = get_entries(sk->sk_net, user, len);
+               ret = get_entries(sock_net(sk), user, len);
                break;
 
        case IPT_SO_GET_REVISION_MATCH:
index c6cf84c776116a6db394da69947547d20e324b17..1b10f3628390b8394d793939e105c4f9afa02b93 100644 (file)
@@ -332,7 +332,7 @@ clusterip_tg(struct sk_buff *skb, const struct net_device *in,
        }
 
 #ifdef DEBUG
-       DUMP_TUPLE(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple);
+       NF_CT_DUMP_TUPLE(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple);
 #endif
        pr_debug("hash=%u ct_hash=%u ", hash, ct->mark);
        if (!clusterip_responsible(cipinfo->config, hash)) {
index c6817b18366a63d32b91ac734c085993cea61bd3..84c26dd27d8100fda0913de6ad6b9616bf3de5ec 100644 (file)
@@ -120,7 +120,7 @@ static int masq_device_event(struct notifier_block *this,
 {
        const struct net_device *dev = ptr;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        if (event == NETDEV_DOWN) {
index b4c8d4968bb2f5ad52aa0446e4aeab51d8b98756..4334d5cabc5b17b1eb6ab6a8ec9873ee623c3bc4 100644 (file)
@@ -2,6 +2,8 @@
  *
  * (C) 2005 by Christian Hentschel <chentschel@arnet.com.ar>
  * based on RR's ip_nat_ftp.c and other modules.
+ * (C) 2007 United Security Providers
+ * (C) 2007, 2008 Patrick McHardy <kaber@trash.net>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -26,275 +28,461 @@ MODULE_AUTHOR("Christian Hentschel <chentschel@arnet.com.ar>");
 MODULE_DESCRIPTION("SIP NAT helper");
 MODULE_ALIAS("ip_nat_sip");
 
-struct addr_map {
-       struct {
-               char            src[sizeof("nnn.nnn.nnn.nnn:nnnnn")];
-               char            dst[sizeof("nnn.nnn.nnn.nnn:nnnnn")];
-               unsigned int    srclen, srciplen;
-               unsigned int    dstlen, dstiplen;
-       } addr[IP_CT_DIR_MAX];
-};
 
-static void addr_map_init(const struct nf_conn *ct, struct addr_map *map)
+static unsigned int mangle_packet(struct sk_buff *skb,
+                                 const char **dptr, unsigned int *datalen,
+                                 unsigned int matchoff, unsigned int matchlen,
+                                 const char *buffer, unsigned int buflen)
 {
-       const struct nf_conntrack_tuple *t;
-       enum ip_conntrack_dir dir;
-       unsigned int n;
-
-       for (dir = 0; dir < IP_CT_DIR_MAX; dir++) {
-               t = &ct->tuplehash[dir].tuple;
-
-               n = sprintf(map->addr[dir].src, "%u.%u.%u.%u",
-                           NIPQUAD(t->src.u3.ip));
-               map->addr[dir].srciplen = n;
-               n += sprintf(map->addr[dir].src + n, ":%u",
-                            ntohs(t->src.u.udp.port));
-               map->addr[dir].srclen = n;
-
-               n = sprintf(map->addr[dir].dst, "%u.%u.%u.%u",
-                           NIPQUAD(t->dst.u3.ip));
-               map->addr[dir].dstiplen = n;
-               n += sprintf(map->addr[dir].dst + n, ":%u",
-                            ntohs(t->dst.u.udp.port));
-               map->addr[dir].dstlen = n;
-       }
+       enum ip_conntrack_info ctinfo;
+       struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
+
+       if (!nf_nat_mangle_udp_packet(skb, ct, ctinfo, matchoff, matchlen,
+                                     buffer, buflen))
+               return 0;
+
+       /* Reload data pointer and adjust datalen value */
+       *dptr = skb->data + ip_hdrlen(skb) + sizeof(struct udphdr);
+       *datalen += buflen - matchlen;
+       return 1;
 }
 
-static int map_sip_addr(struct sk_buff *skb, enum ip_conntrack_info ctinfo,
-                       struct nf_conn *ct, const char **dptr, size_t dlen,
-                       enum sip_header_pos pos, struct addr_map *map)
+static int map_addr(struct sk_buff *skb,
+                   const char **dptr, unsigned int *datalen,
+                   unsigned int matchoff, unsigned int matchlen,
+                   union nf_inet_addr *addr, __be16 port)
 {
+       enum ip_conntrack_info ctinfo;
+       struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
        enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo);
-       unsigned int matchlen, matchoff, addrlen;
-       char *addr;
-
-       if (ct_sip_get_info(ct, *dptr, dlen, &matchoff, &matchlen, pos) <= 0)
+       char buffer[sizeof("nnn.nnn.nnn.nnn:nnnnn")];
+       unsigned int buflen;
+       __be32 newaddr;
+       __be16 newport;
+
+       if (ct->tuplehash[dir].tuple.src.u3.ip == addr->ip &&
+           ct->tuplehash[dir].tuple.src.u.udp.port == port) {
+               newaddr = ct->tuplehash[!dir].tuple.dst.u3.ip;
+               newport = ct->tuplehash[!dir].tuple.dst.u.udp.port;
+       } else if (ct->tuplehash[dir].tuple.dst.u3.ip == addr->ip &&
+                  ct->tuplehash[dir].tuple.dst.u.udp.port == port) {
+               newaddr = ct->tuplehash[!dir].tuple.src.u3.ip;
+               newport = ct->tuplehash[!dir].tuple.src.u.udp.port;
+       } else
                return 1;
 
-       if ((matchlen == map->addr[dir].srciplen ||
-            matchlen == map->addr[dir].srclen) &&
-           memcmp(*dptr + matchoff, map->addr[dir].src, matchlen) == 0) {
-               addr    = map->addr[!dir].dst;
-               addrlen = map->addr[!dir].dstlen;
-       } else if ((matchlen == map->addr[dir].dstiplen ||
-                   matchlen == map->addr[dir].dstlen) &&
-                  memcmp(*dptr + matchoff, map->addr[dir].dst, matchlen) == 0) {
-               addr    = map->addr[!dir].src;
-               addrlen = map->addr[!dir].srclen;
-       } else
+       if (newaddr == addr->ip && newport == port)
                return 1;
 
-       if (!nf_nat_mangle_udp_packet(skb, ct, ctinfo,
-                                     matchoff, matchlen, addr, addrlen))
-               return 0;
-       *dptr = skb->data + ip_hdrlen(skb) + sizeof(struct udphdr);
-       return 1;
+       buflen = sprintf(buffer, "%u.%u.%u.%u:%u",
+                        NIPQUAD(newaddr), ntohs(newport));
 
+       return mangle_packet(skb, dptr, datalen, matchoff, matchlen,
+                            buffer, buflen);
 }
 
-static unsigned int ip_nat_sip(struct sk_buff *skb,
-                              enum ip_conntrack_info ctinfo,
-                              struct nf_conn *ct,
-                              const char **dptr)
+static int map_sip_addr(struct sk_buff *skb,
+                       const char **dptr, unsigned int *datalen,
+                       enum sip_header_types type)
 {
-       enum sip_header_pos pos;
-       struct addr_map map;
-       int dataoff, datalen;
+       enum ip_conntrack_info ctinfo;
+       struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
+       unsigned int matchlen, matchoff;
+       union nf_inet_addr addr;
+       __be16 port;
 
-       dataoff = ip_hdrlen(skb) + sizeof(struct udphdr);
-       datalen = skb->len - dataoff;
-       if (datalen < sizeof("SIP/2.0") - 1)
-               return NF_ACCEPT;
+       if (ct_sip_parse_header_uri(ct, *dptr, NULL, *datalen, type, NULL,
+                                   &matchoff, &matchlen, &addr, &port) <= 0)
+               return 1;
+       return map_addr(skb, dptr, datalen, matchoff, matchlen, &addr, port);
+}
 
-       addr_map_init(ct, &map);
+static unsigned int ip_nat_sip(struct sk_buff *skb,
+                              const char **dptr, unsigned int *datalen)
+{
+       enum ip_conntrack_info ctinfo;
+       struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
+       enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo);
+       unsigned int dataoff, matchoff, matchlen;
+       union nf_inet_addr addr;
+       __be16 port;
+       int request, in_header;
 
        /* Basic rules: requests and responses. */
-       if (strncmp(*dptr, "SIP/2.0", sizeof("SIP/2.0") - 1) != 0) {
-               /* 10.2: Constructing the REGISTER Request:
-                *
-                * The "userinfo" and "@" components of the SIP URI MUST NOT
-                * be present.
-                */
-               if (datalen >= sizeof("REGISTER") - 1 &&
-                   strncmp(*dptr, "REGISTER", sizeof("REGISTER") - 1) == 0)
-                       pos = POS_REG_REQ_URI;
-               else
-                       pos = POS_REQ_URI;
-
-               if (!map_sip_addr(skb, ctinfo, ct, dptr, datalen, pos, &map))
+       if (strnicmp(*dptr, "SIP/2.0", strlen("SIP/2.0")) != 0) {
+               if (ct_sip_parse_request(ct, *dptr, *datalen,
+                                        &matchoff, &matchlen,
+                                        &addr, &port) > 0 &&
+                   !map_addr(skb, dptr, datalen, matchoff, matchlen,
+                             &addr, port))
+                       return NF_DROP;
+               request = 1;
+       } else
+               request = 0;
+
+       /* Translate topmost Via header and parameters */
+       if (ct_sip_parse_header_uri(ct, *dptr, NULL, *datalen,
+                                   SIP_HDR_VIA, NULL, &matchoff, &matchlen,
+                                   &addr, &port) > 0) {
+               unsigned int matchend, poff, plen, buflen, n;
+               char buffer[sizeof("nnn.nnn.nnn.nnn:nnnnn")];
+
+               /* We're only interested in headers related to this
+                * connection */
+               if (request) {
+                       if (addr.ip != ct->tuplehash[dir].tuple.src.u3.ip ||
+                           port != ct->tuplehash[dir].tuple.src.u.udp.port)
+                               goto next;
+               } else {
+                       if (addr.ip != ct->tuplehash[dir].tuple.dst.u3.ip ||
+                           port != ct->tuplehash[dir].tuple.dst.u.udp.port)
+                               goto next;
+               }
+
+               if (!map_addr(skb, dptr, datalen, matchoff, matchlen,
+                             &addr, port))
                        return NF_DROP;
+
+               matchend = matchoff + matchlen;
+
+               /* The maddr= parameter (RFC 2361) specifies where to send
+                * the reply. */
+               if (ct_sip_parse_address_param(ct, *dptr, matchend, *datalen,
+                                              "maddr=", &poff, &plen,
+                                              &addr) > 0 &&
+                   addr.ip == ct->tuplehash[dir].tuple.src.u3.ip &&
+                   addr.ip != ct->tuplehash[!dir].tuple.dst.u3.ip) {
+                       __be32 ip = ct->tuplehash[!dir].tuple.dst.u3.ip;
+                       buflen = sprintf(buffer, "%u.%u.%u.%u", NIPQUAD(ip));
+                       if (!mangle_packet(skb, dptr, datalen, poff, plen,
+                                          buffer, buflen))
+                               return NF_DROP;
+               }
+
+               /* The received= parameter (RFC 2361) contains the address
+                * from which the server received the request. */
+               if (ct_sip_parse_address_param(ct, *dptr, matchend, *datalen,
+                                              "received=", &poff, &plen,
+                                              &addr) > 0 &&
+                   addr.ip == ct->tuplehash[dir].tuple.dst.u3.ip &&
+                   addr.ip != ct->tuplehash[!dir].tuple.src.u3.ip) {
+                       __be32 ip = ct->tuplehash[!dir].tuple.src.u3.ip;
+                       buflen = sprintf(buffer, "%u.%u.%u.%u", NIPQUAD(ip));
+                       if (!mangle_packet(skb, dptr, datalen, poff, plen,
+                                          buffer, buflen))
+                               return NF_DROP;
+               }
+
+               /* The rport= parameter (RFC 3581) contains the port number
+                * from which the server received the request. */
+               if (ct_sip_parse_numerical_param(ct, *dptr, matchend, *datalen,
+                                                "rport=", &poff, &plen,
+                                                &n) > 0 &&
+                   htons(n) == ct->tuplehash[dir].tuple.dst.u.udp.port &&
+                   htons(n) != ct->tuplehash[!dir].tuple.src.u.udp.port) {
+                       __be16 p = ct->tuplehash[!dir].tuple.src.u.udp.port;
+                       buflen = sprintf(buffer, "%u", ntohs(p));
+                       if (!mangle_packet(skb, dptr, datalen, poff, plen,
+                                          buffer, buflen))
+                               return NF_DROP;
+               }
        }
 
-       if (!map_sip_addr(skb, ctinfo, ct, dptr, datalen, POS_FROM, &map) ||
-           !map_sip_addr(skb, ctinfo, ct, dptr, datalen, POS_TO, &map) ||
-           !map_sip_addr(skb, ctinfo, ct, dptr, datalen, POS_VIA, &map) ||
-           !map_sip_addr(skb, ctinfo, ct, dptr, datalen, POS_CONTACT, &map))
+next:
+       /* Translate Contact headers */
+       dataoff = 0;
+       in_header = 0;
+       while (ct_sip_parse_header_uri(ct, *dptr, &dataoff, *datalen,
+                                      SIP_HDR_CONTACT, &in_header,
+                                      &matchoff, &matchlen,
+                                      &addr, &port) > 0) {
+               if (!map_addr(skb, dptr, datalen, matchoff, matchlen,
+                             &addr, port))
+                       return NF_DROP;
+       }
+
+       if (!map_sip_addr(skb, dptr, datalen, SIP_HDR_FROM) ||
+           !map_sip_addr(skb, dptr, datalen, SIP_HDR_TO))
                return NF_DROP;
        return NF_ACCEPT;
 }
 
-static unsigned int mangle_sip_packet(struct sk_buff *skb,
-                                     enum ip_conntrack_info ctinfo,
-                                     struct nf_conn *ct,
-                                     const char **dptr, size_t dlen,
-                                     char *buffer, int bufflen,
-                                     enum sip_header_pos pos)
+/* Handles expected signalling connections and media streams */
+static void ip_nat_sip_expected(struct nf_conn *ct,
+                               struct nf_conntrack_expect *exp)
 {
-       unsigned int matchlen, matchoff;
+       struct nf_nat_range range;
 
-       if (ct_sip_get_info(ct, *dptr, dlen, &matchoff, &matchlen, pos) <= 0)
-               return 0;
+       /* This must be a fresh one. */
+       BUG_ON(ct->status & IPS_NAT_DONE_MASK);
 
-       if (!nf_nat_mangle_udp_packet(skb, ct, ctinfo,
-                                     matchoff, matchlen, buffer, bufflen))
-               return 0;
+       /* For DST manip, map port here to where it's expected. */
+       range.flags = (IP_NAT_RANGE_MAP_IPS | IP_NAT_RANGE_PROTO_SPECIFIED);
+       range.min = range.max = exp->saved_proto;
+       range.min_ip = range.max_ip = exp->saved_ip;
+       nf_nat_setup_info(ct, &range, IP_NAT_MANIP_DST);
 
-       /* We need to reload this. Thanks Patrick. */
-       *dptr = skb->data + ip_hdrlen(skb) + sizeof(struct udphdr);
-       return 1;
+       /* Change src to where master sends to, but only if the connection
+        * actually came from the same source. */
+       if (ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip ==
+           ct->master->tuplehash[exp->dir].tuple.src.u3.ip) {
+               range.flags = IP_NAT_RANGE_MAP_IPS;
+               range.min_ip = range.max_ip
+                       = ct->master->tuplehash[!exp->dir].tuple.dst.u3.ip;
+               nf_nat_setup_info(ct, &range, IP_NAT_MANIP_SRC);
+       }
 }
 
-static int mangle_content_len(struct sk_buff *skb,
-                             enum ip_conntrack_info ctinfo,
-                             struct nf_conn *ct,
-                             const char *dptr)
+static unsigned int ip_nat_sip_expect(struct sk_buff *skb,
+                                     const char **dptr, unsigned int *datalen,
+                                     struct nf_conntrack_expect *exp,
+                                     unsigned int matchoff,
+                                     unsigned int matchlen)
 {
-       unsigned int dataoff, matchoff, matchlen;
-       char buffer[sizeof("65536")];
-       int bufflen;
+       enum ip_conntrack_info ctinfo;
+       struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
+       enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo);
+       __be32 newip;
+       u_int16_t port;
+       char buffer[sizeof("nnn.nnn.nnn.nnn:nnnnn")];
+       unsigned buflen;
 
-       dataoff = ip_hdrlen(skb) + sizeof(struct udphdr);
+       /* Connection will come from reply */
+       if (ct->tuplehash[dir].tuple.src.u3.ip == ct->tuplehash[!dir].tuple.dst.u3.ip)
+               newip = exp->tuple.dst.u3.ip;
+       else
+               newip = ct->tuplehash[!dir].tuple.dst.u3.ip;
 
-       /* Get actual SDP length */
-       if (ct_sip_get_info(ct, dptr, skb->len - dataoff, &matchoff,
-                           &matchlen, POS_SDP_HEADER) > 0) {
+       /* If the signalling port matches the connection's source port in the
+        * original direction, try to use the destination port in the opposite
+        * direction. */
+       if (exp->tuple.dst.u.udp.port ==
+           ct->tuplehash[dir].tuple.src.u.udp.port)
+               port = ntohs(ct->tuplehash[!dir].tuple.dst.u.udp.port);
+       else
+               port = ntohs(exp->tuple.dst.u.udp.port);
+
+       exp->saved_ip = exp->tuple.dst.u3.ip;
+       exp->tuple.dst.u3.ip = newip;
+       exp->saved_proto.udp.port = exp->tuple.dst.u.udp.port;
+       exp->dir = !dir;
+       exp->expectfn = ip_nat_sip_expected;
 
-               /* since ct_sip_get_info() give us a pointer passing 'v='
-                  we need to add 2 bytes in this count. */
-               int c_len = skb->len - dataoff - matchoff + 2;
+       for (; port != 0; port++) {
+               exp->tuple.dst.u.udp.port = htons(port);
+               if (nf_ct_expect_related(exp) == 0)
+                       break;
+       }
 
-               /* Now, update SDP length */
-               if (ct_sip_get_info(ct, dptr, skb->len - dataoff, &matchoff,
-                                   &matchlen, POS_CONTENT) > 0) {
+       if (port == 0)
+               return NF_DROP;
 
-                       bufflen = sprintf(buffer, "%u", c_len);
-                       return nf_nat_mangle_udp_packet(skb, ct, ctinfo,
-                                                       matchoff, matchlen,
-                                                       buffer, bufflen);
-               }
+       if (exp->tuple.dst.u3.ip != exp->saved_ip ||
+           exp->tuple.dst.u.udp.port != exp->saved_proto.udp.port) {
+               buflen = sprintf(buffer, "%u.%u.%u.%u:%u",
+                                NIPQUAD(newip), port);
+               if (!mangle_packet(skb, dptr, datalen, matchoff, matchlen,
+                                  buffer, buflen))
+                       goto err;
        }
-       return 0;
+       return NF_ACCEPT;
+
+err:
+       nf_ct_unexpect_related(exp);
+       return NF_DROP;
 }
 
-static unsigned int mangle_sdp(struct sk_buff *skb,
-                              enum ip_conntrack_info ctinfo,
-                              struct nf_conn *ct,
-                              __be32 newip, u_int16_t port,
-                              const char *dptr)
+static int mangle_content_len(struct sk_buff *skb,
+                             const char **dptr, unsigned int *datalen)
 {
-       char buffer[sizeof("nnn.nnn.nnn.nnn")];
-       unsigned int dataoff, bufflen;
+       enum ip_conntrack_info ctinfo;
+       struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
+       unsigned int matchoff, matchlen;
+       char buffer[sizeof("65536")];
+       int buflen, c_len;
 
-       dataoff = ip_hdrlen(skb) + sizeof(struct udphdr);
+       /* Get actual SDP length */
+       if (ct_sip_get_sdp_header(ct, *dptr, 0, *datalen,
+                                 SDP_HDR_VERSION, SDP_HDR_UNSPEC,
+                                 &matchoff, &matchlen) <= 0)
+               return 0;
+       c_len = *datalen - matchoff + strlen("v=");
 
-       /* Mangle owner and contact info. */
-       bufflen = sprintf(buffer, "%u.%u.%u.%u", NIPQUAD(newip));
-       if (!mangle_sip_packet(skb, ctinfo, ct, &dptr, skb->len - dataoff,
-                              buffer, bufflen, POS_OWNER_IP4))
+       /* Now, update SDP length */
+       if (ct_sip_get_header(ct, *dptr, 0, *datalen, SIP_HDR_CONTENT_LENGTH,
+                             &matchoff, &matchlen) <= 0)
                return 0;
 
-       if (!mangle_sip_packet(skb, ctinfo, ct, &dptr, skb->len - dataoff,
-                              buffer, bufflen, POS_CONNECTION_IP4))
+       buflen = sprintf(buffer, "%u", c_len);
+       return mangle_packet(skb, dptr, datalen, matchoff, matchlen,
+                            buffer, buflen);
+}
+
+static unsigned mangle_sdp_packet(struct sk_buff *skb, const char **dptr,
+                                 unsigned int dataoff, unsigned int *datalen,
+                                 enum sdp_header_types type,
+                                 enum sdp_header_types term,
+                                 char *buffer, int buflen)
+{
+       enum ip_conntrack_info ctinfo;
+       struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
+       unsigned int matchlen, matchoff;
+
+       if (ct_sip_get_sdp_header(ct, *dptr, dataoff, *datalen, type, term,
+                                 &matchoff, &matchlen) <= 0)
                return 0;
+       return mangle_packet(skb, dptr, datalen, matchoff, matchlen,
+                            buffer, buflen);
+}
 
-       /* Mangle media port. */
-       bufflen = sprintf(buffer, "%u", port);
-       if (!mangle_sip_packet(skb, ctinfo, ct, &dptr, skb->len - dataoff,
-                              buffer, bufflen, POS_MEDIA))
+static unsigned int ip_nat_sdp_addr(struct sk_buff *skb, const char **dptr,
+                                   unsigned int dataoff,
+                                   unsigned int *datalen,
+                                   enum sdp_header_types type,
+                                   enum sdp_header_types term,
+                                   const union nf_inet_addr *addr)
+{
+       char buffer[sizeof("nnn.nnn.nnn.nnn")];
+       unsigned int buflen;
+
+       buflen = sprintf(buffer, NIPQUAD_FMT, NIPQUAD(addr->ip));
+       if (!mangle_sdp_packet(skb, dptr, dataoff, datalen, type, term,
+                              buffer, buflen))
                return 0;
 
-       return mangle_content_len(skb, ctinfo, ct, dptr);
+       return mangle_content_len(skb, dptr, datalen);
 }
 
-static void ip_nat_sdp_expect(struct nf_conn *ct,
-                             struct nf_conntrack_expect *exp)
+static unsigned int ip_nat_sdp_port(struct sk_buff *skb,
+                                   const char **dptr,
+                                   unsigned int *datalen,
+                                   unsigned int matchoff,
+                                   unsigned int matchlen,
+                                   u_int16_t port)
 {
-       struct nf_nat_range range;
+       char buffer[sizeof("nnnnn")];
+       unsigned int buflen;
 
-       /* This must be a fresh one. */
-       BUG_ON(ct->status & IPS_NAT_DONE_MASK);
+       buflen = sprintf(buffer, "%u", port);
+       if (!mangle_packet(skb, dptr, datalen, matchoff, matchlen,
+                          buffer, buflen))
+               return 0;
 
-       /* Change src to where master sends to */
-       range.flags = IP_NAT_RANGE_MAP_IPS;
-       range.min_ip = range.max_ip
-               = ct->master->tuplehash[!exp->dir].tuple.dst.u3.ip;
-       nf_nat_setup_info(ct, &range, IP_NAT_MANIP_SRC);
+       return mangle_content_len(skb, dptr, datalen);
+}
 
-       /* For DST manip, map port here to where it's expected. */
-       range.flags = (IP_NAT_RANGE_MAP_IPS | IP_NAT_RANGE_PROTO_SPECIFIED);
-       range.min = range.max = exp->saved_proto;
-       range.min_ip = range.max_ip = exp->saved_ip;
-       nf_nat_setup_info(ct, &range, IP_NAT_MANIP_DST);
+static unsigned int ip_nat_sdp_session(struct sk_buff *skb, const char **dptr,
+                                      unsigned int dataoff,
+                                      unsigned int *datalen,
+                                      const union nf_inet_addr *addr)
+{
+       char buffer[sizeof("nnn.nnn.nnn.nnn")];
+       unsigned int buflen;
+
+       /* Mangle session description owner and contact addresses */
+       buflen = sprintf(buffer, "%u.%u.%u.%u", NIPQUAD(addr->ip));
+       if (!mangle_sdp_packet(skb, dptr, dataoff, datalen,
+                              SDP_HDR_OWNER_IP4, SDP_HDR_MEDIA,
+                              buffer, buflen))
+               return 0;
+
+       if (!mangle_sdp_packet(skb, dptr, dataoff, datalen,
+                              SDP_HDR_CONNECTION_IP4, SDP_HDR_MEDIA,
+                              buffer, buflen))
+               return 0;
+
+       return mangle_content_len(skb, dptr, datalen);
 }
 
 /* So, this packet has hit the connection tracking matching code.
    Mangle it, and change the expectation to match the new version. */
-static unsigned int ip_nat_sdp(struct sk_buff *skb,
-                              enum ip_conntrack_info ctinfo,
-                              struct nf_conntrack_expect *exp,
-                              const char *dptr)
+static unsigned int ip_nat_sdp_media(struct sk_buff *skb,
+                                    const char **dptr,
+                                    unsigned int *datalen,
+                                    struct nf_conntrack_expect *rtp_exp,
+                                    struct nf_conntrack_expect *rtcp_exp,
+                                    unsigned int mediaoff,
+                                    unsigned int medialen,
+                                    union nf_inet_addr *rtp_addr)
 {
-       struct nf_conn *ct = exp->master;
+       enum ip_conntrack_info ctinfo;
+       struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
        enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo);
-       __be32 newip;
        u_int16_t port;
 
        /* Connection will come from reply */
        if (ct->tuplehash[dir].tuple.src.u3.ip ==
            ct->tuplehash[!dir].tuple.dst.u3.ip)
-               newip = exp->tuple.dst.u3.ip;
+               rtp_addr->ip = rtp_exp->tuple.dst.u3.ip;
        else
-               newip = ct->tuplehash[!dir].tuple.dst.u3.ip;
-
-       exp->saved_ip = exp->tuple.dst.u3.ip;
-       exp->tuple.dst.u3.ip = newip;
-       exp->saved_proto.udp.port = exp->tuple.dst.u.udp.port;
-       exp->dir = !dir;
-
-       /* When you see the packet, we need to NAT it the same as the
-          this one. */
-       exp->expectfn = ip_nat_sdp_expect;
-
-       /* Try to get same port: if not, try to change it. */
-       for (port = ntohs(exp->saved_proto.udp.port); port != 0; port++) {
-               exp->tuple.dst.u.udp.port = htons(port);
-               if (nf_ct_expect_related(exp) == 0)
+               rtp_addr->ip = ct->tuplehash[!dir].tuple.dst.u3.ip;
+
+       rtp_exp->saved_ip = rtp_exp->tuple.dst.u3.ip;
+       rtp_exp->tuple.dst.u3.ip = rtp_addr->ip;
+       rtp_exp->saved_proto.udp.port = rtp_exp->tuple.dst.u.udp.port;
+       rtp_exp->dir = !dir;
+       rtp_exp->expectfn = ip_nat_sip_expected;
+
+       rtcp_exp->saved_ip = rtcp_exp->tuple.dst.u3.ip;
+       rtcp_exp->tuple.dst.u3.ip = rtp_addr->ip;
+       rtcp_exp->saved_proto.udp.port = rtcp_exp->tuple.dst.u.udp.port;
+       rtcp_exp->dir = !dir;
+       rtcp_exp->expectfn = ip_nat_sip_expected;
+
+       /* Try to get same pair of ports: if not, try to change them. */
+       for (port = ntohs(rtp_exp->tuple.dst.u.udp.port);
+            port != 0; port += 2) {
+               rtp_exp->tuple.dst.u.udp.port = htons(port);
+               if (nf_ct_expect_related(rtp_exp) != 0)
+                       continue;
+               rtcp_exp->tuple.dst.u.udp.port = htons(port + 1);
+               if (nf_ct_expect_related(rtcp_exp) == 0)
                        break;
+               nf_ct_unexpect_related(rtp_exp);
        }
 
        if (port == 0)
-               return NF_DROP;
+               goto err1;
+
+       /* Update media port. */
+       if (rtp_exp->tuple.dst.u.udp.port != rtp_exp->saved_proto.udp.port &&
+           !ip_nat_sdp_port(skb, dptr, datalen, mediaoff, medialen, port))
+               goto err2;
 
-       if (!mangle_sdp(skb, ctinfo, ct, newip, port, dptr)) {
-               nf_ct_unexpect_related(exp);
-               return NF_DROP;
-       }
        return NF_ACCEPT;
+
+err2:
+       nf_ct_unexpect_related(rtp_exp);
+       nf_ct_unexpect_related(rtcp_exp);
+err1:
+       return NF_DROP;
 }
 
 static void __exit nf_nat_sip_fini(void)
 {
        rcu_assign_pointer(nf_nat_sip_hook, NULL);
-       rcu_assign_pointer(nf_nat_sdp_hook, NULL);
+       rcu_assign_pointer(nf_nat_sip_expect_hook, NULL);
+       rcu_assign_pointer(nf_nat_sdp_addr_hook, NULL);
+       rcu_assign_pointer(nf_nat_sdp_port_hook, NULL);
+       rcu_assign_pointer(nf_nat_sdp_session_hook, NULL);
+       rcu_assign_pointer(nf_nat_sdp_media_hook, NULL);
        synchronize_rcu();
 }
 
 static int __init nf_nat_sip_init(void)
 {
        BUG_ON(nf_nat_sip_hook != NULL);
-       BUG_ON(nf_nat_sdp_hook != NULL);
+       BUG_ON(nf_nat_sip_expect_hook != NULL);
+       BUG_ON(nf_nat_sdp_addr_hook != NULL);
+       BUG_ON(nf_nat_sdp_port_hook != NULL);
+       BUG_ON(nf_nat_sdp_session_hook != NULL);
+       BUG_ON(nf_nat_sdp_media_hook != NULL);
        rcu_assign_pointer(nf_nat_sip_hook, ip_nat_sip);
-       rcu_assign_pointer(nf_nat_sdp_hook, ip_nat_sdp);
+       rcu_assign_pointer(nf_nat_sip_expect_hook, ip_nat_sip_expect);
+       rcu_assign_pointer(nf_nat_sdp_addr_hook, ip_nat_sdp_addr);
+       rcu_assign_pointer(nf_nat_sdp_port_hook, ip_nat_sdp_port);
+       rcu_assign_pointer(nf_nat_sdp_session_hook, ip_nat_sdp_session);
+       rcu_assign_pointer(nf_nat_sdp_media_hook, ip_nat_sdp_media);
        return 0;
 }
 
index 540ce6ae887c0a797f8db68cb99a0be8c69c98ac..000e080bac5c49ec35541cee0f8d93ebf4779452 100644 (file)
@@ -50,6 +50,7 @@
 #include <net/udp.h>
 
 #include <net/netfilter/nf_nat.h>
+#include <net/netfilter/nf_conntrack_expect.h>
 #include <net/netfilter/nf_conntrack_helper.h>
 #include <net/netfilter/nf_nat_helper.h>
 
@@ -1267,11 +1268,15 @@ static int help(struct sk_buff *skb, unsigned int protoff,
        return ret;
 }
 
+static const struct nf_conntrack_expect_policy snmp_exp_policy = {
+       .max_expected   = 0,
+       .timeout        = 180,
+};
+
 static struct nf_conntrack_helper snmp_helper __read_mostly = {
-       .max_expected           = 0,
-       .timeout                = 180,
        .me                     = THIS_MODULE,
        .help                   = help,
+       .expect_policy          = &snmp_exp_policy,
        .name                   = "snmp",
        .tuple.src.l3num        = AF_INET,
        .tuple.src.u.udp.port   = __constant_htons(SNMP_PORT),
@@ -1279,10 +1284,9 @@ static struct nf_conntrack_helper snmp_helper __read_mostly = {
 };
 
 static struct nf_conntrack_helper snmp_trap_helper __read_mostly = {
-       .max_expected           = 0,
-       .timeout                = 180,
        .me                     = THIS_MODULE,
        .help                   = help,
+       .expect_policy          = &snmp_exp_policy,
        .name                   = "snmp_trap",
        .tuple.src.l3num        = AF_INET,
        .tuple.src.u.udp.port   = __constant_htons(SNMP_TRAP_PORT),
index 3f68a937b6024622aa0471aea5c52611e81822fe..d965f0a39c84e8562ee13958aea98023e8133e83 100644 (file)
@@ -117,7 +117,7 @@ static struct sock *__raw_v4_lookup(struct net *net, struct sock *sk,
        sk_for_each_from(sk, node) {
                struct inet_sock *inet = inet_sk(sk);
 
-               if (sk->sk_net == net && inet->num == num               &&
+               if (net_eq(sock_net(sk), net) && inet->num == num       &&
                    !(inet->daddr && inet->daddr != raddr)              &&
                    !(inet->rcv_saddr && inet->rcv_saddr != laddr)      &&
                    !(sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif))
@@ -168,7 +168,7 @@ static int raw_v4_input(struct sk_buff *skb, struct iphdr *iph, int hash)
        if (hlist_empty(head))
                goto out;
 
-       net = skb->dev->nd_net;
+       net = dev_net(skb->dev);
        sk = __raw_v4_lookup(net, __sk_head(head), iph->protocol,
                             iph->saddr, iph->daddr,
                             skb->dev->ifindex);
@@ -276,7 +276,7 @@ void raw_icmp_error(struct sk_buff *skb, int protocol, u32 info)
        raw_sk = sk_head(&raw_v4_hashinfo.ht[hash]);
        if (raw_sk != NULL) {
                iph = (struct iphdr *)skb->data;
-               net = skb->dev->nd_net;
+               net = dev_net(skb->dev);
 
                while ((raw_sk = __raw_v4_lookup(net, raw_sk, protocol,
                                                iph->daddr, iph->saddr,
@@ -499,7 +499,7 @@ static int raw_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
        ipc.oif = sk->sk_bound_dev_if;
 
        if (msg->msg_controllen) {
-               err = ip_cmsg_send(sk->sk_net, msg, &ipc);
+               err = ip_cmsg_send(sock_net(sk), msg, &ipc);
                if (err)
                        goto out;
                if (ipc.opt)
@@ -553,7 +553,7 @@ static int raw_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
                }
 
                security_sk_classify_flow(sk, &fl);
-               err = ip_route_output_flow(sk->sk_net, &rt, &fl, sk, 1);
+               err = ip_route_output_flow(sock_net(sk), &rt, &fl, sk, 1);
        }
        if (err)
                goto done;
@@ -620,7 +620,7 @@ static int raw_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
 
        if (sk->sk_state != TCP_CLOSE || addr_len < sizeof(struct sockaddr_in))
                goto out;
-       chk_addr_ret = inet_addr_type(sk->sk_net, addr->sin_addr.s_addr);
+       chk_addr_ret = inet_addr_type(sock_net(sk), addr->sin_addr.s_addr);
        ret = -EADDRNOTAVAIL;
        if (addr->sin_addr.s_addr && chk_addr_ret != RTN_LOCAL &&
            chk_addr_ret != RTN_MULTICAST && chk_addr_ret != RTN_BROADCAST)
@@ -856,7 +856,7 @@ static struct sock *raw_get_first(struct seq_file *seq)
                struct hlist_node *node;
 
                sk_for_each(sk, node, &state->h->ht[state->bucket])
-                       if (sk->sk_net == state->p.net)
+                       if (sock_net(sk) == seq_file_net(seq))
                                goto found;
        }
        sk = NULL;
@@ -872,7 +872,7 @@ static struct sock *raw_get_next(struct seq_file *seq, struct sock *sk)
                sk = sk_next(sk);
 try_again:
                ;
-       } while (sk && sk->sk_net != state->p.net);
+       } while (sk && sock_net(sk) != seq_file_net(seq));
 
        if (!sk && ++state->bucket < RAW_HTABLE_SIZE) {
                sk = sk_head(&state->h->ht[state->bucket]);
index 2941ef21f2034f5da3aeeff6fc5e759aec86b64a..230716c2dfe0ae4db22a93c34e87c1424113f792 100644 (file)
@@ -276,15 +276,16 @@ struct rt_cache_iter_state {
        int genid;
 };
 
-static struct rtable *rt_cache_get_first(struct rt_cache_iter_state *st)
+static struct rtable *rt_cache_get_first(struct seq_file *seq)
 {
+       struct rt_cache_iter_state *st = seq->private;
        struct rtable *r = NULL;
 
        for (st->bucket = rt_hash_mask; st->bucket >= 0; --st->bucket) {
                rcu_read_lock_bh();
                r = rcu_dereference(rt_hash_table[st->bucket].chain);
                while (r) {
-                       if (r->u.dst.dev->nd_net == st->p.net &&
+                       if (dev_net(r->u.dst.dev) == seq_file_net(seq) &&
                            r->rt_genid == st->genid)
                                return r;
                        r = rcu_dereference(r->u.dst.rt_next);
@@ -294,9 +295,10 @@ static struct rtable *rt_cache_get_first(struct rt_cache_iter_state *st)
        return r;
 }
 
-static struct rtable *__rt_cache_get_next(struct rt_cache_iter_state *st,
+static struct rtable *__rt_cache_get_next(struct seq_file *seq,
                                          struct rtable *r)
 {
+       struct rt_cache_iter_state *st = seq->private;
        r = r->u.dst.rt_next;
        while (!r) {
                rcu_read_unlock_bh();
@@ -308,11 +310,12 @@ static struct rtable *__rt_cache_get_next(struct rt_cache_iter_state *st,
        return rcu_dereference(r);
 }
 
-static struct rtable *rt_cache_get_next(struct rt_cache_iter_state *st,
+static struct rtable *rt_cache_get_next(struct seq_file *seq,
                                        struct rtable *r)
 {
-       while ((r = __rt_cache_get_next(st, r)) != NULL) {
-               if (r->u.dst.dev->nd_net != st->p.net)
+       struct rt_cache_iter_state *st = seq->private;
+       while ((r = __rt_cache_get_next(seq, r)) != NULL) {
+               if (dev_net(r->u.dst.dev) != seq_file_net(seq))
                        continue;
                if (r->rt_genid == st->genid)
                        break;
@@ -320,12 +323,12 @@ static struct rtable *rt_cache_get_next(struct rt_cache_iter_state *st,
        return r;
 }
 
-static struct rtable *rt_cache_get_idx(struct rt_cache_iter_state *st, loff_t pos)
+static struct rtable *rt_cache_get_idx(struct seq_file *seq, loff_t pos)
 {
-       struct rtable *r = rt_cache_get_first(st);
+       struct rtable *r = rt_cache_get_first(seq);
 
        if (r)
-               while (pos && (r = rt_cache_get_next(st, r)))
+               while (pos && (r = rt_cache_get_next(seq, r)))
                        --pos;
        return pos ? NULL : r;
 }
@@ -333,9 +336,8 @@ static struct rtable *rt_cache_get_idx(struct rt_cache_iter_state *st, loff_t po
 static void *rt_cache_seq_start(struct seq_file *seq, loff_t *pos)
 {
        struct rt_cache_iter_state *st = seq->private;
-
        if (*pos)
-               return rt_cache_get_idx(st, *pos - 1);
+               return rt_cache_get_idx(seq, *pos - 1);
        st->genid = atomic_read(&rt_genid);
        return SEQ_START_TOKEN;
 }
@@ -343,12 +345,11 @@ static void *rt_cache_seq_start(struct seq_file *seq, loff_t *pos)
 static void *rt_cache_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 {
        struct rtable *r;
-       struct rt_cache_iter_state *st = seq->private;
 
        if (v == SEQ_START_TOKEN)
-               r = rt_cache_get_first(st);
+               r = rt_cache_get_first(seq);
        else
-               r = rt_cache_get_next(st, v);
+               r = rt_cache_get_next(seq, v);
        ++*pos;
        return r;
 }
@@ -680,7 +681,7 @@ static inline int compare_keys(struct flowi *fl1, struct flowi *fl2)
 
 static inline int compare_netns(struct rtable *rt1, struct rtable *rt2)
 {
-       return rt1->u.dst.dev->nd_net == rt2->u.dst.dev->nd_net;
+       return dev_net(rt1->u.dst.dev) == dev_net(rt2->u.dst.dev);
 }
 
 /*
@@ -1164,7 +1165,7 @@ void ip_rt_redirect(__be32 old_gw, __be32 daddr, __be32 new_gw,
        if (!in_dev)
                return;
 
-       net = dev->nd_net;
+       net = dev_net(dev);
        if (new_gw == old_gw || !IN_DEV_RX_REDIRECTS(in_dev)
            || ipv4_is_multicast(new_gw) || ipv4_is_lbcast(new_gw)
            || ipv4_is_zeronet(new_gw))
@@ -1195,7 +1196,7 @@ void ip_rt_redirect(__be32 old_gw, __be32 daddr, __be32 new_gw,
                                    rth->fl.oif != ikeys[k] ||
                                    rth->fl.iif != 0 ||
                                    rth->rt_genid != atomic_read(&rt_genid) ||
-                                   rth->u.dst.dev->nd_net != net) {
+                                   !net_eq(dev_net(rth->u.dst.dev), net)) {
                                        rthp = &rth->u.dst.rt_next;
                                        continue;
                                }
@@ -1454,7 +1455,7 @@ unsigned short ip_rt_frag_needed(struct net *net, struct iphdr *iph,
                            rth->rt_src  == iph->saddr &&
                            rth->fl.iif == 0 &&
                            !(dst_metric_locked(&rth->u.dst, RTAX_MTU)) &&
-                           rth->u.dst.dev->nd_net == net &&
+                           net_eq(dev_net(rth->u.dst.dev), net) &&
                            rth->rt_genid == atomic_read(&rt_genid)) {
                                unsigned short mtu = new_mtu;
 
@@ -1530,9 +1531,9 @@ static void ipv4_dst_ifdown(struct dst_entry *dst, struct net_device *dev,
 {
        struct rtable *rt = (struct rtable *) dst;
        struct in_device *idev = rt->idev;
-       if (dev != dev->nd_net->loopback_dev && idev && idev->dev == dev) {
+       if (dev != dev_net(dev)->loopback_dev && idev && idev->dev == dev) {
                struct in_device *loopback_idev =
-                       in_dev_get(dev->nd_net->loopback_dev);
+                       in_dev_get(dev_net(dev)->loopback_dev);
                if (loopback_idev) {
                        rt->idev = loopback_idev;
                        in_dev_put(idev);
@@ -1576,7 +1577,7 @@ void ip_rt_get_source(u8 *addr, struct rtable *rt)
 
        if (rt->fl.iif == 0)
                src = rt->rt_src;
-       else if (fib_lookup(rt->u.dst.dev->nd_net, &rt->fl, &res) == 0) {
+       else if (fib_lookup(dev_net(rt->u.dst.dev), &rt->fl, &res) == 0) {
                src = FIB_RES_PREFSRC(res);
                fib_res_put(&res);
        } else
@@ -1900,7 +1901,7 @@ static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr,
        __be32          spec_dst;
        int             err = -EINVAL;
        int             free_res = 0;
-       struct net    * net = dev->nd_net;
+       struct net    * net = dev_net(dev);
 
        /* IP on this device is disabled. */
 
@@ -2071,7 +2072,7 @@ int ip_route_input(struct sk_buff *skb, __be32 daddr, __be32 saddr,
        int iif = dev->ifindex;
        struct net *net;
 
-       net = dev->nd_net;
+       net = dev_net(dev);
        tos &= IPTOS_RT_MASK;
        hash = rt_hash(daddr, saddr, iif);
 
@@ -2084,7 +2085,7 @@ int ip_route_input(struct sk_buff *skb, __be32 daddr, __be32 saddr,
                    rth->fl.oif == 0 &&
                    rth->fl.mark == skb->mark &&
                    rth->fl.fl4_tos == tos &&
-                   rth->u.dst.dev->nd_net == net &&
+                   net_eq(dev_net(rth->u.dst.dev), net) &&
                    rth->rt_genid == atomic_read(&rt_genid)) {
                        dst_use(&rth->u.dst, jiffies);
                        RT_CACHE_STAT_INC(in_hit);
@@ -2486,7 +2487,7 @@ int __ip_route_output_key(struct net *net, struct rtable **rp,
                    rth->fl.mark == flp->mark &&
                    !((rth->fl.fl4_tos ^ flp->fl4_tos) &
                            (IPTOS_RT_MASK | RTO_ONLINK)) &&
-                   rth->u.dst.dev->nd_net == net &&
+                   net_eq(dev_net(rth->u.dst.dev), net) &&
                    rth->rt_genid == atomic_read(&rt_genid)) {
                        dst_use(&rth->u.dst, jiffies);
                        RT_CACHE_STAT_INC(out_hit);
@@ -2689,7 +2690,7 @@ nla_put_failure:
 
 static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg)
 {
-       struct net *net = in_skb->sk->sk_net;
+       struct net *net = sock_net(in_skb->sk);
        struct rtmsg *rtm;
        struct nlattr *tb[RTA_MAX+1];
        struct rtable *rt = NULL;
@@ -2785,7 +2786,7 @@ int ip_rt_dump(struct sk_buff *skb,  struct netlink_callback *cb)
        int idx, s_idx;
        struct net *net;
 
-       net = skb->sk->sk_net;
+       net = sock_net(skb->sk);
 
        s_h = cb->args[0];
        if (s_h < 0)
@@ -2795,7 +2796,7 @@ int ip_rt_dump(struct sk_buff *skb,  struct netlink_callback *cb)
                rcu_read_lock_bh();
                for (rt = rcu_dereference(rt_hash_table[h].chain), idx = 0; rt;
                     rt = rcu_dereference(rt->u.dst.rt_next), idx++) {
-                       if (rt->u.dst.dev->nd_net != net || idx < s_idx)
+                       if (!net_eq(dev_net(rt->u.dst.dev), net) || idx < s_idx)
                                continue;
                        if (rt->rt_genid != atomic_read(&rt_genid))
                                continue;
index 649d00a50cb16489952d276417b71ca7d9e5fd9c..2a5881c817784867103df3c7a9d98f03a28e78ad 100644 (file)
@@ -353,7 +353,7 @@ void tcp_v4_err(struct sk_buff *skb, u32 info)
                return;
        }
 
-       sk = inet_lookup(skb->dev->nd_net, &tcp_hashinfo, iph->daddr, th->dest,
+       sk = inet_lookup(dev_net(skb->dev), &tcp_hashinfo, iph->daddr, th->dest,
                        iph->saddr, th->source, inet_iif(skb));
        if (!sk) {
                ICMP_INC_STATS_BH(ICMP_MIB_INERRORS);
@@ -1486,7 +1486,7 @@ static struct sock *tcp_v4_hnd_req(struct sock *sk, struct sk_buff *skb)
        if (req)
                return tcp_check_req(sk, skb, req, prev);
 
-       nsk = inet_lookup_established(sk->sk_net, &tcp_hashinfo, iph->saddr,
+       nsk = inet_lookup_established(sock_net(sk), &tcp_hashinfo, iph->saddr,
                        th->source, iph->daddr, th->dest, inet_iif(skb));
 
        if (nsk) {
@@ -1644,7 +1644,7 @@ int tcp_v4_rcv(struct sk_buff *skb)
        TCP_SKB_CB(skb)->flags   = iph->tos;
        TCP_SKB_CB(skb)->sacked  = 0;
 
-       sk = __inet_lookup(skb->dev->nd_net, &tcp_hashinfo, iph->saddr,
+       sk = __inet_lookup(dev_net(skb->dev), &tcp_hashinfo, iph->saddr,
                        th->source, iph->daddr, th->dest, inet_iif(skb));
        if (!sk)
                goto no_tcp_socket;
@@ -1718,7 +1718,7 @@ do_time_wait:
        }
        switch (tcp_timewait_state_process(inet_twsk(sk), skb, th)) {
        case TCP_TW_SYN: {
-               struct sock *sk2 = inet_lookup_listener(skb->dev->nd_net,
+               struct sock *sk2 = inet_lookup_listener(dev_net(skb->dev),
                                                        &tcp_hashinfo,
                                                        iph->daddr, th->dest,
                                                        inet_iif(skb));
@@ -1974,7 +1974,7 @@ static void *listening_get_next(struct seq_file *seq, void *cur)
                while (1) {
                        while (req) {
                                if (req->rsk_ops->family == st->family &&
-                                   req->sk->sk_net == net) {
+                                   net_eq(sock_net(req->sk), net)) {
                                        cur = req;
                                        goto out;
                                }
@@ -1998,7 +1998,7 @@ get_req:
        }
 get_sk:
        sk_for_each_from(sk, node) {
-               if (sk->sk_family == st->family && sk->sk_net == net) {
+               if (sk->sk_family == st->family && net_eq(sock_net(sk), net)) {
                        cur = sk;
                        goto out;
                }
@@ -2049,7 +2049,7 @@ static void *established_get_first(struct seq_file *seq)
                read_lock_bh(lock);
                sk_for_each(sk, node, &tcp_hashinfo.ehash[st->bucket].chain) {
                        if (sk->sk_family != st->family ||
-                           sk->sk_net != net) {
+                           !net_eq(sock_net(sk), net)) {
                                continue;
                        }
                        rc = sk;
@@ -2059,7 +2059,7 @@ static void *established_get_first(struct seq_file *seq)
                inet_twsk_for_each(tw, node,
                                   &tcp_hashinfo.ehash[st->bucket].twchain) {
                        if (tw->tw_family != st->family ||
-                           tw->tw_net != net) {
+                           !net_eq(twsk_net(tw), net)) {
                                continue;
                        }
                        rc = tw;
@@ -2086,7 +2086,7 @@ static void *established_get_next(struct seq_file *seq, void *cur)
                tw = cur;
                tw = tw_next(tw);
 get_tw:
-               while (tw && (tw->tw_family != st->family || tw->tw_net != net)) {
+               while (tw && (tw->tw_family != st->family || !net_eq(twsk_net(tw), net))) {
                        tw = tw_next(tw);
                }
                if (tw) {
@@ -2107,7 +2107,7 @@ get_tw:
                sk = sk_next(sk);
 
        sk_for_each_from(sk, node) {
-               if (sk->sk_family == st->family && sk->sk_net == net)
+               if (sk->sk_family == st->family && net_eq(sock_net(sk), net))
                        goto found;
        }
 
index b37581dfd02980be81095dcb492958d3b4987b19..80007c79f12faa5330a30bacbc6bbe53ae3cb089 100644 (file)
@@ -137,7 +137,7 @@ static inline int __udp_lib_lport_inuse(struct net *net, __u16 num,
        struct hlist_node *node;
 
        sk_for_each(sk, node, &udptable[num & (UDP_HTABLE_SIZE - 1)])
-               if (sk->sk_net == net && sk->sk_hash == num)
+               if (net_eq(sock_net(sk), net) && sk->sk_hash == num)
                        return 1;
        return 0;
 }
@@ -158,7 +158,7 @@ int udp_lib_get_port(struct sock *sk, unsigned short snum,
        struct hlist_head *head;
        struct sock *sk2;
        int    error = 1;
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
 
        write_lock_bh(&udp_hash_lock);
 
@@ -218,7 +218,7 @@ gotit:
                sk_for_each(sk2, node, head)
                        if (sk2->sk_hash == snum                             &&
                            sk2 != sk                                        &&
-                           sk2->sk_net == net                               &&
+                           net_eq(sock_net(sk2), net)                       &&
                            (!sk2->sk_reuse        || !sk->sk_reuse)         &&
                            (!sk2->sk_bound_dev_if || !sk->sk_bound_dev_if
                             || sk2->sk_bound_dev_if == sk->sk_bound_dev_if) &&
@@ -269,7 +269,7 @@ static struct sock *__udp4_lib_lookup(struct net *net, __be32 saddr,
        sk_for_each(sk, node, &udptable[hnum & (UDP_HTABLE_SIZE - 1)]) {
                struct inet_sock *inet = inet_sk(sk);
 
-               if (sk->sk_net == net && sk->sk_hash == hnum &&
+               if (net_eq(sock_net(sk), net) && sk->sk_hash == hnum &&
                                !ipv6_only_sock(sk)) {
                        int score = (sk->sk_family == PF_INET ? 1 : 0);
                        if (inet->rcv_saddr) {
@@ -357,7 +357,7 @@ void __udp4_lib_err(struct sk_buff *skb, u32 info, struct hlist_head udptable[])
        int harderr;
        int err;
 
-       sk = __udp4_lib_lookup(skb->dev->nd_net, iph->daddr, uh->dest,
+       sk = __udp4_lib_lookup(dev_net(skb->dev), iph->daddr, uh->dest,
                        iph->saddr, uh->source, skb->dev->ifindex, udptable);
        if (sk == NULL) {
                ICMP_INC_STATS_BH(ICMP_MIB_INERRORS);
@@ -607,7 +607,7 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
 
        ipc.oif = sk->sk_bound_dev_if;
        if (msg->msg_controllen) {
-               err = ip_cmsg_send(sk->sk_net, msg, &ipc);
+               err = ip_cmsg_send(sock_net(sk), msg, &ipc);
                if (err)
                        return err;
                if (ipc.opt)
@@ -656,7 +656,7 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
                                               { .sport = inet->sport,
                                                 .dport = dport } } };
                security_sk_classify_flow(sk, &fl);
-               err = ip_route_output_flow(sk->sk_net, &rt, &fl, sk, 1);
+               err = ip_route_output_flow(sock_net(sk), &rt, &fl, sk, 1);
                if (err) {
                        if (err == -ENETUNREACH)
                                IP_INC_STATS_BH(IPSTATS_MIB_OUTNOROUTES);
@@ -1181,7 +1181,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct hlist_head udptable[],
        if (rt->rt_flags & (RTCF_BROADCAST|RTCF_MULTICAST))
                return __udp4_lib_mcast_deliver(skb, uh, saddr, daddr, udptable);
 
-       sk = __udp4_lib_lookup(skb->dev->nd_net, saddr, uh->source, daddr,
+       sk = __udp4_lib_lookup(dev_net(skb->dev), saddr, uh->source, daddr,
                        uh->dest, inet_iif(skb), udptable);
 
        if (sk != NULL) {
@@ -1511,7 +1511,7 @@ static struct sock *udp_get_first(struct seq_file *seq)
        for (state->bucket = 0; state->bucket < UDP_HTABLE_SIZE; ++state->bucket) {
                struct hlist_node *node;
                sk_for_each(sk, node, state->hashtable + state->bucket) {
-                       if (sk->sk_net != net)
+                       if (!net_eq(sock_net(sk), net))
                                continue;
                        if (sk->sk_family == state->family)
                                goto found;
@@ -1531,7 +1531,7 @@ static struct sock *udp_get_next(struct seq_file *seq, struct sock *sk)
                sk = sk_next(sk);
 try_again:
                ;
-       } while (sk && (sk->sk_net != net || sk->sk_family != state->family));
+       } while (sk && (!net_eq(sock_net(sk), net) || sk->sk_family != state->family));
 
        if (!sk && ++state->bucket < UDP_HTABLE_SIZE) {
                sk = sk_head(state->hashtable + state->bucket);
index 10ed70491434fe9240445ae71cff6c46259e9d74..c63de0a72aba746184e1c4e9f97aefe57cdff1a8 100644 (file)
@@ -221,7 +221,7 @@ static void xfrm4_dst_ifdown(struct dst_entry *dst, struct net_device *dev,
        xdst = (struct xfrm_dst *)dst;
        if (xdst->u.rt.idev->dev == dev) {
                struct in_device *loopback_idev =
-                       in_dev_get(dev->nd_net->loopback_dev);
+                       in_dev_get(dev_net(dev)->loopback_dev);
                BUG_ON(!loopback_idev);
 
                do {
index 89954885dee150158e2f630dd8db5163f6eb7267..5ab9973571efbcf91a6bde5b390722e54c24babe 100644 (file)
@@ -335,7 +335,7 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev)
 
        rwlock_init(&ndev->lock);
        ndev->dev = dev;
-       memcpy(&ndev->cnf, dev->nd_net->ipv6.devconf_dflt, sizeof(ndev->cnf));
+       memcpy(&ndev->cnf, dev_net(dev)->ipv6.devconf_dflt, sizeof(ndev->cnf));
        ndev->cnf.mtu6 = dev->mtu;
        ndev->cnf.sysctl = NULL;
        ndev->nd_parms = neigh_parms_alloc(dev, &nd_tbl);
@@ -561,7 +561,7 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen,
        write_lock(&addrconf_hash_lock);
 
        /* Ignore adding duplicate addresses on an interface */
-       if (ipv6_chk_same_addr(idev->dev->nd_net, addr, idev->dev)) {
+       if (ipv6_chk_same_addr(dev_net(idev->dev), addr, idev->dev)) {
                ADBG(("ipv6_add_addr: already assigned\n"));
                err = -EEXIST;
                goto out;
@@ -751,7 +751,7 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp)
        if ((ifp->flags & IFA_F_PERMANENT) && onlink < 1) {
                struct in6_addr prefix;
                struct rt6_info *rt;
-               struct net *net = ifp->idev->dev->nd_net;
+               struct net *net = dev_net(ifp->idev->dev);
                ipv6_addr_prefix(&prefix, &ifp->addr, ifp->prefix_len);
                rt = rt6_lookup(net, &prefix, NULL, ifp->idev->dev->ifindex, 1);
 
@@ -1044,7 +1044,7 @@ int ipv6_dev_get_saddr(struct net_device *dst_dev,
 {
        struct ipv6_saddr_score scores[2],
                                *score = &scores[0], *hiscore = &scores[1];
-       struct net *net = dst_dev->nd_net;
+       struct net *net = dev_net(dst_dev);
        struct ipv6_saddr_dst dst;
        struct net_device *dev;
        int dst_type;
@@ -1217,7 +1217,7 @@ int ipv6_chk_addr(struct net *net, struct in6_addr *addr,
 
        read_lock_bh(&addrconf_hash_lock);
        for(ifp = inet6_addr_lst[hash]; ifp; ifp=ifp->lst_next) {
-               if (ifp->idev->dev->nd_net != net)
+               if (!net_eq(dev_net(ifp->idev->dev), net))
                        continue;
                if (ipv6_addr_equal(&ifp->addr, addr) &&
                    !(ifp->flags&IFA_F_TENTATIVE)) {
@@ -1239,7 +1239,7 @@ int ipv6_chk_same_addr(struct net *net, const struct in6_addr *addr,
        u8 hash = ipv6_addr_hash(addr);
 
        for(ifp = inet6_addr_lst[hash]; ifp; ifp=ifp->lst_next) {
-               if (ifp->idev->dev->nd_net != net)
+               if (!net_eq(dev_net(ifp->idev->dev), net))
                        continue;
                if (ipv6_addr_equal(&ifp->addr, addr)) {
                        if (dev == NULL || ifp->idev->dev == dev)
@@ -1257,7 +1257,7 @@ struct inet6_ifaddr *ipv6_get_ifaddr(struct net *net, struct in6_addr *addr,
 
        read_lock_bh(&addrconf_hash_lock);
        for(ifp = inet6_addr_lst[hash]; ifp; ifp=ifp->lst_next) {
-               if (ifp->idev->dev->nd_net != net)
+               if (!net_eq(dev_net(ifp->idev->dev), net))
                        continue;
                if (ipv6_addr_equal(&ifp->addr, addr)) {
                        if (dev == NULL || ifp->idev->dev == dev ||
@@ -1559,7 +1559,7 @@ addrconf_prefix_route(struct in6_addr *pfx, int plen, struct net_device *dev,
                .fc_expires = expires,
                .fc_dst_len = plen,
                .fc_flags = RTF_UP | flags,
-               .fc_nlinfo.nl_net = dev->nd_net,
+               .fc_nlinfo.nl_net = dev_net(dev),
        };
 
        ipv6_addr_copy(&cfg.fc_dst, pfx);
@@ -1586,7 +1586,7 @@ static void addrconf_add_mroute(struct net_device *dev)
                .fc_ifindex = dev->ifindex,
                .fc_dst_len = 8,
                .fc_flags = RTF_UP,
-               .fc_nlinfo.nl_net = dev->nd_net,
+               .fc_nlinfo.nl_net = dev_net(dev),
        };
 
        ipv6_addr_set(&cfg.fc_dst, htonl(0xFF000000), 0, 0, 0);
@@ -1603,7 +1603,7 @@ static void sit_route_add(struct net_device *dev)
                .fc_ifindex = dev->ifindex,
                .fc_dst_len = 96,
                .fc_flags = RTF_UP | RTF_NONEXTHOP,
-               .fc_nlinfo.nl_net = dev->nd_net,
+               .fc_nlinfo.nl_net = dev_net(dev),
        };
 
        /* prefix length - 96 bits "::d.d.d.d" */
@@ -1704,7 +1704,7 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len)
 
        if (pinfo->onlink) {
                struct rt6_info *rt;
-               rt = rt6_lookup(dev->nd_net, &pinfo->prefix, NULL,
+               rt = rt6_lookup(dev_net(dev), &pinfo->prefix, NULL,
                                dev->ifindex, 1);
 
                if (rt && ((rt->rt6i_flags & (RTF_GATEWAY | RTF_DEFAULT)) == 0)) {
@@ -1748,7 +1748,7 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len)
 
 ok:
 
-               ifp = ipv6_get_ifaddr(dev->nd_net, &addr, dev, 1);
+               ifp = ipv6_get_ifaddr(dev_net(dev), &addr, dev, 1);
 
                if (ifp == NULL && valid_lft) {
                        int max_addresses = in6_dev->cnf.max_addresses;
@@ -2071,7 +2071,7 @@ static void sit_add_v4_addrs(struct inet6_dev *idev)
        struct inet6_ifaddr * ifp;
        struct in6_addr addr;
        struct net_device *dev;
-       struct net *net = idev->dev->nd_net;
+       struct net *net = dev_net(idev->dev);
        int scope;
 
        ASSERT_RTNL();
@@ -2261,7 +2261,7 @@ ipv6_inherit_linklocal(struct inet6_dev *idev, struct net_device *link_dev)
 static void ip6_tnl_add_linklocal(struct inet6_dev *idev)
 {
        struct net_device *link_dev;
-       struct net *net = idev->dev->nd_net;
+       struct net *net = dev_net(idev->dev);
 
        /* first try to inherit the link-local address from the link device */
        if (idev->dev->iflink &&
@@ -2442,7 +2442,7 @@ static int addrconf_ifdown(struct net_device *dev, int how)
 {
        struct inet6_dev *idev;
        struct inet6_ifaddr *ifa, **bifa;
-       struct net *net = dev->nd_net;
+       struct net *net = dev_net(dev);
        int i;
 
        ASSERT_RTNL();
@@ -2766,12 +2766,12 @@ static struct inet6_ifaddr *if6_get_first(struct seq_file *seq)
 {
        struct inet6_ifaddr *ifa = NULL;
        struct if6_iter_state *state = seq->private;
-       struct net *net = state->p.net;
+       struct net *net = seq_file_net(seq);
 
        for (state->bucket = 0; state->bucket < IN6_ADDR_HSIZE; ++state->bucket) {
                ifa = inet6_addr_lst[state->bucket];
 
-               while (ifa && ifa->idev->dev->nd_net != net)
+               while (ifa && !net_eq(dev_net(ifa->idev->dev), net))
                        ifa = ifa->lst_next;
                if (ifa)
                        break;
@@ -2782,12 +2782,12 @@ static struct inet6_ifaddr *if6_get_first(struct seq_file *seq)
 static struct inet6_ifaddr *if6_get_next(struct seq_file *seq, struct inet6_ifaddr *ifa)
 {
        struct if6_iter_state *state = seq->private;
-       struct net *net = state->p.net;
+       struct net *net = seq_file_net(seq);
 
        ifa = ifa->lst_next;
 try_again:
        if (ifa) {
-               if (ifa->idev->dev->nd_net != net) {
+               if (!net_eq(dev_net(ifa->idev->dev), net)) {
                        ifa = ifa->lst_next;
                        goto try_again;
                }
@@ -2905,7 +2905,7 @@ int ipv6_chk_home_addr(struct net *net, struct in6_addr *addr)
        u8 hash = ipv6_addr_hash(addr);
        read_lock_bh(&addrconf_hash_lock);
        for (ifp = inet6_addr_lst[hash]; ifp; ifp = ifp->lst_next) {
-               if (ifp->idev->dev->nd_net != net)
+               if (!net_eq(dev_net(ifp->idev->dev), net))
                        continue;
                if (ipv6_addr_cmp(&ifp->addr, addr) == 0 &&
                    (ifp->flags & IFA_F_HOMEADDRESS)) {
@@ -3054,7 +3054,7 @@ static const struct nla_policy ifa_ipv6_policy[IFA_MAX+1] = {
 static int
 inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct ifaddrmsg *ifm;
        struct nlattr *tb[IFA_MAX+1];
        struct in6_addr *pfx;
@@ -3112,7 +3112,7 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, u8 ifa_flags,
 static int
 inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct ifaddrmsg *ifm;
        struct nlattr *tb[IFA_MAX+1];
        struct in6_addr *pfx;
@@ -3322,7 +3322,7 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
        struct inet6_ifaddr *ifa;
        struct ifmcaddr6 *ifmca;
        struct ifacaddr6 *ifaca;
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
 
        s_idx = cb->args[0];
        s_ip_idx = ip_idx = cb->args[1];
@@ -3418,7 +3418,7 @@ static int inet6_dump_ifacaddr(struct sk_buff *skb, struct netlink_callback *cb)
 static int inet6_rtm_getaddr(struct sk_buff *in_skb, struct nlmsghdr* nlh,
                             void *arg)
 {
-       struct net *net = in_skb->sk->sk_net;
+       struct net *net = sock_net(in_skb->sk);
        struct ifaddrmsg *ifm;
        struct nlattr *tb[IFA_MAX+1];
        struct in6_addr *addr = NULL;
@@ -3469,7 +3469,7 @@ errout:
 static void inet6_ifa_notify(int event, struct inet6_ifaddr *ifa)
 {
        struct sk_buff *skb;
-       struct net *net = ifa->idev->dev->nd_net;
+       struct net *net = dev_net(ifa->idev->dev);
        int err = -ENOBUFS;
 
        skb = nlmsg_new(inet6_ifaddr_msgsize(), GFP_ATOMIC);
@@ -3645,7 +3645,7 @@ nla_put_failure:
 
 static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        int idx, err;
        int s_idx = cb->args[0];
        struct net_device *dev;
@@ -3675,7 +3675,7 @@ cont:
 void inet6_ifinfo_notify(int event, struct inet6_dev *idev)
 {
        struct sk_buff *skb;
-       struct net *net = idev->dev->nd_net;
+       struct net *net = dev_net(idev->dev);
        int err = -ENOBUFS;
 
        skb = nlmsg_new(inet6_if_nlmsg_size(), GFP_ATOMIC);
@@ -3745,7 +3745,7 @@ static void inet6_prefix_notify(int event, struct inet6_dev *idev,
                         struct prefix_info *pinfo)
 {
        struct sk_buff *skb;
-       struct net *net = idev->dev->nd_net;
+       struct net *net = dev_net(idev->dev);
        int err = -ENOBUFS;
 
        skb = nlmsg_new(inet6_prefix_nlmsg_size(), GFP_ATOMIC);
@@ -4157,7 +4157,7 @@ static void addrconf_sysctl_register(struct inet6_dev *idev)
                              NET_IPV6_NEIGH, "ipv6",
                              &ndisc_ifinfo_sysctl_change,
                              NULL);
-       __addrconf_sysctl_register(idev->dev->nd_net, idev->dev->name,
+       __addrconf_sysctl_register(dev_net(idev->dev), idev->dev->name,
                        idev->dev->ifindex, idev, &idev->cnf);
 }
 
index de371b5997fec1354f3268169d9636b3354b0dbf..9bfa8846f2626690d87bd4218fd9b340506e1c57 100644 (file)
@@ -364,7 +364,7 @@ static const struct nla_policy ifal_policy[IFAL_MAX+1] = {
 static int ip6addrlbl_newdel(struct sk_buff *skb, struct nlmsghdr *nlh,
                             void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct ifaddrlblmsg *ifal;
        struct nlattr *tb[IFAL_MAX+1];
        struct in6_addr *pfx;
@@ -452,7 +452,7 @@ static int ip6addrlbl_fill(struct sk_buff *skb,
 
 static int ip6addrlbl_dump(struct sk_buff *skb, struct netlink_callback *cb)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct ip6addrlbl_entry *p;
        struct hlist_node *pos;
        int idx = 0, s_idx = cb->args[0];
@@ -490,7 +490,7 @@ static inline int ip6addrlbl_msgsize(void)
 static int ip6addrlbl_get(struct sk_buff *in_skb, struct nlmsghdr* nlh,
                          void *arg)
 {
-       struct net *net = in_skb->sk->sk_net;
+       struct net *net = sock_net(in_skb->sk);
        struct ifaddrlblmsg *ifal;
        struct nlattr *tb[IFAL_MAX+1];
        struct in6_addr *addr;
index f52bdaed8a1b246c98a24e0faa6ba16853a7aebb..12f04e9d3e88ea983c027754a535465e26c108da 100644 (file)
@@ -245,7 +245,7 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
        struct sock *sk = sock->sk;
        struct inet_sock *inet = inet_sk(sk);
        struct ipv6_pinfo *np = inet6_sk(sk);
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
        __be32 v4addr = 0;
        unsigned short snum;
        int addr_type = 0;
@@ -438,7 +438,7 @@ EXPORT_SYMBOL(inet6_getname);
 int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 {
        struct sock *sk = sock->sk;
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
 
        switch(cmd)
        {
index e7a7fe26cebff9933fc9cf0e009b039c5f5c94d2..cac580749ebeeb2608f59bb4876cc552c3fc4eb2 100644 (file)
@@ -154,7 +154,7 @@ static int fib6_rule_configure(struct fib_rule *rule, struct sk_buff *skb,
                               struct nlattr **tb)
 {
        int err = -EINVAL;
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct fib6_rule *rule6 = (struct fib6_rule *) rule;
 
        if (rule->action == FR_ACT_TO_TBL) {
index 86332417b4028de0397c54e24ba58ede6094c3f5..63309d10df3a1f1ddadd74ae7d0a28a7972a8b76 100644 (file)
@@ -163,7 +163,7 @@ static inline int icmpv6_xrlim_allow(struct sock *sk, int type,
                                     struct flowi *fl)
 {
        struct dst_entry *dst;
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
        int res = 0;
 
        /* Informational messages are not limited. */
@@ -306,7 +306,7 @@ static inline void mip6_addr_swap(struct sk_buff *skb) {}
 void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
                 struct net_device *dev)
 {
-       struct net *net = skb->dev->nd_net;
+       struct net *net = dev_net(skb->dev);
        struct inet6_dev *idev = NULL;
        struct ipv6hdr *hdr = ipv6_hdr(skb);
        struct sock *sk;
@@ -507,7 +507,7 @@ EXPORT_SYMBOL(icmpv6_send);
 
 static void icmpv6_echo_reply(struct sk_buff *skb)
 {
-       struct net *net = skb->dev->nd_net;
+       struct net *net = dev_net(skb->dev);
        struct sock *sk;
        struct inet6_dev *idev;
        struct ipv6_pinfo *np;
index c0c8d2d176823a74cf7d6db3bcf5cb4c4ab32ccc..340c7d42b83a17f89739bed374d4b6955c0b3d69 100644 (file)
@@ -105,7 +105,7 @@ struct sock *inet6_lookup_listener(struct net *net,
 
        read_lock(&hashinfo->lhash_lock);
        sk_for_each(sk, node, &hashinfo->listening_hash[inet_lhashfn(hnum)]) {
-               if (sk->sk_net == net && inet_sk(sk)->num == hnum &&
+               if (net_eq(sock_net(sk), net) && inet_sk(sk)->num == hnum &&
                                sk->sk_family == PF_INET6) {
                        const struct ipv6_pinfo *np = inet6_sk(sk);
 
@@ -172,7 +172,7 @@ static int __inet6_check_established(struct inet_timewait_death_row *death_row,
        struct sock *sk2;
        const struct hlist_node *node;
        struct inet_timewait_sock *tw;
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
 
        prefetch(head->chain.first);
        write_lock(lock);
index b0814b0082e744cc861789a5f20389643e5daed4..b3f6e03c454cc7571800fc8b06538bdb5aa4c24e 100644 (file)
@@ -346,7 +346,7 @@ end:
 
 static int inet6_dump_fib(struct sk_buff *skb, struct netlink_callback *cb)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        unsigned int h, s_h;
        unsigned int e = 0, s_e;
        struct rt6_rtnl_dump_arg arg;
index d34aa61353bbf587cf3328c48c3b799f85de16f0..a8b4da25b0a777f21158e4da3da99463c135884b 100644 (file)
@@ -402,7 +402,7 @@ int ip6_forward(struct sk_buff *skb)
        struct dst_entry *dst = skb->dst;
        struct ipv6hdr *hdr = ipv6_hdr(skb);
        struct inet6_skb_parm *opt = IP6CB(skb);
-       struct net *net = dst->dev->nd_net;
+       struct net *net = dev_net(dst->dev);
 
        if (ipv6_devconf.forwarding == 0)
                goto error;
@@ -910,7 +910,7 @@ static int ip6_dst_lookup_tail(struct sock *sk,
                               struct dst_entry **dst, struct flowi *fl)
 {
        int err;
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
 
        if (*dst == NULL)
                *dst = ip6_route_output(net, sk, fl);
index dc6695cc5767a140722e2ee46f4ed5df52d4f0b9..d3d93d752e1099c43cfa1e33adfa15630463df7f 100644 (file)
@@ -107,7 +107,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
                    char __user *optval, int optlen)
 {
        struct ipv6_pinfo *np = inet6_sk(sk);
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
        int val, valbool;
        int retv = -ENOPROTOOPT;
 
index 957ac7e9e929039b8ba4d604f6f2a2cb770bda4b..d810cff818cfb27c8ac7e55bf5276c5c7754ef12 100644 (file)
@@ -181,7 +181,7 @@ int ipv6_sock_mc_join(struct sock *sk, int ifindex, struct in6_addr *addr)
        struct net_device *dev = NULL;
        struct ipv6_mc_socklist *mc_lst;
        struct ipv6_pinfo *np = inet6_sk(sk);
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
        int err;
 
        if (!ipv6_addr_is_multicast(addr))
@@ -255,7 +255,7 @@ int ipv6_sock_mc_drop(struct sock *sk, int ifindex, struct in6_addr *addr)
 {
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct ipv6_mc_socklist *mc_lst, **lnk;
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
 
        write_lock_bh(&ipv6_sk_mc_lock);
        for (lnk = &np->ipv6_mc_list; (mc_lst = *lnk) !=NULL ; lnk = &mc_lst->next) {
@@ -327,7 +327,7 @@ void ipv6_sock_mc_close(struct sock *sk)
 {
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct ipv6_mc_socklist *mc_lst;
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
 
        write_lock_bh(&ipv6_sk_mc_lock);
        while ((mc_lst = np->ipv6_mc_list) != NULL) {
@@ -365,7 +365,7 @@ int ip6_mc_source(int add, int omode, struct sock *sk,
        struct inet6_dev *idev;
        struct ipv6_pinfo *inet6 = inet6_sk(sk);
        struct ip6_sf_socklist *psl;
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
        int i, j, rv;
        int leavegroup = 0;
        int pmclocked = 0;
@@ -505,7 +505,7 @@ int ip6_mc_msfilter(struct sock *sk, struct group_filter *gsf)
        struct inet6_dev *idev;
        struct ipv6_pinfo *inet6 = inet6_sk(sk);
        struct ip6_sf_socklist *newpsl, *psl;
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
        int leavegroup = 0;
        int i, err;
 
@@ -598,7 +598,7 @@ int ip6_mc_msfget(struct sock *sk, struct group_filter *gsf,
        struct net_device *dev;
        struct ipv6_pinfo *inet6 = inet6_sk(sk);
        struct ip6_sf_socklist *psl;
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
 
        group = &((struct sockaddr_in6 *)&gsf->gf_group)->sin6_addr;
 
@@ -1400,7 +1400,7 @@ mld_scount(struct ifmcaddr6 *pmc, int type, int gdeleted, int sdeleted)
 
 static struct sk_buff *mld_newpack(struct net_device *dev, int size)
 {
-       struct net *net = dev->nd_net;
+       struct net *net = dev_net(dev);
        struct sock *sk = net->ipv6.igmp_sk;
        struct sk_buff *skb;
        struct mld2_report *pmr;
@@ -1448,7 +1448,7 @@ static void mld_sendpack(struct sk_buff *skb)
                              (struct mld2_report *)skb_transport_header(skb);
        int payload_len, mldlen;
        struct inet6_dev *idev = in6_dev_get(skb->dev);
-       struct net *net = skb->dev->nd_net;
+       struct net *net = dev_net(skb->dev);
        int err;
        struct flowi fl;
 
@@ -1762,7 +1762,7 @@ static void mld_send_cr(struct inet6_dev *idev)
 
 static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type)
 {
-       struct net *net = dev->nd_net;
+       struct net *net = dev_net(dev);
        struct sock *sk = net->ipv6.igmp_sk;
        struct inet6_dev *idev;
        struct sk_buff *skb;
@@ -2355,7 +2355,7 @@ static inline struct ifmcaddr6 *igmp6_mc_get_first(struct seq_file *seq)
 {
        struct ifmcaddr6 *im = NULL;
        struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq);
-       struct net *net = state->p.net;
+       struct net *net = seq_file_net(seq);
 
        state->idev = NULL;
        for_each_netdev(net, state->dev) {
@@ -2486,7 +2486,7 @@ static inline struct ip6_sf_list *igmp6_mcf_get_first(struct seq_file *seq)
        struct ip6_sf_list *psf = NULL;
        struct ifmcaddr6 *im = NULL;
        struct igmp6_mcf_iter_state *state = igmp6_mcf_seq_private(seq);
-       struct net *net = state->p.net;
+       struct net *net = seq_file_net(seq);
 
        state->idev = NULL;
        state->im = NULL;
index 3f68a6eae7b28b7bca10698b1e6e857950868f43..79af57f586e838ec248cd8fa79b0ebb696715129 100644 (file)
@@ -447,7 +447,7 @@ static void __ndisc_send(struct net_device *dev,
 {
        struct flowi fl;
        struct dst_entry *dst;
-       struct net *net = dev->nd_net;
+       struct net *net = dev_net(dev);
        struct sock *sk = net->ipv6.ndisc_sk;
        struct sk_buff *skb;
        struct icmp6hdr *hdr;
@@ -539,7 +539,7 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
        };
 
        /* for anycast or proxy, solicited_addr != src_addr */
-       ifp = ipv6_get_ifaddr(dev->nd_net, solicited_addr, dev, 1);
+       ifp = ipv6_get_ifaddr(dev_net(dev), solicited_addr, dev, 1);
        if (ifp) {
                src_addr = solicited_addr;
                if (ifp->flags & IFA_F_OPTIMISTIC)
@@ -547,7 +547,7 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
                in6_ifa_put(ifp);
        } else {
                if (ipv6_dev_get_saddr(dev, daddr,
-                                      inet6_sk(dev->nd_net->ipv6.ndisc_sk)->srcprefs,
+                                      inet6_sk(dev_net(dev)->ipv6.ndisc_sk)->srcprefs,
                                       &tmpaddr))
                        return;
                src_addr = &tmpaddr;
@@ -601,7 +601,7 @@ void ndisc_send_rs(struct net_device *dev, struct in6_addr *saddr,
         * suppress the inclusion of the sllao.
         */
        if (send_sllao) {
-               struct inet6_ifaddr *ifp = ipv6_get_ifaddr(dev->nd_net, saddr,
+               struct inet6_ifaddr *ifp = ipv6_get_ifaddr(dev_net(dev), saddr,
                                                           dev, 1);
                if (ifp) {
                        if (ifp->flags & IFA_F_OPTIMISTIC)  {
@@ -639,7 +639,7 @@ static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb)
        struct in6_addr *target = (struct in6_addr *)&neigh->primary_key;
        int probes = atomic_read(&neigh->probes);
 
-       if (skb && ipv6_chk_addr(dev->nd_net, &ipv6_hdr(skb)->saddr, dev, 1))
+       if (skb && ipv6_chk_addr(dev_net(dev), &ipv6_hdr(skb)->saddr, dev, 1))
                saddr = &ipv6_hdr(skb)->saddr;
 
        if ((probes -= neigh->parms->ucast_probes) < 0) {
@@ -727,7 +727,7 @@ static void ndisc_recv_ns(struct sk_buff *skb)
 
        inc = ipv6_addr_is_multicast(daddr);
 
-       ifp = ipv6_get_ifaddr(dev->nd_net, &msg->target, dev, 1);
+       ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1);
        if (ifp) {
 
                if (ifp->flags & (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)) {
@@ -776,7 +776,7 @@ static void ndisc_recv_ns(struct sk_buff *skb)
                if (ipv6_chk_acast_addr(dev, &msg->target) ||
                    (idev->cnf.forwarding &&
                     (ipv6_devconf.proxy_ndp || idev->cnf.proxy_ndp) &&
-                    (pneigh = pneigh_lookup(&nd_tbl, dev->nd_net,
+                    (pneigh = pneigh_lookup(&nd_tbl, dev_net(dev),
                                             &msg->target, dev, 0)) != NULL)) {
                        if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) &&
                            skb->pkt_type != PACKET_HOST &&
@@ -886,7 +886,7 @@ static void ndisc_recv_na(struct sk_buff *skb)
                        return;
                }
        }
-       ifp = ipv6_get_ifaddr(dev->nd_net, &msg->target, dev, 1);
+       ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1);
        if (ifp) {
                if (ifp->flags & IFA_F_TENTATIVE) {
                        addrconf_dad_failure(ifp);
@@ -918,7 +918,7 @@ static void ndisc_recv_na(struct sk_buff *skb)
                 */
                if (lladdr && !memcmp(lladdr, dev->dev_addr, dev->addr_len) &&
                    ipv6_devconf.forwarding && ipv6_devconf.proxy_ndp &&
-                   pneigh_lookup(&nd_tbl, dev->nd_net, &msg->target, dev, 0)) {
+                   pneigh_lookup(&nd_tbl, dev_net(dev), &msg->target, dev, 0)) {
                        /* XXX: idev->cnf.prixy_ndp */
                        goto out;
                }
@@ -1008,7 +1008,7 @@ static void ndisc_ra_useropt(struct sk_buff *ra, struct nd_opt_hdr *opt)
        struct sk_buff *skb;
        struct nlmsghdr *nlh;
        struct nduseroptmsg *ndmsg;
-       struct net *net = ra->dev->nd_net;
+       struct net *net = dev_net(ra->dev);
        int err;
        int base_size = NLMSG_ALIGN(sizeof(struct nduseroptmsg)
                                    + (opt->nd_opt_len << 3));
@@ -1395,7 +1395,7 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh,
                         struct in6_addr *target)
 {
        struct net_device *dev = skb->dev;
-       struct net *net = dev->nd_net;
+       struct net *net = dev_net(dev);
        struct sock *sk = net->ipv6.ndisc_sk;
        int len = sizeof(struct icmp6hdr) + 2 * sizeof(struct in6_addr);
        struct sk_buff *buff;
@@ -1597,7 +1597,7 @@ int ndisc_rcv(struct sk_buff *skb)
 static int ndisc_netdev_event(struct notifier_block *this, unsigned long event, void *ptr)
 {
        struct net_device *dev = ptr;
-       struct net *net = dev->nd_net;
+       struct net *net = dev_net(dev);
 
        switch (event) {
        case NETDEV_CHANGEADDR:
index cc2f9afcf8087516215f52f8719d7dfa1593a316..a6d30626b47cffd25d10d86d1ac75cf350543a0e 100644 (file)
@@ -484,7 +484,7 @@ ipq_rcv_dev_event(struct notifier_block *this,
 {
        struct net_device *dev = ptr;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        /* Drop any packets associated with the downed device */
index af1ec7ba757c3602f4b1fe5b4d0188349edb8f2d..70ef0d276cc0191ad5bbb4b1f55360dfe7074bb5 100644 (file)
@@ -1879,11 +1879,11 @@ compat_do_ip6t_set_ctl(struct sock *sk, int cmd, void __user *user,
 
        switch (cmd) {
        case IP6T_SO_SET_REPLACE:
-               ret = compat_do_replace(sk->sk_net, user, len);
+               ret = compat_do_replace(sock_net(sk), user, len);
                break;
 
        case IP6T_SO_SET_ADD_COUNTERS:
-               ret = do_add_counters(sk->sk_net, user, len, 1);
+               ret = do_add_counters(sock_net(sk), user, len, 1);
                break;
 
        default:
@@ -1990,10 +1990,10 @@ compat_do_ip6t_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)
 
        switch (cmd) {
        case IP6T_SO_GET_INFO:
-               ret = get_info(sk->sk_net, user, len, 1);
+               ret = get_info(sock_net(sk), user, len, 1);
                break;
        case IP6T_SO_GET_ENTRIES:
-               ret = compat_get_entries(sk->sk_net, user, len);
+               ret = compat_get_entries(sock_net(sk), user, len);
                break;
        default:
                ret = do_ip6t_get_ctl(sk, cmd, user, len);
@@ -2012,11 +2012,11 @@ do_ip6t_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len)
 
        switch (cmd) {
        case IP6T_SO_SET_REPLACE:
-               ret = do_replace(sk->sk_net, user, len);
+               ret = do_replace(sock_net(sk), user, len);
                break;
 
        case IP6T_SO_SET_ADD_COUNTERS:
-               ret = do_add_counters(sk->sk_net, user, len, 0);
+               ret = do_add_counters(sock_net(sk), user, len, 0);
                break;
 
        default:
@@ -2037,11 +2037,11 @@ do_ip6t_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)
 
        switch (cmd) {
        case IP6T_SO_GET_INFO:
-               ret = get_info(sk->sk_net, user, len, 0);
+               ret = get_info(sock_net(sk), user, len, 0);
                break;
 
        case IP6T_SO_GET_ENTRIES:
-               ret = get_entries(sk->sk_net, user, len);
+               ret = get_entries(sock_net(sk), user, len);
                break;
 
        case IP6T_SO_GET_REVISION_MATCH:
index 8a5be290c7103e44183c37fb39edca3deb07abdd..364dc332532c39db9e15063982f1f7cd4665c8d4 100644 (file)
@@ -214,7 +214,7 @@ int snmp6_register_dev(struct inet6_dev *idev)
        if (!idev || !idev->dev)
                return -EINVAL;
 
-       if (idev->dev->nd_net != &init_net)
+       if (dev_net(idev->dev) != &init_net)
                return 0;
 
        if (!proc_net_devsnmp6)
index 548d0763f4d3ce5817e62982997f920944b0dae2..830da460369770affaf92bdda78b2b3a9881b6ac 100644 (file)
@@ -76,7 +76,7 @@ static struct sock *__raw_v6_lookup(struct net *net, struct sock *sk,
                if (inet_sk(sk)->num == num) {
                        struct ipv6_pinfo *np = inet6_sk(sk);
 
-                       if (sk->sk_net != net)
+                       if (!net_eq(sock_net(sk), net))
                                continue;
 
                        if (!ipv6_addr_any(&np->daddr) &&
@@ -176,7 +176,7 @@ static int ipv6_raw_deliver(struct sk_buff *skb, int nexthdr)
        if (sk == NULL)
                goto out;
 
-       net = skb->dev->nd_net;
+       net = dev_net(skb->dev);
        sk = __raw_v6_lookup(net, sk, nexthdr, daddr, saddr, IP6CB(skb)->iif);
 
        while (sk) {
@@ -280,7 +280,7 @@ static int rawv6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
                        if (!sk->sk_bound_dev_if)
                                goto out;
 
-                       dev = dev_get_by_index(sk->sk_net, sk->sk_bound_dev_if);
+                       dev = dev_get_by_index(sock_net(sk), sk->sk_bound_dev_if);
                        if (!dev) {
                                err = -ENODEV;
                                goto out;
@@ -293,7 +293,7 @@ static int rawv6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
                v4addr = LOOPBACK4_IPV6;
                if (!(addr_type & IPV6_ADDR_MULTICAST)) {
                        err = -EADDRNOTAVAIL;
-                       if (!ipv6_chk_addr(sk->sk_net, &addr->sin6_addr,
+                       if (!ipv6_chk_addr(sock_net(sk), &addr->sin6_addr,
                                           dev, 0)) {
                                if (dev)
                                        dev_put(dev);
@@ -363,7 +363,7 @@ void raw6_icmp_error(struct sk_buff *skb, int nexthdr,
        if (sk != NULL) {
                saddr = &ipv6_hdr(skb)->saddr;
                daddr = &ipv6_hdr(skb)->daddr;
-               net = skb->dev->nd_net;
+               net = dev_net(skb->dev);
 
                while ((sk = __raw_v6_lookup(net, sk, nexthdr, saddr, daddr,
                                                IP6CB(skb)->iif))) {
index f936d045a39da9436637421260e41b1613bf82db..4e1447634f3617bd9ea919a53704c74d6bff82bf 100644 (file)
@@ -600,7 +600,7 @@ static int ipv6_frag_rcv(struct sk_buff *skb)
                return 1;
        }
 
-       net = skb->dev->nd_net;
+       net = dev_net(skb->dev);
        if (atomic_read(&net->ipv6.frags.mem) > net->ipv6.frags.high_thresh)
                ip6_evictor(net, ip6_dst_idev(skb->dst));
 
index 06faa46920e136e991c74dddda8d081ad3419285..ac4428371432e39bb7ae979fdf72e6ea97b4d36d 100644 (file)
@@ -208,7 +208,7 @@ static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev,
        struct rt6_info *rt = (struct rt6_info *)dst;
        struct inet6_dev *idev = rt->rt6i_idev;
        struct net_device *loopback_dev =
-               dev->nd_net->loopback_dev;
+               dev_net(dev)->loopback_dev;
 
        if (dev != loopback_dev && idev != NULL && idev->dev == dev) {
                struct inet6_dev *loopback_idev =
@@ -433,7 +433,7 @@ static struct rt6_info *rt6_select(struct fib6_node *fn, int oif, int strict)
        RT6_TRACE("%s() => %p\n",
                  __func__, match);
 
-       net = rt0->rt6i_dev->nd_net;
+       net = dev_net(rt0->rt6i_dev);
        return (match ? match : net->ipv6.ip6_null_entry);
 }
 
@@ -441,7 +441,7 @@ static struct rt6_info *rt6_select(struct fib6_node *fn, int oif, int strict)
 int rt6_route_rcv(struct net_device *dev, u8 *opt, int len,
                  struct in6_addr *gwaddr)
 {
-       struct net *net = dev->nd_net;
+       struct net *net = dev_net(dev);
        struct route_info *rinfo = (struct route_info *) opt;
        struct in6_addr prefix_buf, *prefix;
        unsigned int pref;
@@ -607,7 +607,7 @@ static int __ip6_ins_rt(struct rt6_info *rt, struct nl_info *info)
 int ip6_ins_rt(struct rt6_info *rt)
 {
        struct nl_info info = {
-               .nl_net = rt->rt6i_dev->nd_net,
+               .nl_net = dev_net(rt->rt6i_dev),
        };
        return __ip6_ins_rt(rt, &info);
 }
@@ -745,7 +745,7 @@ static struct rt6_info *ip6_pol_route_input(struct net *net, struct fib6_table *
 void ip6_route_input(struct sk_buff *skb)
 {
        struct ipv6hdr *iph = ipv6_hdr(skb);
-       struct net *net = skb->dev->nd_net;
+       struct net *net = dev_net(skb->dev);
        int flags = RT6_LOOKUP_F_HAS_SADDR;
        struct flowi fl = {
                .iif = skb->dev->ifindex,
@@ -928,7 +928,7 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
 {
        struct rt6_info *rt;
        struct inet6_dev *idev = in6_dev_get(dev);
-       struct net *net = dev->nd_net;
+       struct net *net = dev_net(dev);
 
        if (unlikely(idev == NULL))
                return NULL;
@@ -1252,7 +1252,7 @@ install_route:
        rt->rt6i_idev = idev;
        rt->rt6i_table = table;
 
-       cfg->fc_nlinfo.nl_net = dev->nd_net;
+       cfg->fc_nlinfo.nl_net = dev_net(dev);
 
        return __ip6_ins_rt(rt, &cfg->fc_nlinfo);
 
@@ -1270,7 +1270,7 @@ static int __ip6_del_rt(struct rt6_info *rt, struct nl_info *info)
 {
        int err;
        struct fib6_table *table;
-       struct net *net = rt->rt6i_dev->nd_net;
+       struct net *net = dev_net(rt->rt6i_dev);
 
        if (rt == net->ipv6.ip6_null_entry)
                return -ENOENT;
@@ -1289,7 +1289,7 @@ static int __ip6_del_rt(struct rt6_info *rt, struct nl_info *info)
 int ip6_del_rt(struct rt6_info *rt)
 {
        struct nl_info info = {
-               .nl_net = rt->rt6i_dev->nd_net,
+               .nl_net = dev_net(rt->rt6i_dev),
        };
        return __ip6_del_rt(rt, &info);
 }
@@ -1401,7 +1401,7 @@ static struct rt6_info *ip6_route_redirect(struct in6_addr *dest,
                                           struct net_device *dev)
 {
        int flags = RT6_LOOKUP_F_HAS_SADDR;
-       struct net *net = dev->nd_net;
+       struct net *net = dev_net(dev);
        struct ip6rd_flowi rdfl = {
                .fl = {
                        .oif = dev->ifindex,
@@ -1428,7 +1428,7 @@ void rt6_redirect(struct in6_addr *dest, struct in6_addr *src,
 {
        struct rt6_info *rt, *nrt = NULL;
        struct netevent_redirect netevent;
-       struct net *net = neigh->dev->nd_net;
+       struct net *net = dev_net(neigh->dev);
 
        rt = ip6_route_redirect(dest, src, saddr, neigh->dev);
 
@@ -1477,7 +1477,7 @@ void rt6_redirect(struct in6_addr *dest, struct in6_addr *src,
        nrt->rt6i_nexthop = neigh_clone(neigh);
        /* Reset pmtu, it may be better */
        nrt->u.dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(neigh->dev);
-       nrt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(neigh->dev->nd_net,
+       nrt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(dev_net(neigh->dev),
                                                        dst_mtu(&nrt->u.dst));
 
        if (ip6_ins_rt(nrt))
@@ -1506,7 +1506,7 @@ void rt6_pmtu_discovery(struct in6_addr *daddr, struct in6_addr *saddr,
                        struct net_device *dev, u32 pmtu)
 {
        struct rt6_info *rt, *nrt;
-       struct net *net = dev->nd_net;
+       struct net *net = dev_net(dev);
        int allfrag = 0;
 
        rt = rt6_lookup(net, daddr, saddr, dev->ifindex, 0);
@@ -1583,7 +1583,7 @@ out:
 
 static struct rt6_info * ip6_rt_copy(struct rt6_info *ort)
 {
-       struct net *net = ort->rt6i_dev->nd_net;
+       struct net *net = dev_net(ort->rt6i_dev);
        struct rt6_info *rt = ip6_dst_alloc(net->ipv6.ip6_dst_ops);
 
        if (rt) {
@@ -1682,7 +1682,7 @@ struct rt6_info *rt6_get_dflt_router(struct in6_addr *addr, struct net_device *d
        struct rt6_info *rt;
        struct fib6_table *table;
 
-       table = fib6_get_table(dev->nd_net, RT6_TABLE_DFLT);
+       table = fib6_get_table(dev_net(dev), RT6_TABLE_DFLT);
        if (table == NULL)
                return NULL;
 
@@ -1713,7 +1713,7 @@ struct rt6_info *rt6_add_dflt_router(struct in6_addr *gwaddr,
                                  RTF_UP | RTF_EXPIRES | RTF_PREF(pref),
                .fc_nlinfo.pid = 0,
                .fc_nlinfo.nlh = NULL,
-               .fc_nlinfo.nl_net = dev->nd_net,
+               .fc_nlinfo.nl_net = dev_net(dev),
        };
 
        ipv6_addr_copy(&cfg.fc_gateway, gwaddr);
@@ -1862,7 +1862,7 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
                                    const struct in6_addr *addr,
                                    int anycast)
 {
-       struct net *net = idev->dev->nd_net;
+       struct net *net = dev_net(idev->dev);
        struct rt6_info *rt = ip6_dst_alloc(net->ipv6.ip6_dst_ops);
 
        if (rt == NULL)
@@ -1939,7 +1939,7 @@ static int rt6_mtu_change_route(struct rt6_info *rt, void *p_arg)
 {
        struct rt6_mtu_change_arg *arg = (struct rt6_mtu_change_arg *) p_arg;
        struct inet6_dev *idev;
-       struct net *net = arg->dev->nd_net;
+       struct net *net = dev_net(arg->dev);
 
        /* In IPv6 pmtu discovery is not optional,
           so that RTAX_MTU lock cannot disable it.
@@ -1983,7 +1983,7 @@ void rt6_mtu_change(struct net_device *dev, unsigned mtu)
                .mtu = mtu,
        };
 
-       fib6_clean_all(dev->nd_net, rt6_mtu_change_route, 0, &arg);
+       fib6_clean_all(dev_net(dev), rt6_mtu_change_route, 0, &arg);
 }
 
 static const struct nla_policy rtm_ipv6_policy[RTA_MAX+1] = {
@@ -2020,7 +2020,7 @@ static int rtm_to_fib6_config(struct sk_buff *skb, struct nlmsghdr *nlh,
 
        cfg->fc_nlinfo.pid = NETLINK_CB(skb).pid;
        cfg->fc_nlinfo.nlh = nlh;
-       cfg->fc_nlinfo.nl_net = skb->sk->sk_net;
+       cfg->fc_nlinfo.nl_net = sock_net(skb->sk);
 
        if (tb[RTA_GATEWAY]) {
                nla_memcpy(&cfg->fc_gateway, tb[RTA_GATEWAY], 16);
@@ -2216,7 +2216,7 @@ int rt6_dump_route(struct rt6_info *rt, void *p_arg)
 
 static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg)
 {
-       struct net *net = in_skb->sk->sk_net;
+       struct net *net = sock_net(in_skb->sk);
        struct nlattr *tb[RTA_MAX+1];
        struct rt6_info *rt;
        struct sk_buff *skb;
@@ -2321,7 +2321,7 @@ static int ip6_route_dev_notify(struct notifier_block *this,
                                unsigned long event, void *data)
 {
        struct net_device *dev = (struct net_device *)data;
-       struct net *net = dev->nd_net;
+       struct net *net = dev_net(dev);
 
        if (event == NETDEV_REGISTER && (dev->flags & IFF_LOOPBACK)) {
                net->ipv6.ip6_null_entry->u.dst.dev = dev;
index 8dd72966ff784bbadbe3558a94e07980efc7362e..323c7e06ef43da3d2509c1d3c7f5272fdc89a1e3 100644 (file)
@@ -321,7 +321,7 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
        struct tcp_sock *tp;
        __u32 seq;
 
-       sk = inet6_lookup(skb->dev->nd_net, &tcp_hashinfo, &hdr->daddr,
+       sk = inet6_lookup(dev_net(skb->dev), &tcp_hashinfo, &hdr->daddr,
                        th->dest, &hdr->saddr, th->source, skb->dev->ifindex);
 
        if (sk == NULL) {
@@ -988,7 +988,7 @@ static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)
        struct tcphdr *th = tcp_hdr(skb), *t1;
        struct sk_buff *buff;
        struct flowi fl;
-       struct net *net = skb->dst->dev->nd_net;
+       struct net *net = dev_net(skb->dst->dev);
        struct sock *ctl_sk = net->ipv6.tcp_sk;
        unsigned int tot_len = sizeof(*th);
 #ifdef CONFIG_TCP_MD5SIG
@@ -1093,7 +1093,7 @@ static void tcp_v6_send_ack(struct tcp_timewait_sock *tw,
        struct tcphdr *th = tcp_hdr(skb), *t1;
        struct sk_buff *buff;
        struct flowi fl;
-       struct net *net = skb->dev->nd_net;
+       struct net *net = dev_net(skb->dev);
        struct sock *ctl_sk = net->ipv6.tcp_sk;
        unsigned int tot_len = sizeof(struct tcphdr);
        __be32 *topt;
@@ -1218,7 +1218,7 @@ static struct sock *tcp_v6_hnd_req(struct sock *sk,struct sk_buff *skb)
        if (req)
                return tcp_check_req(sk, skb, req, prev);
 
-       nsk = __inet6_lookup_established(sk->sk_net, &tcp_hashinfo,
+       nsk = __inet6_lookup_established(sock_net(sk), &tcp_hashinfo,
                        &ipv6_hdr(skb)->saddr, th->source,
                        &ipv6_hdr(skb)->daddr, ntohs(th->dest), inet6_iif(skb));
 
@@ -1739,7 +1739,7 @@ static int tcp_v6_rcv(struct sk_buff *skb)
        TCP_SKB_CB(skb)->flags = ipv6_get_dsfield(ipv6_hdr(skb));
        TCP_SKB_CB(skb)->sacked = 0;
 
-       sk = __inet6_lookup(skb->dev->nd_net, &tcp_hashinfo,
+       sk = __inet6_lookup(dev_net(skb->dev), &tcp_hashinfo,
                        &ipv6_hdr(skb)->saddr, th->source,
                        &ipv6_hdr(skb)->daddr, ntohs(th->dest),
                        inet6_iif(skb));
@@ -1822,7 +1822,7 @@ do_time_wait:
        {
                struct sock *sk2;
 
-               sk2 = inet6_lookup_listener(skb->dev->nd_net, &tcp_hashinfo,
+               sk2 = inet6_lookup_listener(dev_net(skb->dev), &tcp_hashinfo,
                                            &ipv6_hdr(skb)->daddr,
                                            ntohs(th->dest), inet6_iif(skb));
                if (sk2 != NULL) {
index 593d3efadaf91ec7f895740535f6773ba11a537f..aacbc82ecf0f693791ceafc2d8ce390d4151a4e1 100644 (file)
@@ -70,7 +70,7 @@ static struct sock *__udp6_lib_lookup(struct net *net,
        sk_for_each(sk, node, &udptable[hnum & (UDP_HTABLE_SIZE - 1)]) {
                struct inet_sock *inet = inet_sk(sk);
 
-               if (sk->sk_net == net && sk->sk_hash == hnum &&
+               if (net_eq(sock_net(sk), net) && sk->sk_hash == hnum &&
                                sk->sk_family == PF_INET6) {
                        struct ipv6_pinfo *np = inet6_sk(sk);
                        int score = 0;
@@ -235,7 +235,7 @@ void __udp6_lib_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
        struct sock *sk;
        int err;
 
-       sk = __udp6_lib_lookup(skb->dev->nd_net, daddr, uh->dest,
+       sk = __udp6_lib_lookup(dev_net(skb->dev), daddr, uh->dest,
                               saddr, uh->source, inet6_iif(skb), udptable);
        if (sk == NULL)
                return;
@@ -323,7 +323,7 @@ static struct sock *udp_v6_mcast_next(struct sock *sk,
        sk_for_each_from(s, node) {
                struct inet_sock *inet = inet_sk(s);
 
-               if (s->sk_net != sk->sk_net)
+               if (sock_net(s) != sock_net(sk))
                        continue;
 
                if (s->sk_hash == num && s->sk_family == PF_INET6) {
@@ -483,7 +483,7 @@ int __udp6_lib_rcv(struct sk_buff *skb, struct hlist_head udptable[],
         * check socket cache ... must talk to Alan about his plans
         * for sock caches... i'll skip this for now.
         */
-       sk = __udp6_lib_lookup(skb->dev->nd_net, saddr, uh->source,
+       sk = __udp6_lib_lookup(dev_net(skb->dev), saddr, uh->source,
                               daddr, uh->dest, inet6_iif(skb), udptable);
 
        if (sk == NULL) {
index d92d1fceb8cfd18ada63d1d69add627054c7f041..8f1e0543b3c4f114539e288d12ac273c5fbe127d 100644 (file)
@@ -247,7 +247,7 @@ static void xfrm6_dst_ifdown(struct dst_entry *dst, struct net_device *dev,
        xdst = (struct xfrm_dst *)dst;
        if (xdst->u.rt6.rt6i_idev->dev == dev) {
                struct inet6_dev *loopback_idev =
-                       in6_dev_get(dev->nd_net->loopback_dev);
+                       in6_dev_get(dev_net(dev)->loopback_dev);
                BUG_ON(!loopback_idev);
 
                do {
index c76a9523091b2747f6b9c01dee54d478bd3b4ec7..81ae8735f5e3d21cff0cf88fca9b033f78ab1f9c 100644 (file)
@@ -335,7 +335,7 @@ static int ipxitf_device_event(struct notifier_block *notifier,
        struct net_device *dev = ptr;
        struct ipx_interface *i, *tmp;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        if (event != NETDEV_DOWN && event != NETDEV_UP)
@@ -1636,7 +1636,7 @@ static int ipx_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_ty
        u16 ipx_pktsize;
        int rc = 0;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                goto drop;
 
        /* Not ours */
index 6f21a53cb3e7c916fa327c36df52f2194b11844c..ae54b20d047035116afcd7c31abf021ee898b83b 100644 (file)
@@ -837,7 +837,7 @@ static int irda_accept(struct socket *sock, struct socket *newsock, int flags)
 
        IRDA_DEBUG(2, "%s()\n", __func__);
 
-       err = irda_create(sk->sk_net, newsock, sk->sk_protocol);
+       err = irda_create(sock_net(sk), newsock, sk->sk_protocol);
        if (err)
                return err;
 
index a38b231c8689ac44e415816eeb82ebdf915050b1..90894534f3cc67dc9c841405ce7be1bbe4de1d4f 100644 (file)
@@ -1326,7 +1326,7 @@ int irlap_driver_rcv(struct sk_buff *skb, struct net_device *dev,
        int command;
        __u8 control;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                goto out;
 
        /* FIXME: should we get our own field? */
index 5ebfd93ff5e7c8df59f207ce0c23e5e0eab5b665..5c6d89c6d51d2726dd008162181f307c6825e8d3 100644 (file)
@@ -700,7 +700,7 @@ static struct sock *llc_create_incoming_sock(struct sock *sk,
                                             struct llc_addr *saddr,
                                             struct llc_addr *daddr)
 {
-       struct sock *newsk = llc_sk_alloc(sk->sk_net, sk->sk_family, GFP_ATOMIC,
+       struct sock *newsk = llc_sk_alloc(sock_net(sk), sk->sk_family, GFP_ATOMIC,
                                          sk->sk_prot);
        struct llc_sock *newllc, *llc = llc_sk(sk);
 
index b9143d2a04e19ffe4665d5215f0063d068801711..a69c5c427fe38d53dccc880a63c7d9a18d9a7e99 100644 (file)
@@ -146,7 +146,7 @@ int llc_rcv(struct sk_buff *skb, struct net_device *dev,
        int (*rcv)(struct sk_buff *, struct net_device *,
                   struct packet_type *, struct net_device *);
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                goto drop;
 
        /*
index ec05684c56d709aa226642cba6d5330efab41d82..292fa28146fb33cfe5beb77e70c95a4f8caa96e2 100644 (file)
@@ -168,7 +168,7 @@ int nf_hook_slow(int pf, unsigned int hook, struct sk_buff *skb,
 #ifdef CONFIG_NET_NS
        struct net *net;
 
-       net = indev == NULL ? outdev->nd_net : indev->nd_net;
+       net = indev == NULL ? dev_net(outdev) : dev_net(indev);
        if (net != &init_net)
                return 1;
 #endif
index 7b8239c0cd5eed58036362de1ea5caa2de085fa7..d14585a19b7dea33be648dca8346d1d5c000b2f1 100644 (file)
@@ -148,7 +148,8 @@ static int amanda_help(struct sk_buff *skb,
                        goto out;
                }
                tuple = &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple;
-               nf_ct_expect_init(exp, family, &tuple->src.u3, &tuple->dst.u3,
+               nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT, family,
+                                 &tuple->src.u3, &tuple->dst.u3,
                                  IPPROTO_TCP, NULL, &port);
 
                nf_nat_amanda = rcu_dereference(nf_nat_amanda_hook);
@@ -164,26 +165,29 @@ out:
        return ret;
 }
 
+static const struct nf_conntrack_expect_policy amanda_exp_policy = {
+       .max_expected           = 3,
+       .timeout                = 180,
+};
+
 static struct nf_conntrack_helper amanda_helper[2] __read_mostly = {
        {
                .name                   = "amanda",
-               .max_expected           = 3,
-               .timeout                = 180,
                .me                     = THIS_MODULE,
                .help                   = amanda_help,
                .tuple.src.l3num        = AF_INET,
                .tuple.src.u.udp.port   = __constant_htons(10080),
                .tuple.dst.protonum     = IPPROTO_UDP,
+               .expect_policy          = &amanda_exp_policy,
        },
        {
                .name                   = "amanda",
-               .max_expected           = 3,
-               .timeout                = 180,
                .me                     = THIS_MODULE,
                .help                   = amanda_help,
                .tuple.src.l3num        = AF_INET6,
                .tuple.src.u.udp.port   = __constant_htons(10080),
                .tuple.dst.protonum     = IPPROTO_UDP,
+               .expect_policy          = &amanda_exp_policy,
        },
 };
 
index 684ec9c1ad38b7545502fd08213360bd2c7a9b0c..e31beeb33b2b10ca8e0bc6c43aedcbe4a1c8c990 100644 (file)
@@ -54,7 +54,7 @@ void nf_ct_unlink_expect(struct nf_conntrack_expect *exp)
        nf_ct_expect_count--;
 
        hlist_del(&exp->lnode);
-       master_help->expecting--;
+       master_help->expecting[exp->class]--;
        nf_ct_expect_put(exp);
 
        NF_CT_STAT_INC(expect_delete);
@@ -126,9 +126,21 @@ EXPORT_SYMBOL_GPL(nf_ct_expect_find_get);
 struct nf_conntrack_expect *
 nf_ct_find_expectation(const struct nf_conntrack_tuple *tuple)
 {
-       struct nf_conntrack_expect *exp;
+       struct nf_conntrack_expect *i, *exp = NULL;
+       struct hlist_node *n;
+       unsigned int h;
+
+       if (!nf_ct_expect_count)
+               return NULL;
 
-       exp = __nf_ct_expect_find(tuple);
+       h = nf_ct_expect_dst_hash(tuple);
+       hlist_for_each_entry(i, n, &nf_ct_expect_hash[h], hnode) {
+               if (!(i->flags & NF_CT_EXPECT_INACTIVE) &&
+                   nf_ct_tuple_mask_cmp(tuple, &i->tuple, &i->mask)) {
+                       exp = i;
+                       break;
+               }
+       }
        if (!exp)
                return NULL;
 
@@ -159,7 +171,7 @@ void nf_ct_remove_expectations(struct nf_conn *ct)
        struct hlist_node *n, *next;
 
        /* Optimization: most connection never expect any others. */
-       if (!help || help->expecting == 0)
+       if (!help)
                return;
 
        hlist_for_each_entry_safe(exp, n, next, &help->expectations, lnode) {
@@ -193,7 +205,7 @@ static inline int expect_clash(const struct nf_conntrack_expect *a,
 static inline int expect_matches(const struct nf_conntrack_expect *a,
                                 const struct nf_conntrack_expect *b)
 {
-       return a->master == b->master
+       return a->master == b->master && a->class == b->class
                && nf_ct_tuple_equal(&a->tuple, &b->tuple)
                && nf_ct_tuple_mask_equal(&a->mask, &b->mask);
 }
@@ -228,10 +240,11 @@ struct nf_conntrack_expect *nf_ct_expect_alloc(struct nf_conn *me)
 }
 EXPORT_SYMBOL_GPL(nf_ct_expect_alloc);
 
-void nf_ct_expect_init(struct nf_conntrack_expect *exp, int family,
-                      union nf_inet_addr *saddr,
-                      union nf_inet_addr *daddr,
-                      u_int8_t proto, __be16 *src, __be16 *dst)
+void nf_ct_expect_init(struct nf_conntrack_expect *exp, unsigned int class,
+                      int family,
+                      const union nf_inet_addr *saddr,
+                      const union nf_inet_addr *daddr,
+                      u_int8_t proto, const __be16 *src, const __be16 *dst)
 {
        int len;
 
@@ -241,6 +254,7 @@ void nf_ct_expect_init(struct nf_conntrack_expect *exp, int family,
                len = 16;
 
        exp->flags = 0;
+       exp->class = class;
        exp->expectfn = NULL;
        exp->helper = NULL;
        exp->tuple.src.l3num = family;
@@ -297,19 +311,21 @@ EXPORT_SYMBOL_GPL(nf_ct_expect_put);
 static void nf_ct_expect_insert(struct nf_conntrack_expect *exp)
 {
        struct nf_conn_help *master_help = nfct_help(exp->master);
+       const struct nf_conntrack_expect_policy *p;
        unsigned int h = nf_ct_expect_dst_hash(&exp->tuple);
 
        atomic_inc(&exp->use);
 
        hlist_add_head(&exp->lnode, &master_help->expectations);
-       master_help->expecting++;
+       master_help->expecting[exp->class]++;
 
        hlist_add_head_rcu(&exp->hnode, &nf_ct_expect_hash[h]);
        nf_ct_expect_count++;
 
        setup_timer(&exp->timeout, nf_ct_expectation_timed_out,
                    (unsigned long)exp);
-       exp->timeout.expires = jiffies + master_help->helper->timeout * HZ;
+       p = &master_help->helper->expect_policy[exp->class];
+       exp->timeout.expires = jiffies + p->timeout * HZ;
        add_timer(&exp->timeout);
 
        atomic_inc(&exp->use);
@@ -317,35 +333,41 @@ static void nf_ct_expect_insert(struct nf_conntrack_expect *exp)
 }
 
 /* Race with expectations being used means we could have none to find; OK. */
-static void evict_oldest_expect(struct nf_conn *master)
+static void evict_oldest_expect(struct nf_conn *master,
+                               struct nf_conntrack_expect *new)
 {
        struct nf_conn_help *master_help = nfct_help(master);
-       struct nf_conntrack_expect *exp = NULL;
+       struct nf_conntrack_expect *exp, *last = NULL;
        struct hlist_node *n;
 
-       hlist_for_each_entry(exp, n, &master_help->expectations, lnode)
-               ; /* nothing */
+       hlist_for_each_entry(exp, n, &master_help->expectations, lnode) {
+               if (exp->class == new->class)
+                       last = exp;
+       }
 
-       if (exp && del_timer(&exp->timeout)) {
-               nf_ct_unlink_expect(exp);
-               nf_ct_expect_put(exp);
+       if (last && del_timer(&last->timeout)) {
+               nf_ct_unlink_expect(last);
+               nf_ct_expect_put(last);
        }
 }
 
 static inline int refresh_timer(struct nf_conntrack_expect *i)
 {
        struct nf_conn_help *master_help = nfct_help(i->master);
+       const struct nf_conntrack_expect_policy *p;
 
        if (!del_timer(&i->timeout))
                return 0;
 
-       i->timeout.expires = jiffies + master_help->helper->timeout*HZ;
+       p = &master_help->helper->expect_policy[i->class];
+       i->timeout.expires = jiffies + p->timeout * HZ;
        add_timer(&i->timeout);
        return 1;
 }
 
 int nf_ct_expect_related(struct nf_conntrack_expect *expect)
 {
+       const struct nf_conntrack_expect_policy *p;
        struct nf_conntrack_expect *i;
        struct nf_conn *master = expect->master;
        struct nf_conn_help *master_help = nfct_help(master);
@@ -374,9 +396,15 @@ int nf_ct_expect_related(struct nf_conntrack_expect *expect)
                }
        }
        /* Will be over limit? */
-       if (master_help->helper->max_expected &&
-           master_help->expecting >= master_help->helper->max_expected)
-               evict_oldest_expect(master);
+       p = &master_help->helper->expect_policy[expect->class];
+       if (p->max_expected &&
+           master_help->expecting[expect->class] >= p->max_expected) {
+               evict_oldest_expect(master, expect);
+               if (master_help->expecting[expect->class] >= p->max_expected) {
+                       ret = -EMFILE;
+                       goto out;
+               }
+       }
 
        if (nf_ct_expect_count >= nf_ct_expect_max) {
                if (net_ratelimit())
@@ -460,6 +488,7 @@ static int exp_seq_show(struct seq_file *s, void *v)
 {
        struct nf_conntrack_expect *expect;
        struct hlist_node *n = v;
+       char *delim = "";
 
        expect = hlist_entry(n, struct nf_conntrack_expect, hnode);
 
@@ -475,6 +504,14 @@ static int exp_seq_show(struct seq_file *s, void *v)
                    __nf_ct_l3proto_find(expect->tuple.src.l3num),
                    __nf_ct_l4proto_find(expect->tuple.src.l3num,
                                       expect->tuple.dst.protonum));
+
+       if (expect->flags & NF_CT_EXPECT_PERMANENT) {
+               seq_printf(s, "PERMANENT");
+               delim = ",";
+       }
+       if (expect->flags & NF_CT_EXPECT_INACTIVE)
+               seq_printf(s, "%sINACTIVE", delim);
+
        return seq_putc(s, '\n');
 }
 
index 6770baf2e845f1fafc0904f5251a3a6ed53e7a5a..7eff876bb8bc90405d1057556cd728c5f4178788 100644 (file)
@@ -483,7 +483,7 @@ static int help(struct sk_buff *skb,
                daddr = &cmd.u3;
        }
 
-       nf_ct_expect_init(exp, cmd.l3num,
+       nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT, cmd.l3num,
                          &ct->tuplehash[!dir].tuple.src.u3, daddr,
                          IPPROTO_TCP, NULL, &cmd.u.tcp.port);
 
@@ -517,6 +517,11 @@ out_update_nl:
 static struct nf_conntrack_helper ftp[MAX_PORTS][2] __read_mostly;
 static char ftp_names[MAX_PORTS][2][sizeof("ftp-65535")] __read_mostly;
 
+static const struct nf_conntrack_expect_policy ftp_exp_policy = {
+       .max_expected   = 1,
+       .timeout        = 5 * 60,
+};
+
 /* don't make this __exit, since it's called from __init ! */
 static void nf_conntrack_ftp_fini(void)
 {
@@ -556,8 +561,7 @@ static int __init nf_conntrack_ftp_init(void)
                for (j = 0; j < 2; j++) {
                        ftp[i][j].tuple.src.u.tcp.port = htons(ports[i]);
                        ftp[i][j].tuple.dst.protonum = IPPROTO_TCP;
-                       ftp[i][j].max_expected = 1;
-                       ftp[i][j].timeout = 5 * 60;     /* 5 Minutes */
+                       ftp[i][j].expect_policy = &ftp_exp_policy;
                        ftp[i][j].me = THIS_MODULE;
                        ftp[i][j].help = help;
                        tmpname = &ftp_names[i][j][0];
index 898f1922b5b8ee3f5f4d59ddeced671e0de15872..505052d495cfee3a1f2ab3b6c21be0c43fd3f0ad 100644 (file)
@@ -277,7 +277,8 @@ static int expect_rtp_rtcp(struct sk_buff *skb, struct nf_conn *ct,
        /* Create expect for RTP */
        if ((rtp_exp = nf_ct_expect_alloc(ct)) == NULL)
                return -1;
-       nf_ct_expect_init(rtp_exp, ct->tuplehash[!dir].tuple.src.l3num,
+       nf_ct_expect_init(rtp_exp, NF_CT_EXPECT_CLASS_DEFAULT,
+                         ct->tuplehash[!dir].tuple.src.l3num,
                          &ct->tuplehash[!dir].tuple.src.u3,
                          &ct->tuplehash[!dir].tuple.dst.u3,
                          IPPROTO_UDP, NULL, &rtp_port);
@@ -287,7 +288,8 @@ static int expect_rtp_rtcp(struct sk_buff *skb, struct nf_conn *ct,
                nf_ct_expect_put(rtp_exp);
                return -1;
        }
-       nf_ct_expect_init(rtcp_exp, ct->tuplehash[!dir].tuple.src.l3num,
+       nf_ct_expect_init(rtcp_exp, NF_CT_EXPECT_CLASS_DEFAULT,
+                         ct->tuplehash[!dir].tuple.src.l3num,
                          &ct->tuplehash[!dir].tuple.src.u3,
                          &ct->tuplehash[!dir].tuple.dst.u3,
                          IPPROTO_UDP, NULL, &rtcp_port);
@@ -344,7 +346,8 @@ static int expect_t120(struct sk_buff *skb,
        /* Create expect for T.120 connections */
        if ((exp = nf_ct_expect_alloc(ct)) == NULL)
                return -1;
-       nf_ct_expect_init(exp, ct->tuplehash[!dir].tuple.src.l3num,
+       nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT,
+                         ct->tuplehash[!dir].tuple.src.l3num,
                          &ct->tuplehash[!dir].tuple.src.u3,
                          &ct->tuplehash[!dir].tuple.dst.u3,
                          IPPROTO_TCP, NULL, &port);
@@ -612,13 +615,17 @@ static int h245_help(struct sk_buff *skb, unsigned int protoff,
 }
 
 /****************************************************************************/
+static const struct nf_conntrack_expect_policy h245_exp_policy = {
+       .max_expected   = H323_RTP_CHANNEL_MAX * 4 + 2 /* T.120 */,
+       .timeout        = 240,
+};
+
 static struct nf_conntrack_helper nf_conntrack_helper_h245 __read_mostly = {
        .name                   = "H.245",
        .me                     = THIS_MODULE,
-       .max_expected           = H323_RTP_CHANNEL_MAX * 4 + 2 /* T.120 */,
-       .timeout                = 240,
        .tuple.dst.protonum     = IPPROTO_UDP,
-       .help                   = h245_help
+       .help                   = h245_help,
+       .expect_policy          = &h245_exp_policy,
 };
 
 /****************************************************************************/
@@ -676,7 +683,8 @@ static int expect_h245(struct sk_buff *skb, struct nf_conn *ct,
        /* Create expect for h245 connection */
        if ((exp = nf_ct_expect_alloc(ct)) == NULL)
                return -1;
-       nf_ct_expect_init(exp, ct->tuplehash[!dir].tuple.src.l3num,
+       nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT,
+                         ct->tuplehash[!dir].tuple.src.l3num,
                          &ct->tuplehash[!dir].tuple.src.u3,
                          &ct->tuplehash[!dir].tuple.dst.u3,
                          IPPROTO_TCP, NULL, &port);
@@ -792,7 +800,8 @@ static int expect_callforwarding(struct sk_buff *skb,
        /* Create expect for the second call leg */
        if ((exp = nf_ct_expect_alloc(ct)) == NULL)
                return -1;
-       nf_ct_expect_init(exp, ct->tuplehash[!dir].tuple.src.l3num,
+       nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT,
+                         ct->tuplehash[!dir].tuple.src.l3num,
                          &ct->tuplehash[!dir].tuple.src.u3, &addr,
                          IPPROTO_TCP, NULL, &port);
        exp->helper = nf_conntrack_helper_q931;
@@ -1156,28 +1165,30 @@ static int q931_help(struct sk_buff *skb, unsigned int protoff,
 }
 
 /****************************************************************************/
+static const struct nf_conntrack_expect_policy q931_exp_policy = {
+       /* T.120 and H.245 */
+       .max_expected           = H323_RTP_CHANNEL_MAX * 4 + 4,
+       .timeout                = 240,
+};
+
 static struct nf_conntrack_helper nf_conntrack_helper_q931[] __read_mostly = {
        {
                .name                   = "Q.931",
                .me                     = THIS_MODULE,
-                                         /* T.120 and H.245 */
-               .max_expected           = H323_RTP_CHANNEL_MAX * 4 + 4,
-               .timeout                = 240,
                .tuple.src.l3num        = AF_INET,
                .tuple.src.u.tcp.port   = __constant_htons(Q931_PORT),
                .tuple.dst.protonum     = IPPROTO_TCP,
-               .help                   = q931_help
+               .help                   = q931_help,
+               .expect_policy          = &q931_exp_policy,
        },
        {
                .name                   = "Q.931",
                .me                     = THIS_MODULE,
-                                         /* T.120 and H.245 */
-               .max_expected           = H323_RTP_CHANNEL_MAX * 4 + 4,
-               .timeout                = 240,
                .tuple.src.l3num        = AF_INET6,
                .tuple.src.u.tcp.port   = __constant_htons(Q931_PORT),
                .tuple.dst.protonum     = IPPROTO_TCP,
-               .help                   = q931_help
+               .help                   = q931_help,
+               .expect_policy          = &q931_exp_policy,
        },
 };
 
@@ -1261,7 +1272,8 @@ static int expect_q931(struct sk_buff *skb, struct nf_conn *ct,
        /* Create expect for Q.931 */
        if ((exp = nf_ct_expect_alloc(ct)) == NULL)
                return -1;
-       nf_ct_expect_init(exp, ct->tuplehash[!dir].tuple.src.l3num,
+       nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT,
+                         ct->tuplehash[!dir].tuple.src.l3num,
                          gkrouted_only ? /* only accept calls from GK? */
                                &ct->tuplehash[!dir].tuple.src.u3 : NULL,
                          &ct->tuplehash[!dir].tuple.dst.u3,
@@ -1332,7 +1344,8 @@ static int process_gcf(struct sk_buff *skb, struct nf_conn *ct,
        /* Need new expect */
        if ((exp = nf_ct_expect_alloc(ct)) == NULL)
                return -1;
-       nf_ct_expect_init(exp, ct->tuplehash[!dir].tuple.src.l3num,
+       nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT,
+                         ct->tuplehash[!dir].tuple.src.l3num,
                          &ct->tuplehash[!dir].tuple.src.u3, &addr,
                          IPPROTO_UDP, NULL, &port);
        exp->helper = nf_conntrack_helper_ras;
@@ -1536,7 +1549,8 @@ static int process_acf(struct sk_buff *skb, struct nf_conn *ct,
        /* Need new expect */
        if ((exp = nf_ct_expect_alloc(ct)) == NULL)
                return -1;
-       nf_ct_expect_init(exp, ct->tuplehash[!dir].tuple.src.l3num,
+       nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT,
+                         ct->tuplehash[!dir].tuple.src.l3num,
                          &ct->tuplehash[!dir].tuple.src.u3, &addr,
                          IPPROTO_TCP, NULL, &port);
        exp->flags = NF_CT_EXPECT_PERMANENT;
@@ -1589,7 +1603,8 @@ static int process_lcf(struct sk_buff *skb, struct nf_conn *ct,
        /* Need new expect for call signal */
        if ((exp = nf_ct_expect_alloc(ct)) == NULL)
                return -1;
-       nf_ct_expect_init(exp, ct->tuplehash[!dir].tuple.src.l3num,
+       nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT,
+                         ct->tuplehash[!dir].tuple.src.l3num,
                          &ct->tuplehash[!dir].tuple.src.u3, &addr,
                          IPPROTO_TCP, NULL, &port);
        exp->flags = NF_CT_EXPECT_PERMANENT;
@@ -1728,26 +1743,29 @@ static int ras_help(struct sk_buff *skb, unsigned int protoff,
 }
 
 /****************************************************************************/
+static const struct nf_conntrack_expect_policy ras_exp_policy = {
+       .max_expected           = 32,
+       .timeout                = 240,
+};
+
 static struct nf_conntrack_helper nf_conntrack_helper_ras[] __read_mostly = {
        {
                .name                   = "RAS",
                .me                     = THIS_MODULE,
-               .max_expected           = 32,
-               .timeout                = 240,
                .tuple.src.l3num        = AF_INET,
                .tuple.src.u.udp.port   = __constant_htons(RAS_PORT),
                .tuple.dst.protonum     = IPPROTO_UDP,
                .help                   = ras_help,
+               .expect_policy          = &ras_exp_policy,
        },
        {
                .name                   = "RAS",
                .me                     = THIS_MODULE,
-               .max_expected           = 32,
-               .timeout                = 240,
                .tuple.src.l3num        = AF_INET6,
                .tuple.src.u.udp.port   = __constant_htons(RAS_PORT),
                .tuple.dst.protonum     = IPPROTO_UDP,
                .help                   = ras_help,
+               .expect_policy          = &ras_exp_policy,
        },
 };
 
index b1fd21cc1dbc2e613ea15e6813bb550bcc6ce7cb..e350f56d43c976a699b72cc1e36f3b49abfa9788 100644 (file)
@@ -110,7 +110,8 @@ int nf_conntrack_helper_register(struct nf_conntrack_helper *me)
 {
        unsigned int h = helper_hash(&me->tuple);
 
-       BUG_ON(me->timeout == 0);
+       BUG_ON(me->expect_policy == NULL);
+       BUG_ON(me->expect_class_max >= NF_CT_MAX_EXPECT_CLASSES);
 
        mutex_lock(&nf_ct_helper_mutex);
        hlist_add_head_rcu(&me->hnode, &nf_ct_helper_hash[h]);
index c336b07a0d4c49e51cee1d9f6d3934fe79531c0a..02f21cbe5ae73d20b9402e6efe4c80c1a7bfc4c6 100644 (file)
@@ -187,7 +187,8 @@ static int help(struct sk_buff *skb, unsigned int protoff,
                        }
                        tuple = &ct->tuplehash[!dir].tuple;
                        port = htons(dcc_port);
-                       nf_ct_expect_init(exp, tuple->src.l3num,
+                       nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT,
+                                         tuple->src.l3num,
                                          NULL, &tuple->dst.u3,
                                          IPPROTO_TCP, NULL, &port);
 
@@ -210,6 +211,7 @@ static int help(struct sk_buff *skb, unsigned int protoff,
 
 static struct nf_conntrack_helper irc[MAX_PORTS] __read_mostly;
 static char irc_names[MAX_PORTS][sizeof("irc-65535")] __read_mostly;
+static struct nf_conntrack_expect_policy irc_exp_policy;
 
 static void nf_conntrack_irc_fini(void);
 
@@ -223,6 +225,9 @@ static int __init nf_conntrack_irc_init(void)
                return -EINVAL;
        }
 
+       irc_exp_policy.max_expected = max_dcc_channels;
+       irc_exp_policy.timeout = dcc_timeout;
+
        irc_buffer = kmalloc(65536, GFP_KERNEL);
        if (!irc_buffer)
                return -ENOMEM;
@@ -235,8 +240,7 @@ static int __init nf_conntrack_irc_init(void)
                irc[i].tuple.src.l3num = AF_INET;
                irc[i].tuple.src.u.tcp.port = htons(ports[i]);
                irc[i].tuple.dst.protonum = IPPROTO_TCP;
-               irc[i].max_expected = max_dcc_channels;
-               irc[i].timeout = dcc_timeout;
+               irc[i].expect_policy = &irc_exp_policy;
                irc[i].me = THIS_MODULE;
                irc[i].help = help;
 
index 60dedaded84e8ef184a9f53b3e6d9f4c7bdd687f..08404e6755fb15064ab086d3229a34cc9139ce3d 100644 (file)
@@ -86,6 +86,7 @@ static int help(struct sk_buff *skb, unsigned int protoff,
 
        exp->expectfn             = NULL;
        exp->flags                = NF_CT_EXPECT_PERMANENT;
+       exp->class                = NF_CT_EXPECT_CLASS_DEFAULT;
        exp->helper               = NULL;
 
        nf_ct_expect_related(exp);
@@ -96,19 +97,23 @@ out:
        return NF_ACCEPT;
 }
 
+static struct nf_conntrack_expect_policy exp_policy = {
+       .max_expected   = 1,
+};
+
 static struct nf_conntrack_helper helper __read_mostly = {
        .name                   = "netbios-ns",
        .tuple.src.l3num        = AF_INET,
        .tuple.src.u.udp.port   = __constant_htons(NMBD_PORT),
        .tuple.dst.protonum     = IPPROTO_UDP,
-       .max_expected           = 1,
        .me                     = THIS_MODULE,
        .help                   = help,
+       .expect_policy          = &exp_policy,
 };
 
 static int __init nf_conntrack_netbios_ns_init(void)
 {
-       helper.timeout = timeout;
+       exp_policy.timeout = timeout;
        return nf_conntrack_helper_register(&helper);
 }
 
index b5cb8e831230dbb643323e7a1cda152de22f595b..8fd83470d1b31aae6d8e552a664f95913d0aaa01 100644 (file)
@@ -208,7 +208,8 @@ static int exp_gre(struct nf_conn *ct, __be16 callid, __be16 peer_callid)
 
        /* original direction, PNS->PAC */
        dir = IP_CT_DIR_ORIGINAL;
-       nf_ct_expect_init(exp_orig, ct->tuplehash[dir].tuple.src.l3num,
+       nf_ct_expect_init(exp_orig, NF_CT_EXPECT_CLASS_DEFAULT,
+                         ct->tuplehash[dir].tuple.src.l3num,
                          &ct->tuplehash[dir].tuple.src.u3,
                          &ct->tuplehash[dir].tuple.dst.u3,
                          IPPROTO_GRE, &peer_callid, &callid);
@@ -216,7 +217,8 @@ static int exp_gre(struct nf_conn *ct, __be16 callid, __be16 peer_callid)
 
        /* reply direction, PAC->PNS */
        dir = IP_CT_DIR_REPLY;
-       nf_ct_expect_init(exp_reply, ct->tuplehash[dir].tuple.src.l3num,
+       nf_ct_expect_init(exp_reply, NF_CT_EXPECT_CLASS_DEFAULT,
+                         ct->tuplehash[dir].tuple.src.l3num,
                          &ct->tuplehash[dir].tuple.src.u3,
                          &ct->tuplehash[dir].tuple.dst.u3,
                          IPPROTO_GRE, &callid, &peer_callid);
@@ -575,17 +577,21 @@ conntrack_pptp_help(struct sk_buff *skb, unsigned int protoff,
        return ret;
 }
 
+static const struct nf_conntrack_expect_policy pptp_exp_policy = {
+       .max_expected   = 2,
+       .timeout        = 5 * 60,
+};
+
 /* control protocol helper */
 static struct nf_conntrack_helper pptp __read_mostly = {
        .name                   = "pptp",
        .me                     = THIS_MODULE,
-       .max_expected           = 2,
-       .timeout                = 5 * 60,
        .tuple.src.l3num        = AF_INET,
        .tuple.src.u.tcp.port   = __constant_htons(PPTP_CONTROL_PORT),
        .tuple.dst.protonum     = IPPROTO_TCP,
        .help                   = conntrack_pptp_help,
        .destroy                = pptp_destroy_siblings,
+       .expect_policy          = &pptp_exp_policy,
 };
 
 static int __init nf_conntrack_pptp_init(void)
index a70051d741a7014827c8c98aa7e2c0e05358ceb6..7542e25eede3e79cd08c11545a015b068cdd10b5 100644 (file)
@@ -143,7 +143,8 @@ static int help(struct sk_buff *skb,
        }
 
        tuple = &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple;
-       nf_ct_expect_init(exp, family, &tuple->src.u3, &tuple->dst.u3,
+       nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT, family,
+                         &tuple->src.u3, &tuple->dst.u3,
                          IPPROTO_TCP, NULL, &reply->port);
 
        pr_debug("nf_ct_sane: expect: ");
@@ -163,6 +164,11 @@ out:
 static struct nf_conntrack_helper sane[MAX_PORTS][2] __read_mostly;
 static char sane_names[MAX_PORTS][2][sizeof("sane-65535")] __read_mostly;
 
+static const struct nf_conntrack_expect_policy sane_exp_policy = {
+       .max_expected   = 1,
+       .timeout        = 5 * 60,
+};
+
 /* don't make this __exit, since it's called from __init ! */
 static void nf_conntrack_sane_fini(void)
 {
@@ -200,8 +206,7 @@ static int __init nf_conntrack_sane_init(void)
                for (j = 0; j < 2; j++) {
                        sane[i][j].tuple.src.u.tcp.port = htons(ports[i]);
                        sane[i][j].tuple.dst.protonum = IPPROTO_TCP;
-                       sane[i][j].max_expected = 1;
-                       sane[i][j].timeout = 5 * 60;    /* 5 Minutes */
+                       sane[i][j].expect_policy = &sane_exp_policy;
                        sane[i][j].me = THIS_MODULE;
                        sane[i][j].help = help;
                        tmpname = &sane_names[i][j][0];
index c521c891d35167d25369aa992d12ead46847db17..da5dec6e615857b6c6dc9440ea9a3f8bc0bc0a5b 100644 (file)
@@ -2,6 +2,8 @@
  *
  * (C) 2005 by Christian Hentschel <chentschel@arnet.com.ar>
  * based on RR's ip_conntrack_ftp.c and other modules.
+ * (C) 2007 United Security Providers
+ * (C) 2007, 2008 Patrick McHardy <kaber@trash.net>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -17,6 +19,7 @@
 #include <linux/netfilter.h>
 
 #include <net/netfilter/nf_conntrack.h>
+#include <net/netfilter/nf_conntrack_core.h>
 #include <net/netfilter/nf_conntrack_expect.h>
 #include <net/netfilter/nf_conntrack_helper.h>
 #include <linux/netfilter/nf_conntrack_sip.h>
@@ -36,214 +39,102 @@ static unsigned int sip_timeout __read_mostly = SIP_TIMEOUT;
 module_param(sip_timeout, uint, 0600);
 MODULE_PARM_DESC(sip_timeout, "timeout for the master SIP session");
 
+static int sip_direct_signalling __read_mostly = 1;
+module_param(sip_direct_signalling, int, 0600);
+MODULE_PARM_DESC(sip_direct_signalling, "expect incoming calls from registrar "
+                                       "only (default 1)");
+
+static int sip_direct_media __read_mostly = 1;
+module_param(sip_direct_media, int, 0600);
+MODULE_PARM_DESC(sip_direct_media, "Expect Media streams between signalling "
+                                  "endpoints only (default 1)");
+
 unsigned int (*nf_nat_sip_hook)(struct sk_buff *skb,
-                               enum ip_conntrack_info ctinfo,
-                               struct nf_conn *ct,
-                               const char **dptr) __read_mostly;
+                               const char **dptr,
+                               unsigned int *datalen) __read_mostly;
 EXPORT_SYMBOL_GPL(nf_nat_sip_hook);
 
-unsigned int (*nf_nat_sdp_hook)(struct sk_buff *skb,
-                               enum ip_conntrack_info ctinfo,
-                               struct nf_conntrack_expect *exp,
-                               const char *dptr) __read_mostly;
-EXPORT_SYMBOL_GPL(nf_nat_sdp_hook);
-
-static int digits_len(const struct nf_conn *, const char *, const char *, int *);
-static int epaddr_len(const struct nf_conn *, const char *, const char *, int *);
-static int skp_digits_len(const struct nf_conn *, const char *, const char *, int *);
-static int skp_epaddr_len(const struct nf_conn *, const char *, const char *, int *);
-
-struct sip_header_nfo {
-       const char      *lname;
-       const char      *sname;
-       const char      *ln_str;
-       size_t          lnlen;
-       size_t          snlen;
-       size_t          ln_strlen;
-       int             case_sensitive;
-       int             (*match_len)(const struct nf_conn *, const char *,
-                                    const char *, int *);
-};
+unsigned int (*nf_nat_sip_expect_hook)(struct sk_buff *skb,
+                                      const char **dptr,
+                                      unsigned int *datalen,
+                                      struct nf_conntrack_expect *exp,
+                                      unsigned int matchoff,
+                                      unsigned int matchlen) __read_mostly;
+EXPORT_SYMBOL_GPL(nf_nat_sip_expect_hook);
 
-static const struct sip_header_nfo ct_sip_hdrs[] = {
-       [POS_REG_REQ_URI] = {   /* SIP REGISTER request URI */
-               .lname          = "sip:",
-               .lnlen          = sizeof("sip:") - 1,
-               .ln_str         = ":",
-               .ln_strlen      = sizeof(":") - 1,
-               .match_len      = epaddr_len,
-       },
-       [POS_REQ_URI] = {       /* SIP request URI */
-               .lname          = "sip:",
-               .lnlen          = sizeof("sip:") - 1,
-               .ln_str         = "@",
-               .ln_strlen      = sizeof("@") - 1,
-               .match_len      = epaddr_len,
-       },
-       [POS_FROM] = {          /* SIP From header */
-               .lname          = "From:",
-               .lnlen          = sizeof("From:") - 1,
-               .sname          = "\r\nf:",
-               .snlen          = sizeof("\r\nf:") - 1,
-               .ln_str         = "sip:",
-               .ln_strlen      = sizeof("sip:") - 1,
-               .match_len      = skp_epaddr_len,
-       },
-       [POS_TO] = {            /* SIP To header */
-               .lname          = "To:",
-               .lnlen          = sizeof("To:") - 1,
-               .sname          = "\r\nt:",
-               .snlen          = sizeof("\r\nt:") - 1,
-               .ln_str         = "sip:",
-               .ln_strlen      = sizeof("sip:") - 1,
-               .match_len      = skp_epaddr_len
-       },
-       [POS_VIA] = {           /* SIP Via header */
-               .lname          = "Via:",
-               .lnlen          = sizeof("Via:") - 1,
-               .sname          = "\r\nv:",
-               .snlen          = sizeof("\r\nv:") - 1, /* rfc3261 "\r\n" */
-               .ln_str         = "UDP ",
-               .ln_strlen      = sizeof("UDP ") - 1,
-               .match_len      = epaddr_len,
-       },
-       [POS_CONTACT] = {       /* SIP Contact header */
-               .lname          = "Contact:",
-               .lnlen          = sizeof("Contact:") - 1,
-               .sname          = "\r\nm:",
-               .snlen          = sizeof("\r\nm:") - 1,
-               .ln_str         = "sip:",
-               .ln_strlen      = sizeof("sip:") - 1,
-               .match_len      = skp_epaddr_len
-       },
-       [POS_CONTENT] = {       /* SIP Content length header */
-               .lname          = "Content-Length:",
-               .lnlen          = sizeof("Content-Length:") - 1,
-               .sname          = "\r\nl:",
-               .snlen          = sizeof("\r\nl:") - 1,
-               .ln_str         = ":",
-               .ln_strlen      = sizeof(":") - 1,
-               .match_len      = skp_digits_len
-       },
-       [POS_MEDIA] = {         /* SDP media info */
-               .case_sensitive = 1,
-               .lname          = "\nm=",
-               .lnlen          = sizeof("\nm=") - 1,
-               .sname          = "\rm=",
-               .snlen          = sizeof("\rm=") - 1,
-               .ln_str         = "audio ",
-               .ln_strlen      = sizeof("audio ") - 1,
-               .match_len      = digits_len
-       },
-       [POS_OWNER_IP4] = {     /* SDP owner address*/
-               .case_sensitive = 1,
-               .lname          = "\no=",
-               .lnlen          = sizeof("\no=") - 1,
-               .sname          = "\ro=",
-               .snlen          = sizeof("\ro=") - 1,
-               .ln_str         = "IN IP4 ",
-               .ln_strlen      = sizeof("IN IP4 ") - 1,
-               .match_len      = epaddr_len
-       },
-       [POS_CONNECTION_IP4] = {/* SDP connection info */
-               .case_sensitive = 1,
-               .lname          = "\nc=",
-               .lnlen          = sizeof("\nc=") - 1,
-               .sname          = "\rc=",
-               .snlen          = sizeof("\rc=") - 1,
-               .ln_str         = "IN IP4 ",
-               .ln_strlen      = sizeof("IN IP4 ") - 1,
-               .match_len      = epaddr_len
-       },
-       [POS_OWNER_IP6] = {     /* SDP owner address*/
-               .case_sensitive = 1,
-               .lname          = "\no=",
-               .lnlen          = sizeof("\no=") - 1,
-               .sname          = "\ro=",
-               .snlen          = sizeof("\ro=") - 1,
-               .ln_str         = "IN IP6 ",
-               .ln_strlen      = sizeof("IN IP6 ") - 1,
-               .match_len      = epaddr_len
-       },
-       [POS_CONNECTION_IP6] = {/* SDP connection info */
-               .case_sensitive = 1,
-               .lname          = "\nc=",
-               .lnlen          = sizeof("\nc=") - 1,
-               .sname          = "\rc=",
-               .snlen          = sizeof("\rc=") - 1,
-               .ln_str         = "IN IP6 ",
-               .ln_strlen      = sizeof("IN IP6 ") - 1,
-               .match_len      = epaddr_len
-       },
-       [POS_SDP_HEADER] = {    /* SDP version header */
-               .case_sensitive = 1,
-               .lname          = "\nv=",
-               .lnlen          = sizeof("\nv=") - 1,
-               .sname          = "\rv=",
-               .snlen          = sizeof("\rv=") - 1,
-               .ln_str         = "=",
-               .ln_strlen      = sizeof("=") - 1,
-               .match_len      = digits_len
-       }
-};
+unsigned int (*nf_nat_sdp_addr_hook)(struct sk_buff *skb,
+                                    const char **dptr,
+                                    unsigned int dataoff,
+                                    unsigned int *datalen,
+                                    enum sdp_header_types type,
+                                    enum sdp_header_types term,
+                                    const union nf_inet_addr *addr)
+                                    __read_mostly;
+EXPORT_SYMBOL_GPL(nf_nat_sdp_addr_hook);
 
-/* get line length until first CR or LF seen. */
-int ct_sip_lnlen(const char *line, const char *limit)
-{
-       const char *k = line;
+unsigned int (*nf_nat_sdp_port_hook)(struct sk_buff *skb,
+                                    const char **dptr,
+                                    unsigned int *datalen,
+                                    unsigned int matchoff,
+                                    unsigned int matchlen,
+                                    u_int16_t port) __read_mostly;
+EXPORT_SYMBOL_GPL(nf_nat_sdp_port_hook);
 
-       while ((line <= limit) && (*line == '\r' || *line == '\n'))
-               line++;
+unsigned int (*nf_nat_sdp_session_hook)(struct sk_buff *skb,
+                                       const char **dptr,
+                                       unsigned int dataoff,
+                                       unsigned int *datalen,
+                                       const union nf_inet_addr *addr)
+                                       __read_mostly;
+EXPORT_SYMBOL_GPL(nf_nat_sdp_session_hook);
 
-       while (line <= limit) {
-               if (*line == '\r' || *line == '\n')
-                       break;
-               line++;
-       }
-       return line - k;
-}
-EXPORT_SYMBOL_GPL(ct_sip_lnlen);
+unsigned int (*nf_nat_sdp_media_hook)(struct sk_buff *skb,
+                                     const char **dptr,
+                                     unsigned int *datalen,
+                                     struct nf_conntrack_expect *rtp_exp,
+                                     struct nf_conntrack_expect *rtcp_exp,
+                                     unsigned int mediaoff,
+                                     unsigned int medialen,
+                                     union nf_inet_addr *rtp_addr)
+                                     __read_mostly;
+EXPORT_SYMBOL_GPL(nf_nat_sdp_media_hook);
 
-/* Linear string search, case sensitive. */
-const char *ct_sip_search(const char *needle, const char *haystack,
-                         size_t needle_len, size_t haystack_len,
-                         int case_sensitive)
+static int string_len(const struct nf_conn *ct, const char *dptr,
+                     const char *limit, int *shift)
 {
-       const char *limit = haystack + (haystack_len - needle_len);
+       int len = 0;
 
-       while (haystack <= limit) {
-               if (case_sensitive) {
-                       if (strncmp(haystack, needle, needle_len) == 0)
-                               return haystack;
-               } else {
-                       if (strnicmp(haystack, needle, needle_len) == 0)
-                               return haystack;
-               }
-               haystack++;
+       while (dptr < limit && isalpha(*dptr)) {
+               dptr++;
+               len++;
        }
-       return NULL;
+       return len;
 }
-EXPORT_SYMBOL_GPL(ct_sip_search);
 
 static int digits_len(const struct nf_conn *ct, const char *dptr,
                      const char *limit, int *shift)
 {
        int len = 0;
-       while (dptr <= limit && isdigit(*dptr)) {
+       while (dptr < limit && isdigit(*dptr)) {
                dptr++;
                len++;
        }
        return len;
 }
 
-/* get digits length, skipping blank spaces. */
-static int skp_digits_len(const struct nf_conn *ct, const char *dptr,
-                         const char *limit, int *shift)
+/* get media type + port length */
+static int media_len(const struct nf_conn *ct, const char *dptr,
+                    const char *limit, int *shift)
 {
-       for (; dptr <= limit && *dptr == ' '; dptr++)
-               (*shift)++;
+       int len = string_len(ct, dptr, limit, shift);
+
+       dptr += len;
+       if (dptr >= limit || *dptr != ' ')
+               return 0;
+       len++;
+       dptr++;
 
-       return digits_len(ct, dptr, limit, shift);
+       return len + digits_len(ct, dptr, limit, shift);
 }
 
 static int parse_addr(const struct nf_conn *ct, const char *cp,
@@ -302,13 +193,13 @@ static int skp_epaddr_len(const struct nf_conn *ct, const char *dptr,
        /* Search for @, but stop at the end of the line.
         * We are inside a sip: URI, so we don't need to worry about
         * continuation lines. */
-       while (dptr <= limit &&
+       while (dptr < limit &&
               *dptr != '@' && *dptr != '\r' && *dptr != '\n') {
                (*shift)++;
                dptr++;
        }
 
-       if (dptr <= limit && *dptr == '@') {
+       if (dptr < limit && *dptr == '@') {
                dptr++;
                (*shift)++;
        } else {
@@ -319,74 +210,894 @@ static int skp_epaddr_len(const struct nf_conn *ct, const char *dptr,
        return epaddr_len(ct, dptr, limit, shift);
 }
 
-/* Returns 0 if not found, -1 error parsing. */
-int ct_sip_get_info(const struct nf_conn *ct,
-                   const char *dptr, size_t dlen,
-                   unsigned int *matchoff,
-                   unsigned int *matchlen,
-                   enum sip_header_pos pos)
+/* Parse a SIP request line of the form:
+ *
+ * Request-Line = Method SP Request-URI SP SIP-Version CRLF
+ *
+ * and return the offset and length of the address contained in the Request-URI.
+ */
+int ct_sip_parse_request(const struct nf_conn *ct,
+                        const char *dptr, unsigned int datalen,
+                        unsigned int *matchoff, unsigned int *matchlen,
+                        union nf_inet_addr *addr, __be16 *port)
 {
-       const struct sip_header_nfo *hnfo = &ct_sip_hdrs[pos];
-       const char *limit, *aux, *k = dptr;
+       const char *start = dptr, *limit = dptr + datalen, *end;
+       unsigned int mlen;
+       unsigned int p;
        int shift = 0;
 
-       limit = dptr + (dlen - hnfo->lnlen);
+       /* Skip method and following whitespace */
+       mlen = string_len(ct, dptr, limit, NULL);
+       if (!mlen)
+               return 0;
+       dptr += mlen;
+       if (++dptr >= limit)
+               return 0;
+
+       /* Find SIP URI */
+       limit -= strlen("sip:");
+       for (; dptr < limit; dptr++) {
+               if (*dptr == '\r' || *dptr == '\n')
+                       return -1;
+               if (strnicmp(dptr, "sip:", strlen("sip:")) == 0)
+                       break;
+       }
+       if (!skp_epaddr_len(ct, dptr, limit, &shift))
+               return 0;
+       dptr += shift;
+
+       if (!parse_addr(ct, dptr, &end, addr, limit))
+               return -1;
+       if (end < limit && *end == ':') {
+               end++;
+               p = simple_strtoul(end, (char **)&end, 10);
+               if (p < 1024 || p > 65535)
+                       return -1;
+               *port = htons(p);
+       } else
+               *port = htons(SIP_PORT);
+
+       if (end == dptr)
+               return 0;
+       *matchoff = dptr - start;
+       *matchlen = end - dptr;
+       return 1;
+}
+EXPORT_SYMBOL_GPL(ct_sip_parse_request);
+
+/* SIP header parsing: SIP headers are located at the beginning of a line, but
+ * may span several lines, in which case the continuation lines begin with a
+ * whitespace character. RFC 2543 allows lines to be terminated with CR, LF or
+ * CRLF, RFC 3261 allows only CRLF, we support both.
+ *
+ * Headers are followed by (optionally) whitespace, a colon, again (optionally)
+ * whitespace and the values. Whitespace in this context means any amount of
+ * tabs, spaces and continuation lines, which are treated as a single whitespace
+ * character.
+ *
+ * Some headers may appear multiple times. A comma seperated list of values is
+ * equivalent to multiple headers.
+ */
+static const struct sip_header ct_sip_hdrs[] = {
+       [SIP_HDR_CSEQ]                  = SIP_HDR("CSeq", NULL, NULL, digits_len),
+       [SIP_HDR_FROM]                  = SIP_HDR("From", "f", "sip:", skp_epaddr_len),
+       [SIP_HDR_TO]                    = SIP_HDR("To", "t", "sip:", skp_epaddr_len),
+       [SIP_HDR_CONTACT]               = SIP_HDR("Contact", "m", "sip:", skp_epaddr_len),
+       [SIP_HDR_VIA]                   = SIP_HDR("Via", "v", "UDP ", epaddr_len),
+       [SIP_HDR_EXPIRES]               = SIP_HDR("Expires", NULL, NULL, digits_len),
+       [SIP_HDR_CONTENT_LENGTH]        = SIP_HDR("Content-Length", "l", NULL, digits_len),
+};
+
+static const char *sip_follow_continuation(const char *dptr, const char *limit)
+{
+       /* Walk past newline */
+       if (++dptr >= limit)
+               return NULL;
+
+       /* Skip '\n' in CR LF */
+       if (*(dptr - 1) == '\r' && *dptr == '\n') {
+               if (++dptr >= limit)
+                       return NULL;
+       }
+
+       /* Continuation line? */
+       if (*dptr != ' ' && *dptr != '\t')
+               return NULL;
+
+       /* skip leading whitespace */
+       for (; dptr < limit; dptr++) {
+               if (*dptr != ' ' && *dptr != '\t')
+                       break;
+       }
+       return dptr;
+}
+
+static const char *sip_skip_whitespace(const char *dptr, const char *limit)
+{
+       for (; dptr < limit; dptr++) {
+               if (*dptr == ' ')
+                       continue;
+               if (*dptr != '\r' && *dptr != '\n')
+                       break;
+               dptr = sip_follow_continuation(dptr, limit);
+               if (dptr == NULL)
+                       return NULL;
+       }
+       return dptr;
+}
+
+/* Search within a SIP header value, dealing with continuation lines */
+static const char *ct_sip_header_search(const char *dptr, const char *limit,
+                                       const char *needle, unsigned int len)
+{
+       for (limit -= len; dptr < limit; dptr++) {
+               if (*dptr == '\r' || *dptr == '\n') {
+                       dptr = sip_follow_continuation(dptr, limit);
+                       if (dptr == NULL)
+                               break;
+                       continue;
+               }
+
+               if (strnicmp(dptr, needle, len) == 0)
+                       return dptr;
+       }
+       return NULL;
+}
+
+int ct_sip_get_header(const struct nf_conn *ct, const char *dptr,
+                     unsigned int dataoff, unsigned int datalen,
+                     enum sip_header_types type,
+                     unsigned int *matchoff, unsigned int *matchlen)
+{
+       const struct sip_header *hdr = &ct_sip_hdrs[type];
+       const char *start = dptr, *limit = dptr + datalen;
+       int shift = 0;
 
-       while (dptr <= limit) {
-               if ((strncmp(dptr, hnfo->lname, hnfo->lnlen) != 0) &&
-                   (hnfo->sname == NULL ||
-                    strncmp(dptr, hnfo->sname, hnfo->snlen) != 0)) {
-                       dptr++;
+       for (dptr += dataoff; dptr < limit; dptr++) {
+               /* Find beginning of line */
+               if (*dptr != '\r' && *dptr != '\n')
                        continue;
+               if (++dptr >= limit)
+                       break;
+               if (*(dptr - 1) == '\r' && *dptr == '\n') {
+                       if (++dptr >= limit)
+                               break;
                }
-               aux = ct_sip_search(hnfo->ln_str, dptr, hnfo->ln_strlen,
-                                   ct_sip_lnlen(dptr, limit),
-                                   hnfo->case_sensitive);
-               if (!aux) {
-                       pr_debug("'%s' not found in '%s'.\n", hnfo->ln_str,
-                                hnfo->lname);
-                       return -1;
+
+               /* Skip continuation lines */
+               if (*dptr == ' ' || *dptr == '\t')
+                       continue;
+
+               /* Find header. Compact headers must be followed by a
+                * non-alphabetic character to avoid mismatches. */
+               if (limit - dptr >= hdr->len &&
+                   strnicmp(dptr, hdr->name, hdr->len) == 0)
+                       dptr += hdr->len;
+               else if (hdr->cname && limit - dptr >= hdr->clen + 1 &&
+                        strnicmp(dptr, hdr->cname, hdr->clen) == 0 &&
+                        !isalpha(*(dptr + hdr->clen + 1)))
+                       dptr += hdr->clen;
+               else
+                       continue;
+
+               /* Find and skip colon */
+               dptr = sip_skip_whitespace(dptr, limit);
+               if (dptr == NULL)
+                       break;
+               if (*dptr != ':' || ++dptr >= limit)
+                       break;
+
+               /* Skip whitespace after colon */
+               dptr = sip_skip_whitespace(dptr, limit);
+               if (dptr == NULL)
+                       break;
+
+               *matchoff = dptr - start;
+               if (hdr->search) {
+                       dptr = ct_sip_header_search(dptr, limit, hdr->search,
+                                                   hdr->slen);
+                       if (!dptr)
+                               return -1;
+                       dptr += hdr->slen;
                }
-               aux += hnfo->ln_strlen;
 
-               *matchlen = hnfo->match_len(ct, aux, limit, &shift);
+               *matchlen = hdr->match_len(ct, dptr, limit, &shift);
                if (!*matchlen)
                        return -1;
+               *matchoff = dptr - start + shift;
+               return 1;
+       }
+       return 0;
+}
+EXPORT_SYMBOL_GPL(ct_sip_get_header);
+
+/* Get next header field in a list of comma seperated values */
+static int ct_sip_next_header(const struct nf_conn *ct, const char *dptr,
+                             unsigned int dataoff, unsigned int datalen,
+                             enum sip_header_types type,
+                             unsigned int *matchoff, unsigned int *matchlen)
+{
+       const struct sip_header *hdr = &ct_sip_hdrs[type];
+       const char *start = dptr, *limit = dptr + datalen;
+       int shift = 0;
+
+       dptr += dataoff;
+
+       dptr = ct_sip_header_search(dptr, limit, ",", strlen(","));
+       if (!dptr)
+               return 0;
+
+       dptr = ct_sip_header_search(dptr, limit, hdr->search, hdr->slen);
+       if (!dptr)
+               return 0;
+       dptr += hdr->slen;
+
+       *matchoff = dptr - start;
+       *matchlen = hdr->match_len(ct, dptr, limit, &shift);
+       if (!*matchlen)
+               return -1;
+       *matchoff += shift;
+       return 1;
+}
+
+/* Walk through headers until a parsable one is found or no header of the
+ * given type is left. */
+static int ct_sip_walk_headers(const struct nf_conn *ct, const char *dptr,
+                              unsigned int dataoff, unsigned int datalen,
+                              enum sip_header_types type, int *in_header,
+                              unsigned int *matchoff, unsigned int *matchlen)
+{
+       int ret;
+
+       if (in_header && *in_header) {
+               while (1) {
+                       ret = ct_sip_next_header(ct, dptr, dataoff, datalen,
+                                                type, matchoff, matchlen);
+                       if (ret > 0)
+                               return ret;
+                       if (ret == 0)
+                               break;
+                       dataoff += *matchoff;
+               }
+               *in_header = 0;
+       }
+
+       while (1) {
+               ret = ct_sip_get_header(ct, dptr, dataoff, datalen,
+                                       type, matchoff, matchlen);
+               if (ret > 0)
+                       break;
+               if (ret == 0)
+                       return ret;
+               dataoff += *matchoff;
+       }
+
+       if (in_header)
+               *in_header = 1;
+       return 1;
+}
+
+/* Locate a SIP header, parse the URI and return the offset and length of
+ * the address as well as the address and port themselves. A stream of
+ * headers can be parsed by handing in a non-NULL datalen and in_header
+ * pointer.
+ */
+int ct_sip_parse_header_uri(const struct nf_conn *ct, const char *dptr,
+                           unsigned int *dataoff, unsigned int datalen,
+                           enum sip_header_types type, int *in_header,
+                           unsigned int *matchoff, unsigned int *matchlen,
+                           union nf_inet_addr *addr, __be16 *port)
+{
+       const char *c, *limit = dptr + datalen;
+       unsigned int p;
+       int ret;
+
+       ret = ct_sip_walk_headers(ct, dptr, dataoff ? *dataoff : 0, datalen,
+                                 type, in_header, matchoff, matchlen);
+       WARN_ON(ret < 0);
+       if (ret == 0)
+               return ret;
+
+       if (!parse_addr(ct, dptr + *matchoff, &c, addr, limit))
+               return -1;
+       if (*c == ':') {
+               c++;
+               p = simple_strtoul(c, (char **)&c, 10);
+               if (p < 1024 || p > 65535)
+                       return -1;
+               *port = htons(p);
+       } else
+               *port = htons(SIP_PORT);
+
+       if (dataoff)
+               *dataoff = c - dptr;
+       return 1;
+}
+EXPORT_SYMBOL_GPL(ct_sip_parse_header_uri);
+
+/* Parse address from header parameter and return address, offset and length */
+int ct_sip_parse_address_param(const struct nf_conn *ct, const char *dptr,
+                              unsigned int dataoff, unsigned int datalen,
+                              const char *name,
+                              unsigned int *matchoff, unsigned int *matchlen,
+                              union nf_inet_addr *addr)
+{
+       const char *limit = dptr + datalen;
+       const char *start, *end;
+
+       limit = ct_sip_header_search(dptr + dataoff, limit, ",", strlen(","));
+       if (!limit)
+               limit = dptr + datalen;
+
+       start = ct_sip_header_search(dptr + dataoff, limit, name, strlen(name));
+       if (!start)
+               return 0;
+
+       start += strlen(name);
+       if (!parse_addr(ct, start, &end, addr, limit))
+               return 0;
+       *matchoff = start - dptr;
+       *matchlen = end - start;
+       return 1;
+}
+EXPORT_SYMBOL_GPL(ct_sip_parse_address_param);
+
+/* Parse numerical header parameter and return value, offset and length */
+int ct_sip_parse_numerical_param(const struct nf_conn *ct, const char *dptr,
+                                unsigned int dataoff, unsigned int datalen,
+                                const char *name,
+                                unsigned int *matchoff, unsigned int *matchlen,
+                                unsigned int *val)
+{
+       const char *limit = dptr + datalen;
+       const char *start;
+       char *end;
+
+       limit = ct_sip_header_search(dptr + dataoff, limit, ",", strlen(","));
+       if (!limit)
+               limit = dptr + datalen;
+
+       start = ct_sip_header_search(dptr + dataoff, limit, name, strlen(name));
+       if (!start)
+               return 0;
+
+       start += strlen(name);
+       *val = simple_strtoul(start, &end, 0);
+       if (start == end)
+               return 0;
+       if (matchoff && matchlen) {
+               *matchoff = start - dptr;
+               *matchlen = end - start;
+       }
+       return 1;
+}
+EXPORT_SYMBOL_GPL(ct_sip_parse_numerical_param);
+
+/* SDP header parsing: a SDP session description contains an ordered set of
+ * headers, starting with a section containing general session parameters,
+ * optionally followed by multiple media descriptions.
+ *
+ * SDP headers always start at the beginning of a line. According to RFC 2327:
+ * "The sequence CRLF (0x0d0a) is used to end a record, although parsers should
+ * be tolerant and also accept records terminated with a single newline
+ * character". We handle both cases.
+ */
+static const struct sip_header ct_sdp_hdrs[] = {
+       [SDP_HDR_VERSION]               = SDP_HDR("v=", NULL, digits_len),
+       [SDP_HDR_OWNER_IP4]             = SDP_HDR("o=", "IN IP4 ", epaddr_len),
+       [SDP_HDR_CONNECTION_IP4]        = SDP_HDR("c=", "IN IP4 ", epaddr_len),
+       [SDP_HDR_OWNER_IP6]             = SDP_HDR("o=", "IN IP6 ", epaddr_len),
+       [SDP_HDR_CONNECTION_IP6]        = SDP_HDR("c=", "IN IP6 ", epaddr_len),
+       [SDP_HDR_MEDIA]                 = SDP_HDR("m=", NULL, media_len),
+};
+
+/* Linear string search within SDP header values */
+static const char *ct_sdp_header_search(const char *dptr, const char *limit,
+                                       const char *needle, unsigned int len)
+{
+       for (limit -= len; dptr < limit; dptr++) {
+               if (*dptr == '\r' || *dptr == '\n')
+                       break;
+               if (strncmp(dptr, needle, len) == 0)
+                       return dptr;
+       }
+       return NULL;
+}
+
+/* Locate a SDP header (optionally a substring within the header value),
+ * optionally stopping at the first occurence of the term header, parse
+ * it and return the offset and length of the data we're interested in.
+ */
+int ct_sip_get_sdp_header(const struct nf_conn *ct, const char *dptr,
+                         unsigned int dataoff, unsigned int datalen,
+                         enum sdp_header_types type,
+                         enum sdp_header_types term,
+                         unsigned int *matchoff, unsigned int *matchlen)
+{
+       const struct sip_header *hdr = &ct_sdp_hdrs[type];
+       const struct sip_header *thdr = &ct_sdp_hdrs[term];
+       const char *start = dptr, *limit = dptr + datalen;
+       int shift = 0;
+
+       for (dptr += dataoff; dptr < limit; dptr++) {
+               /* Find beginning of line */
+               if (*dptr != '\r' && *dptr != '\n')
+                       continue;
+               if (++dptr >= limit)
+                       break;
+               if (*(dptr - 1) == '\r' && *dptr == '\n') {
+                       if (++dptr >= limit)
+                               break;
+               }
 
-               *matchoff = (aux - k) + shift;
+               if (term != SDP_HDR_UNSPEC &&
+                   limit - dptr >= thdr->len &&
+                   strnicmp(dptr, thdr->name, thdr->len) == 0)
+                       break;
+               else if (limit - dptr >= hdr->len &&
+                        strnicmp(dptr, hdr->name, hdr->len) == 0)
+                       dptr += hdr->len;
+               else
+                       continue;
 
-               pr_debug("%s match succeeded! - len: %u\n", hnfo->lname,
-                        *matchlen);
+               *matchoff = dptr - start;
+               if (hdr->search) {
+                       dptr = ct_sdp_header_search(dptr, limit, hdr->search,
+                                                   hdr->slen);
+                       if (!dptr)
+                               return -1;
+                       dptr += hdr->slen;
+               }
+
+               *matchlen = hdr->match_len(ct, dptr, limit, &shift);
+               if (!*matchlen)
+                       return -1;
+               *matchoff = dptr - start + shift;
                return 1;
        }
-       pr_debug("%s header not found.\n", hnfo->lname);
        return 0;
 }
-EXPORT_SYMBOL_GPL(ct_sip_get_info);
+EXPORT_SYMBOL_GPL(ct_sip_get_sdp_header);
+
+static int ct_sip_parse_sdp_addr(const struct nf_conn *ct, const char *dptr,
+                                unsigned int dataoff, unsigned int datalen,
+                                enum sdp_header_types type,
+                                enum sdp_header_types term,
+                                unsigned int *matchoff, unsigned int *matchlen,
+                                union nf_inet_addr *addr)
+{
+       int ret;
+
+       ret = ct_sip_get_sdp_header(ct, dptr, dataoff, datalen, type, term,
+                                   matchoff, matchlen);
+       if (ret <= 0)
+               return ret;
+
+       if (!parse_addr(ct, dptr + *matchoff, NULL, addr,
+                       dptr + *matchoff + *matchlen))
+               return -1;
+       return 1;
+}
+
+static int refresh_signalling_expectation(struct nf_conn *ct,
+                                         union nf_inet_addr *addr,
+                                         __be16 port,
+                                         unsigned int expires)
+{
+       struct nf_conn_help *help = nfct_help(ct);
+       struct nf_conntrack_expect *exp;
+       struct hlist_node *n, *next;
+       int found = 0;
+
+       spin_lock_bh(&nf_conntrack_lock);
+       hlist_for_each_entry_safe(exp, n, next, &help->expectations, lnode) {
+               if (exp->class != SIP_EXPECT_SIGNALLING ||
+                   !nf_inet_addr_cmp(&exp->tuple.dst.u3, addr) ||
+                   exp->tuple.dst.u.udp.port != port)
+                       continue;
+               if (!del_timer(&exp->timeout))
+                       continue;
+               exp->flags &= ~NF_CT_EXPECT_INACTIVE;
+               exp->timeout.expires = jiffies + expires * HZ;
+               add_timer(&exp->timeout);
+               found = 1;
+               break;
+       }
+       spin_unlock_bh(&nf_conntrack_lock);
+       return found;
+}
 
-static int set_expected_rtp(struct sk_buff *skb,
-                           struct nf_conn *ct,
-                           enum ip_conntrack_info ctinfo,
-                           union nf_inet_addr *addr,
-                           __be16 port,
-                           const char *dptr)
+static void flush_expectations(struct nf_conn *ct, bool media)
 {
+       struct nf_conn_help *help = nfct_help(ct);
        struct nf_conntrack_expect *exp;
+       struct hlist_node *n, *next;
+
+       spin_lock_bh(&nf_conntrack_lock);
+       hlist_for_each_entry_safe(exp, n, next, &help->expectations, lnode) {
+               if ((exp->class != SIP_EXPECT_SIGNALLING) ^ media)
+                       continue;
+               if (!del_timer(&exp->timeout))
+                       continue;
+               nf_ct_unlink_expect(exp);
+               nf_ct_expect_put(exp);
+               if (!media)
+                       break;
+       }
+       spin_unlock_bh(&nf_conntrack_lock);
+}
+
+static int set_expected_rtp_rtcp(struct sk_buff *skb,
+                                const char **dptr, unsigned int *datalen,
+                                union nf_inet_addr *daddr, __be16 port,
+                                enum sip_expectation_classes class,
+                                unsigned int mediaoff, unsigned int medialen)
+{
+       struct nf_conntrack_expect *exp, *rtp_exp, *rtcp_exp;
+       enum ip_conntrack_info ctinfo;
+       struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
        enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo);
+       union nf_inet_addr *saddr;
+       struct nf_conntrack_tuple tuple;
        int family = ct->tuplehash[!dir].tuple.src.l3num;
+       int direct_rtp = 0, skip_expect = 0, ret = NF_DROP;
+       u_int16_t base_port;
+       __be16 rtp_port, rtcp_port;
+       typeof(nf_nat_sdp_port_hook) nf_nat_sdp_port;
+       typeof(nf_nat_sdp_media_hook) nf_nat_sdp_media;
+
+       saddr = NULL;
+       if (sip_direct_media) {
+               if (!nf_inet_addr_cmp(daddr, &ct->tuplehash[dir].tuple.src.u3))
+                       return NF_ACCEPT;
+               saddr = &ct->tuplehash[!dir].tuple.src.u3;
+       }
+
+       /* We need to check whether the registration exists before attempting
+        * to register it since we can see the same media description multiple
+        * times on different connections in case multiple endpoints receive
+        * the same call.
+        *
+        * RTP optimization: if we find a matching media channel expectation
+        * and both the expectation and this connection are SNATed, we assume
+        * both sides can reach each other directly and use the final
+        * destination address from the expectation. We still need to keep
+        * the NATed expectations for media that might arrive from the
+        * outside, and additionally need to expect the direct RTP stream
+        * in case it passes through us even without NAT.
+        */
+       memset(&tuple, 0, sizeof(tuple));
+       if (saddr)
+               tuple.src.u3 = *saddr;
+       tuple.src.l3num         = family;
+       tuple.dst.protonum      = IPPROTO_UDP;
+       tuple.dst.u3            = *daddr;
+       tuple.dst.u.udp.port    = port;
+
+       rcu_read_lock();
+       do {
+               exp = __nf_ct_expect_find(&tuple);
+
+               if (!exp || exp->master == ct ||
+                   nfct_help(exp->master)->helper != nfct_help(ct)->helper ||
+                   exp->class != class)
+                       break;
+
+               if (exp->tuple.src.l3num == AF_INET && !direct_rtp &&
+                   (exp->saved_ip != exp->tuple.dst.u3.ip ||
+                    exp->saved_proto.udp.port != exp->tuple.dst.u.udp.port) &&
+                   ct->status & IPS_NAT_MASK) {
+                       daddr->ip               = exp->saved_ip;
+                       tuple.dst.u3.ip         = exp->saved_ip;
+                       tuple.dst.u.udp.port    = exp->saved_proto.udp.port;
+                       direct_rtp = 1;
+               } else
+                       skip_expect = 1;
+       } while (!skip_expect);
+       rcu_read_unlock();
+
+       base_port = ntohs(tuple.dst.u.udp.port) & ~1;
+       rtp_port = htons(base_port);
+       rtcp_port = htons(base_port + 1);
+
+       if (direct_rtp) {
+               nf_nat_sdp_port = rcu_dereference(nf_nat_sdp_port_hook);
+               if (nf_nat_sdp_port &&
+                   !nf_nat_sdp_port(skb, dptr, datalen,
+                                    mediaoff, medialen, ntohs(rtp_port)))
+                       goto err1;
+       }
+
+       if (skip_expect)
+               return NF_ACCEPT;
+
+       rtp_exp = nf_ct_expect_alloc(ct);
+       if (rtp_exp == NULL)
+               goto err1;
+       nf_ct_expect_init(rtp_exp, class, family, saddr, daddr,
+                         IPPROTO_UDP, NULL, &rtp_port);
+
+       rtcp_exp = nf_ct_expect_alloc(ct);
+       if (rtcp_exp == NULL)
+               goto err2;
+       nf_ct_expect_init(rtcp_exp, class, family, saddr, daddr,
+                         IPPROTO_UDP, NULL, &rtcp_port);
+
+       nf_nat_sdp_media = rcu_dereference(nf_nat_sdp_media_hook);
+       if (nf_nat_sdp_media && ct->status & IPS_NAT_MASK && !direct_rtp)
+               ret = nf_nat_sdp_media(skb, dptr, datalen, rtp_exp, rtcp_exp,
+                                      mediaoff, medialen, daddr);
+       else {
+               if (nf_ct_expect_related(rtp_exp) == 0) {
+                       if (nf_ct_expect_related(rtcp_exp) != 0)
+                               nf_ct_unexpect_related(rtp_exp);
+                       else
+                               ret = NF_ACCEPT;
+               }
+       }
+       nf_ct_expect_put(rtcp_exp);
+err2:
+       nf_ct_expect_put(rtp_exp);
+err1:
+       return ret;
+}
+
+static const struct sdp_media_type sdp_media_types[] = {
+       SDP_MEDIA_TYPE("audio ", SIP_EXPECT_AUDIO),
+       SDP_MEDIA_TYPE("video ", SIP_EXPECT_VIDEO),
+};
+
+static const struct sdp_media_type *sdp_media_type(const char *dptr,
+                                                  unsigned int matchoff,
+                                                  unsigned int matchlen)
+{
+       const struct sdp_media_type *t;
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(sdp_media_types); i++) {
+               t = &sdp_media_types[i];
+               if (matchlen < t->len ||
+                   strncmp(dptr + matchoff, t->name, t->len))
+                       continue;
+               return t;
+       }
+       return NULL;
+}
+
+static int process_sdp(struct sk_buff *skb,
+                      const char **dptr, unsigned int *datalen,
+                      unsigned int cseq)
+{
+       enum ip_conntrack_info ctinfo;
+       struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
+       int family = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.l3num;
+       unsigned int matchoff, matchlen;
+       unsigned int mediaoff, medialen;
+       unsigned int sdpoff;
+       unsigned int caddr_len, maddr_len;
+       unsigned int i;
+       union nf_inet_addr caddr, maddr, rtp_addr;
+       unsigned int port;
+       enum sdp_header_types c_hdr;
+       const struct sdp_media_type *t;
+       int ret = NF_ACCEPT;
+       typeof(nf_nat_sdp_addr_hook) nf_nat_sdp_addr;
+       typeof(nf_nat_sdp_session_hook) nf_nat_sdp_session;
+
+       nf_nat_sdp_addr = rcu_dereference(nf_nat_sdp_addr_hook);
+       c_hdr = family == AF_INET ? SDP_HDR_CONNECTION_IP4 :
+                                   SDP_HDR_CONNECTION_IP6;
+
+       /* Find beginning of session description */
+       if (ct_sip_get_sdp_header(ct, *dptr, 0, *datalen,
+                                 SDP_HDR_VERSION, SDP_HDR_UNSPEC,
+                                 &matchoff, &matchlen) <= 0)
+               return NF_ACCEPT;
+       sdpoff = matchoff;
+
+       /* The connection information is contained in the session description
+        * and/or once per media description. The first media description marks
+        * the end of the session description. */
+       caddr_len = 0;
+       if (ct_sip_parse_sdp_addr(ct, *dptr, sdpoff, *datalen,
+                                 c_hdr, SDP_HDR_MEDIA,
+                                 &matchoff, &matchlen, &caddr) > 0)
+               caddr_len = matchlen;
+
+       mediaoff = sdpoff;
+       for (i = 0; i < ARRAY_SIZE(sdp_media_types); ) {
+               if (ct_sip_get_sdp_header(ct, *dptr, mediaoff, *datalen,
+                                         SDP_HDR_MEDIA, SDP_HDR_UNSPEC,
+                                         &mediaoff, &medialen) <= 0)
+                       break;
+
+               /* Get media type and port number. A media port value of zero
+                * indicates an inactive stream. */
+               t = sdp_media_type(*dptr, mediaoff, medialen);
+               if (!t) {
+                       mediaoff += medialen;
+                       continue;
+               }
+               mediaoff += t->len;
+               medialen -= t->len;
+
+               port = simple_strtoul(*dptr + mediaoff, NULL, 10);
+               if (port == 0)
+                       continue;
+               if (port < 1024 || port > 65535)
+                       return NF_DROP;
+
+               /* The media description overrides the session description. */
+               maddr_len = 0;
+               if (ct_sip_parse_sdp_addr(ct, *dptr, mediaoff, *datalen,
+                                         c_hdr, SDP_HDR_MEDIA,
+                                         &matchoff, &matchlen, &maddr) > 0) {
+                       maddr_len = matchlen;
+                       memcpy(&rtp_addr, &maddr, sizeof(rtp_addr));
+               } else if (caddr_len)
+                       memcpy(&rtp_addr, &caddr, sizeof(rtp_addr));
+               else
+                       return NF_DROP;
+
+               ret = set_expected_rtp_rtcp(skb, dptr, datalen,
+                                           &rtp_addr, htons(port), t->class,
+                                           mediaoff, medialen);
+               if (ret != NF_ACCEPT)
+                       return ret;
+
+               /* Update media connection address if present */
+               if (maddr_len && nf_nat_sdp_addr && ct->status & IPS_NAT_MASK) {
+                       ret = nf_nat_sdp_addr(skb, dptr, mediaoff, datalen,
+                                             c_hdr, SDP_HDR_MEDIA, &rtp_addr);
+                       if (ret != NF_ACCEPT)
+                               return ret;
+               }
+               i++;
+       }
+
+       /* Update session connection and owner addresses */
+       nf_nat_sdp_session = rcu_dereference(nf_nat_sdp_session_hook);
+       if (nf_nat_sdp_session && ct->status & IPS_NAT_MASK)
+               ret = nf_nat_sdp_session(skb, dptr, sdpoff, datalen, &rtp_addr);
+
+       return ret;
+}
+static int process_invite_response(struct sk_buff *skb,
+                                  const char **dptr, unsigned int *datalen,
+                                  unsigned int cseq, unsigned int code)
+{
+       enum ip_conntrack_info ctinfo;
+       struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
+
+       if ((code >= 100 && code <= 199) ||
+           (code >= 200 && code <= 299))
+               return process_sdp(skb, dptr, datalen, cseq);
+       else {
+               flush_expectations(ct, true);
+               return NF_ACCEPT;
+       }
+}
+
+static int process_update_response(struct sk_buff *skb,
+                                  const char **dptr, unsigned int *datalen,
+                                  unsigned int cseq, unsigned int code)
+{
+       enum ip_conntrack_info ctinfo;
+       struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
+
+       if ((code >= 100 && code <= 199) ||
+           (code >= 200 && code <= 299))
+               return process_sdp(skb, dptr, datalen, cseq);
+       else {
+               flush_expectations(ct, true);
+               return NF_ACCEPT;
+       }
+}
+
+static int process_prack_response(struct sk_buff *skb,
+                                 const char **dptr, unsigned int *datalen,
+                                 unsigned int cseq, unsigned int code)
+{
+       enum ip_conntrack_info ctinfo;
+       struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
+
+       if ((code >= 100 && code <= 199) ||
+           (code >= 200 && code <= 299))
+               return process_sdp(skb, dptr, datalen, cseq);
+       else {
+               flush_expectations(ct, true);
+               return NF_ACCEPT;
+       }
+}
+
+static int process_bye_request(struct sk_buff *skb,
+                              const char **dptr, unsigned int *datalen,
+                              unsigned int cseq)
+{
+       enum ip_conntrack_info ctinfo;
+       struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
+
+       flush_expectations(ct, true);
+       return NF_ACCEPT;
+}
+
+/* Parse a REGISTER request and create a permanent expectation for incoming
+ * signalling connections. The expectation is marked inactive and is activated
+ * when receiving a response indicating success from the registrar.
+ */
+static int process_register_request(struct sk_buff *skb,
+                                   const char **dptr, unsigned int *datalen,
+                                   unsigned int cseq)
+{
+       enum ip_conntrack_info ctinfo;
+       struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
+       struct nf_conn_help *help = nfct_help(ct);
+       enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo);
+       int family = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.l3num;
+       unsigned int matchoff, matchlen;
+       struct nf_conntrack_expect *exp;
+       union nf_inet_addr *saddr, daddr;
+       __be16 port;
+       unsigned int expires = 0;
        int ret;
-       typeof(nf_nat_sdp_hook) nf_nat_sdp;
+       typeof(nf_nat_sip_expect_hook) nf_nat_sip_expect;
+
+       /* Expected connections can not register again. */
+       if (ct->status & IPS_EXPECTED)
+               return NF_ACCEPT;
+
+       /* We must check the expiration time: a value of zero signals the
+        * registrar to release the binding. We'll remove our expectation
+        * when receiving the new bindings in the response, but we don't
+        * want to create new ones.
+        *
+        * The expiration time may be contained in Expires: header, the
+        * Contact: header parameters or the URI parameters.
+        */
+       if (ct_sip_get_header(ct, *dptr, 0, *datalen, SIP_HDR_EXPIRES,
+                             &matchoff, &matchlen) > 0)
+               expires = simple_strtoul(*dptr + matchoff, NULL, 10);
+
+       ret = ct_sip_parse_header_uri(ct, *dptr, NULL, *datalen,
+                                     SIP_HDR_CONTACT, NULL,
+                                     &matchoff, &matchlen, &daddr, &port);
+       if (ret < 0)
+               return NF_DROP;
+       else if (ret == 0)
+               return NF_ACCEPT;
+
+       /* We don't support third-party registrations */
+       if (!nf_inet_addr_cmp(&ct->tuplehash[dir].tuple.src.u3, &daddr))
+               return NF_ACCEPT;
+
+       if (ct_sip_parse_numerical_param(ct, *dptr,
+                                        matchoff + matchlen, *datalen,
+                                        "expires=", NULL, NULL, &expires) < 0)
+               return NF_DROP;
+
+       if (expires == 0) {
+               ret = NF_ACCEPT;
+               goto store_cseq;
+       }
 
        exp = nf_ct_expect_alloc(ct);
-       if (exp == NULL)
+       if (!exp)
                return NF_DROP;
-       nf_ct_expect_init(exp, family,
-                         &ct->tuplehash[!dir].tuple.src.u3, addr,
+
+       saddr = NULL;
+       if (sip_direct_signalling)
+               saddr = &ct->tuplehash[!dir].tuple.src.u3;
+
+       nf_ct_expect_init(exp, SIP_EXPECT_SIGNALLING, family, saddr, &daddr,
                          IPPROTO_UDP, NULL, &port);
+       exp->timeout.expires = sip_timeout * HZ;
+       exp->helper = nfct_help(ct)->helper;
+       exp->flags = NF_CT_EXPECT_PERMANENT | NF_CT_EXPECT_INACTIVE;
 
-       nf_nat_sdp = rcu_dereference(nf_nat_sdp_hook);
-       if (nf_nat_sdp && ct->status & IPS_NAT_MASK)
-               ret = nf_nat_sdp(skb, ctinfo, exp, dptr);
+       nf_nat_sip_expect = rcu_dereference(nf_nat_sip_expect_hook);
+       if (nf_nat_sip_expect && ct->status & IPS_NAT_MASK)
+               ret = nf_nat_sip_expect(skb, dptr, datalen, exp,
+                                       matchoff, matchlen);
        else {
                if (nf_ct_expect_related(exp) != 0)
                        ret = NF_DROP;
@@ -395,22 +1106,160 @@ static int set_expected_rtp(struct sk_buff *skb,
        }
        nf_ct_expect_put(exp);
 
+store_cseq:
+       if (ret == NF_ACCEPT)
+               help->help.ct_sip_info.register_cseq = cseq;
        return ret;
 }
 
+static int process_register_response(struct sk_buff *skb,
+                                    const char **dptr, unsigned int *datalen,
+                                    unsigned int cseq, unsigned int code)
+{
+       enum ip_conntrack_info ctinfo;
+       struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
+       struct nf_conn_help *help = nfct_help(ct);
+       enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo);
+       union nf_inet_addr addr;
+       __be16 port;
+       unsigned int matchoff, matchlen, dataoff = 0;
+       unsigned int expires = 0;
+       int in_contact = 0, ret;
+
+       /* According to RFC 3261, "UAs MUST NOT send a new registration until
+        * they have received a final response from the registrar for the
+        * previous one or the previous REGISTER request has timed out".
+        *
+        * However, some servers fail to detect retransmissions and send late
+        * responses, so we store the sequence number of the last valid
+        * request and compare it here.
+        */
+       if (help->help.ct_sip_info.register_cseq != cseq)
+               return NF_ACCEPT;
+
+       if (code >= 100 && code <= 199)
+               return NF_ACCEPT;
+       if (code < 200 || code > 299)
+               goto flush;
+
+       if (ct_sip_get_header(ct, *dptr, 0, *datalen, SIP_HDR_EXPIRES,
+                             &matchoff, &matchlen) > 0)
+               expires = simple_strtoul(*dptr + matchoff, NULL, 10);
+
+       while (1) {
+               unsigned int c_expires = expires;
+
+               ret = ct_sip_parse_header_uri(ct, *dptr, &dataoff, *datalen,
+                                             SIP_HDR_CONTACT, &in_contact,
+                                             &matchoff, &matchlen,
+                                             &addr, &port);
+               if (ret < 0)
+                       return NF_DROP;
+               else if (ret == 0)
+                       break;
+
+               /* We don't support third-party registrations */
+               if (!nf_inet_addr_cmp(&ct->tuplehash[dir].tuple.dst.u3, &addr))
+                       continue;
+
+               ret = ct_sip_parse_numerical_param(ct, *dptr,
+                                                  matchoff + matchlen,
+                                                  *datalen, "expires=",
+                                                  NULL, NULL, &c_expires);
+               if (ret < 0)
+                       return NF_DROP;
+               if (c_expires == 0)
+                       break;
+               if (refresh_signalling_expectation(ct, &addr, port, c_expires))
+                       return NF_ACCEPT;
+       }
+
+flush:
+       flush_expectations(ct, false);
+       return NF_ACCEPT;
+}
+
+static const struct sip_handler sip_handlers[] = {
+       SIP_HANDLER("INVITE", process_sdp, process_invite_response),
+       SIP_HANDLER("UPDATE", process_sdp, process_update_response),
+       SIP_HANDLER("ACK", process_sdp, NULL),
+       SIP_HANDLER("PRACK", process_sdp, process_prack_response),
+       SIP_HANDLER("BYE", process_bye_request, NULL),
+       SIP_HANDLER("REGISTER", process_register_request, process_register_response),
+};
+
+static int process_sip_response(struct sk_buff *skb,
+                               const char **dptr, unsigned int *datalen)
+{
+       static const struct sip_handler *handler;
+       enum ip_conntrack_info ctinfo;
+       struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
+       unsigned int matchoff, matchlen;
+       unsigned int code, cseq, dataoff, i;
+
+       if (*datalen < strlen("SIP/2.0 200"))
+               return NF_ACCEPT;
+       code = simple_strtoul(*dptr + strlen("SIP/2.0 "), NULL, 10);
+       if (!code)
+               return NF_DROP;
+
+       if (ct_sip_get_header(ct, *dptr, 0, *datalen, SIP_HDR_CSEQ,
+                             &matchoff, &matchlen) <= 0)
+               return NF_DROP;
+       cseq = simple_strtoul(*dptr + matchoff, NULL, 10);
+       if (!cseq)
+               return NF_DROP;
+       dataoff = matchoff + matchlen + 1;
+
+       for (i = 0; i < ARRAY_SIZE(sip_handlers); i++) {
+               handler = &sip_handlers[i];
+               if (handler->response == NULL)
+                       continue;
+               if (*datalen < dataoff + handler->len ||
+                   strnicmp(*dptr + dataoff, handler->method, handler->len))
+                       continue;
+               return handler->response(skb, dptr, datalen, cseq, code);
+       }
+       return NF_ACCEPT;
+}
+
+static int process_sip_request(struct sk_buff *skb,
+                              const char **dptr, unsigned int *datalen)
+{
+       static const struct sip_handler *handler;
+       enum ip_conntrack_info ctinfo;
+       struct nf_conn *ct = nf_ct_get(skb, &ctinfo);
+       unsigned int matchoff, matchlen;
+       unsigned int cseq, i;
+
+       for (i = 0; i < ARRAY_SIZE(sip_handlers); i++) {
+               handler = &sip_handlers[i];
+               if (handler->request == NULL)
+                       continue;
+               if (*datalen < handler->len ||
+                   strnicmp(*dptr, handler->method, handler->len))
+                       continue;
+
+               if (ct_sip_get_header(ct, *dptr, 0, *datalen, SIP_HDR_CSEQ,
+                                     &matchoff, &matchlen) <= 0)
+                       return NF_DROP;
+               cseq = simple_strtoul(*dptr + matchoff, NULL, 10);
+               if (!cseq)
+                       return NF_DROP;
+
+               return handler->request(skb, dptr, datalen, cseq);
+       }
+       return NF_ACCEPT;
+}
+
 static int sip_help(struct sk_buff *skb,
                    unsigned int protoff,
                    struct nf_conn *ct,
                    enum ip_conntrack_info ctinfo)
 {
-       int family = ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.l3num;
-       union nf_inet_addr addr;
        unsigned int dataoff, datalen;
        const char *dptr;
-       int ret = NF_ACCEPT;
-       unsigned int matchoff, matchlen;
-       u_int16_t port;
-       enum sip_header_pos pos;
+       int ret;
        typeof(nf_nat_sip_hook) nf_nat_sip;
 
        /* No Data ? */
@@ -424,58 +1273,45 @@ static int sip_help(struct sk_buff *skb,
                dptr = skb->data + dataoff;
        else {
                pr_debug("Copy of skbuff not supported yet.\n");
-               goto out;
-       }
-
-       nf_nat_sip = rcu_dereference(nf_nat_sip_hook);
-       if (nf_nat_sip && ct->status & IPS_NAT_MASK) {
-               if (!nf_nat_sip(skb, ctinfo, ct, &dptr)) {
-                       ret = NF_DROP;
-                       goto out;
-               }
+               return NF_ACCEPT;
        }
 
        datalen = skb->len - dataoff;
-       if (datalen < sizeof("SIP/2.0 200") - 1)
-               goto out;
-
-       /* RTP info only in some SDP pkts */
-       if (memcmp(dptr, "INVITE", sizeof("INVITE") - 1) != 0 &&
-           memcmp(dptr, "UPDATE", sizeof("UPDATE") - 1) != 0 &&
-           memcmp(dptr, "SIP/2.0 180", sizeof("SIP/2.0 180") - 1) != 0 &&
-           memcmp(dptr, "SIP/2.0 183", sizeof("SIP/2.0 183") - 1) != 0 &&
-           memcmp(dptr, "SIP/2.0 200", sizeof("SIP/2.0 200") - 1) != 0) {
-               goto out;
-       }
-       /* Get address and port from SDP packet. */
-       pos = family == AF_INET ? POS_CONNECTION_IP4 : POS_CONNECTION_IP6;
-       if (ct_sip_get_info(ct, dptr, datalen, &matchoff, &matchlen, pos) > 0) {
-
-               /* We'll drop only if there are parse problems. */
-               if (!parse_addr(ct, dptr + matchoff, NULL, &addr,
-                               dptr + datalen)) {
-                       ret = NF_DROP;
-                       goto out;
-               }
-               if (ct_sip_get_info(ct, dptr, datalen, &matchoff, &matchlen,
-                                   POS_MEDIA) > 0) {
+       if (datalen < strlen("SIP/2.0 200"))
+               return NF_ACCEPT;
 
-                       port = simple_strtoul(dptr + matchoff, NULL, 10);
-                       if (port < 1024) {
-                               ret = NF_DROP;
-                               goto out;
-                       }
-                       ret = set_expected_rtp(skb, ct, ctinfo, &addr,
-                                              htons(port), dptr);
-               }
+       if (strnicmp(dptr, "SIP/2.0 ", strlen("SIP/2.0 ")) != 0)
+               ret = process_sip_request(skb, &dptr, &datalen);
+       else
+               ret = process_sip_response(skb, &dptr, &datalen);
+
+       if (ret == NF_ACCEPT && ct->status & IPS_NAT_MASK) {
+               nf_nat_sip = rcu_dereference(nf_nat_sip_hook);
+               if (nf_nat_sip && !nf_nat_sip(skb, &dptr, &datalen))
+                       ret = NF_DROP;
        }
-out:
+
        return ret;
 }
 
 static struct nf_conntrack_helper sip[MAX_PORTS][2] __read_mostly;
 static char sip_names[MAX_PORTS][2][sizeof("sip-65535")] __read_mostly;
 
+static const struct nf_conntrack_expect_policy sip_exp_policy[SIP_EXPECT_MAX + 1] = {
+       [SIP_EXPECT_SIGNALLING] = {
+               .max_expected   = 1,
+               .timeout        = 3 * 60,
+       },
+       [SIP_EXPECT_AUDIO] = {
+               .max_expected   = 2 * IP_CT_DIR_MAX,
+               .timeout        = 3 * 60,
+       },
+       [SIP_EXPECT_VIDEO] = {
+               .max_expected   = 2 * IP_CT_DIR_MAX,
+               .timeout        = 3 * 60,
+       },
+};
+
 static void nf_conntrack_sip_fini(void)
 {
        int i, j;
@@ -505,8 +1341,8 @@ static int __init nf_conntrack_sip_init(void)
                for (j = 0; j < 2; j++) {
                        sip[i][j].tuple.dst.protonum = IPPROTO_UDP;
                        sip[i][j].tuple.src.u.udp.port = htons(ports[i]);
-                       sip[i][j].max_expected = 2;
-                       sip[i][j].timeout = 3 * 60; /* 3 minutes */
+                       sip[i][j].expect_policy = sip_exp_policy;
+                       sip[i][j].expect_class_max = SIP_EXPECT_MAX;
                        sip[i][j].me = THIS_MODULE;
                        sip[i][j].help = sip_help;
 
index bd2e800f23cc8bc1c9fb8708c3b6e6426dfbaa8f..a28341b30f217c162365021c2bae7170f3ad99a4 100644 (file)
@@ -63,7 +63,8 @@ static int tftp_help(struct sk_buff *skb,
                if (exp == NULL)
                        return NF_DROP;
                tuple = &ct->tuplehash[IP_CT_DIR_REPLY].tuple;
-               nf_ct_expect_init(exp, family, &tuple->src.u3, &tuple->dst.u3,
+               nf_ct_expect_init(exp, NF_CT_EXPECT_CLASS_DEFAULT, family,
+                                 &tuple->src.u3, &tuple->dst.u3,
                                  IPPROTO_UDP, NULL, &tuple->dst.u.udp.port);
 
                pr_debug("expect: ");
@@ -92,6 +93,11 @@ static int tftp_help(struct sk_buff *skb,
 static struct nf_conntrack_helper tftp[MAX_PORTS][2] __read_mostly;
 static char tftp_names[MAX_PORTS][2][sizeof("tftp-65535")] __read_mostly;
 
+static const struct nf_conntrack_expect_policy tftp_exp_policy = {
+       .max_expected   = 1,
+       .timeout        = 5 * 60,
+};
+
 static void nf_conntrack_tftp_fini(void)
 {
        int i, j;
@@ -118,8 +124,7 @@ static int __init nf_conntrack_tftp_init(void)
                for (j = 0; j < 2; j++) {
                        tftp[i][j].tuple.dst.protonum = IPPROTO_UDP;
                        tftp[i][j].tuple.src.u.udp.port = htons(ports[i]);
-                       tftp[i][j].max_expected = 1;
-                       tftp[i][j].timeout = 5 * 60; /* 5 minutes */
+                       tftp[i][j].expect_policy = &tftp_exp_policy;
                        tftp[i][j].me = THIS_MODULE;
                        tftp[i][j].help = tftp_help;
 
index 3dd4b3c76d811a6545a0a26140f59ac237020ea4..69d699f95f4c92658ba85608e2f9eb69c635c346 100644 (file)
@@ -65,7 +65,7 @@ static struct nf_sockopt_ops *nf_sockopt_find(struct sock *sk, int pf,
 {
        struct nf_sockopt_ops *ops;
 
-       if (sk->sk_net != &init_net)
+       if (sock_net(sk) != &init_net)
                return ERR_PTR(-ENOPROTOOPT);
 
        if (mutex_lock_interruptible(&nf_sockopt_mutex) != 0)
index 012cb69108202c6ac1060847a7050a874e12931c..81fb048add882b1fabbc864d92fa0fecd262ec15 100644 (file)
@@ -557,7 +557,7 @@ nfqnl_rcv_dev_event(struct notifier_block *this,
 {
        struct net_device *dev = ptr;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        /* Drop any packets associated with the downed device */
index a6792089fcf9d4d8430af560addfb8f8a758b7b5..0bd95680a494e050ee61249a311bd450e7459da1 100644 (file)
@@ -727,7 +727,7 @@ struct xt_names_priv {
 static void *xt_table_seq_start(struct seq_file *seq, loff_t *pos)
 {
        struct xt_names_priv *priv = seq->private;
-       struct net *net = priv->p.net;
+       struct net *net = seq_file_net(seq);
        int af = priv->af;
 
        mutex_lock(&xt[af].mutex);
@@ -737,7 +737,7 @@ static void *xt_table_seq_start(struct seq_file *seq, loff_t *pos)
 static void *xt_table_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 {
        struct xt_names_priv *priv = seq->private;
-       struct net *net = priv->p.net;
+       struct net *net = seq_file_net(seq);
        int af = priv->af;
 
        return seq_list_next(v, &net->xt.tables[af], pos);
index 4478f2f6079d929a8909bf13ccf1057796a46c3b..a547c6320eb340d0aaa4abdbbd888c0a8f0ae060 100644 (file)
@@ -954,7 +954,7 @@ static int netlbl_unlhsh_netdev_handler(struct notifier_block *this,
        struct net_device *dev = ptr;
        struct netlbl_unlhsh_iface *iface = NULL;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        /* XXX - should this be a check for NETDEV_DOWN or _UNREGISTER? */
index 86bd8660a8f2789c5e1ec83c1f66c1b8c9131bd4..36f75d87389861e6d2fc170f1ef270dea0c02253 100644 (file)
@@ -228,7 +228,7 @@ static inline struct sock *netlink_lookup(struct net *net, int protocol,
        read_lock(&nl_table_lock);
        head = nl_pid_hashfn(hash, pid);
        sk_for_each(sk, node, head) {
-               if ((sk->sk_net == net) && (nlk_sk(sk)->pid == pid)) {
+               if (net_eq(sock_net(sk), net) && (nlk_sk(sk)->pid == pid)) {
                        sock_hold(sk);
                        goto found;
                }
@@ -348,7 +348,7 @@ static int netlink_insert(struct sock *sk, struct net *net, u32 pid)
        head = nl_pid_hashfn(hash, pid);
        len = 0;
        sk_for_each(osk, node, head) {
-               if ((osk->sk_net == net) && (nlk_sk(osk)->pid == pid))
+               if (net_eq(sock_net(osk), net) && (nlk_sk(osk)->pid == pid))
                        break;
                len++;
        }
@@ -486,7 +486,7 @@ static int netlink_release(struct socket *sock)
 
        if (nlk->pid && !nlk->subscriptions) {
                struct netlink_notify n = {
-                                               .net = sk->sk_net,
+                                               .net = sock_net(sk),
                                                .protocol = sk->sk_protocol,
                                                .pid = nlk->pid,
                                          };
@@ -518,7 +518,7 @@ static int netlink_release(struct socket *sock)
 static int netlink_autobind(struct socket *sock)
 {
        struct sock *sk = sock->sk;
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
        struct nl_pid_hash *hash = &nl_table[sk->sk_protocol].hash;
        struct hlist_head *head;
        struct sock *osk;
@@ -532,7 +532,7 @@ retry:
        netlink_table_grab();
        head = nl_pid_hashfn(hash, pid);
        sk_for_each(osk, node, head) {
-               if ((osk->sk_net != net))
+               if (!net_eq(sock_net(osk), net))
                        continue;
                if (nlk_sk(osk)->pid == pid) {
                        /* Bind collision, search negative pid values. */
@@ -611,7 +611,7 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr,
                        int addr_len)
 {
        struct sock *sk = sock->sk;
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
        struct netlink_sock *nlk = nlk_sk(sk);
        struct sockaddr_nl *nladdr = (struct sockaddr_nl *)addr;
        int err;
@@ -720,7 +720,7 @@ static struct sock *netlink_getsockbypid(struct sock *ssk, u32 pid)
        struct sock *sock;
        struct netlink_sock *nlk;
 
-       sock = netlink_lookup(ssk->sk_net, ssk->sk_protocol, pid);
+       sock = netlink_lookup(sock_net(ssk), ssk->sk_protocol, pid);
        if (!sock)
                return ERR_PTR(-ECONNREFUSED);
 
@@ -962,7 +962,7 @@ static inline int do_one_broadcast(struct sock *sk,
            !test_bit(p->group - 1, nlk->groups))
                goto out;
 
-       if ((sk->sk_net != p->net))
+       if (!net_eq(sock_net(sk), p->net))
                goto out;
 
        if (p->failure) {
@@ -1006,7 +1006,7 @@ out:
 int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, u32 pid,
                      u32 group, gfp_t allocation)
 {
-       struct net *net = ssk->sk_net;
+       struct net *net = sock_net(ssk);
        struct netlink_broadcast_data info;
        struct hlist_node *node;
        struct sock *sk;
@@ -1064,7 +1064,7 @@ static inline int do_one_set_err(struct sock *sk,
        if (sk == p->exclude_sk)
                goto out;
 
-       if (sk->sk_net != p->exclude_sk->sk_net)
+       if (sock_net(sk) != sock_net(p->exclude_sk))
                goto out;
 
        if (nlk->pid == p->pid || p->group - 1 >= nlk->ngroups ||
@@ -1601,7 +1601,7 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
        atomic_inc(&skb->users);
        cb->skb = skb;
 
-       sk = netlink_lookup(ssk->sk_net, ssk->sk_protocol, NETLINK_CB(skb).pid);
+       sk = netlink_lookup(sock_net(ssk), ssk->sk_protocol, NETLINK_CB(skb).pid);
        if (sk == NULL) {
                netlink_destroy_callback(cb);
                return -ECONNREFUSED;
@@ -1643,7 +1643,7 @@ void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err)
        if (!skb) {
                struct sock *sk;
 
-               sk = netlink_lookup(in_skb->sk->sk_net,
+               sk = netlink_lookup(sock_net(in_skb->sk),
                                    in_skb->sk->sk_protocol,
                                    NETLINK_CB(in_skb).pid);
                if (sk) {
@@ -1758,7 +1758,7 @@ static struct sock *netlink_seq_socket_idx(struct seq_file *seq, loff_t pos)
 
                for (j = 0; j <= hash->mask; j++) {
                        sk_for_each(s, node, &hash->table[j]) {
-                               if (iter->p.net != s->sk_net)
+                               if (sock_net(s) != seq_file_net(seq))
                                        continue;
                                if (off == pos) {
                                        iter->link = i;
@@ -1794,7 +1794,7 @@ static void *netlink_seq_next(struct seq_file *seq, void *v, loff_t *pos)
        s = v;
        do {
                s = sk_next(s);
-       } while (s && (iter->p.net != s->sk_net));
+       } while (s && sock_net(s) != seq_file_net(seq));
        if (s)
                return s;
 
@@ -1806,7 +1806,7 @@ static void *netlink_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 
                for (; j <= hash->mask; j++) {
                        s = sk_head(&hash->table[j]);
-                       while (s && (iter->p.net != s->sk_net))
+                       while (s && sock_net(s) != seq_file_net(seq))
                                s = sk_next(s);
                        if (s) {
                                iter->link = i;
index 972250c974f1ceaf053eb92712018d4be781ed78..4bae8b998cab8fa27325021ca1c4fc7e7ff3b40e 100644 (file)
@@ -106,7 +106,7 @@ static int nr_device_event(struct notifier_block *this, unsigned long event, voi
 {
        struct net_device *dev = (struct net_device *)ptr;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        if (event != NETDEV_DOWN)
@@ -466,7 +466,7 @@ static struct sock *nr_make_new(struct sock *osk)
        if (osk->sk_type != SOCK_SEQPACKET)
                return NULL;
 
-       sk = sk_alloc(osk->sk_net, PF_NETROM, GFP_ATOMIC, osk->sk_prot);
+       sk = sk_alloc(sock_net(osk), PF_NETROM, GFP_ATOMIC, osk->sk_prot);
        if (sk == NULL)
                return NULL;
 
index a56ed2120e07134b9c9f2cde394fb7dc152ef8e6..25070240d4ae79aa94e23bcde07ef81291849a4a 100644 (file)
@@ -263,7 +263,7 @@ static int packet_rcv_spkt(struct sk_buff *skb, struct net_device *dev,  struct
        if (skb->pkt_type == PACKET_LOOPBACK)
                goto out;
 
-       if (dev->nd_net != sk->sk_net)
+       if (dev_net(dev) != sock_net(sk))
                goto out;
 
        if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL)
@@ -337,7 +337,7 @@ static int packet_sendmsg_spkt(struct kiocb *iocb, struct socket *sock,
         */
 
        saddr->spkt_device[13] = 0;
-       dev = dev_get_by_name(sk->sk_net, saddr->spkt_device);
+       dev = dev_get_by_name(sock_net(sk), saddr->spkt_device);
        err = -ENODEV;
        if (dev == NULL)
                goto out_unlock;
@@ -451,7 +451,7 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev, struct packet
        sk = pt->af_packet_priv;
        po = pkt_sk(sk);
 
-       if (dev->nd_net != sk->sk_net)
+       if (dev_net(dev) != sock_net(sk))
                goto drop;
 
        skb->dev = dev;
@@ -568,7 +568,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, struct packe
        sk = pt->af_packet_priv;
        po = pkt_sk(sk);
 
-       if (dev->nd_net != sk->sk_net)
+       if (dev_net(dev) != sock_net(sk))
                goto drop;
 
        if (dev->header_ops) {
@@ -728,7 +728,7 @@ static int packet_sendmsg(struct kiocb *iocb, struct socket *sock,
        }
 
 
-       dev = dev_get_by_index(sk->sk_net, ifindex);
+       dev = dev_get_by_index(sock_net(sk), ifindex);
        err = -ENXIO;
        if (dev == NULL)
                goto out_unlock;
@@ -800,7 +800,7 @@ static int packet_release(struct socket *sock)
        if (!sk)
                return 0;
 
-       net = sk->sk_net;
+       net = sock_net(sk);
        po = pkt_sk(sk);
 
        write_lock_bh(&net->packet.sklist_lock);
@@ -914,7 +914,7 @@ static int packet_bind_spkt(struct socket *sock, struct sockaddr *uaddr, int add
                return -EINVAL;
        strlcpy(name,uaddr->sa_data,sizeof(name));
 
-       dev = dev_get_by_name(sk->sk_net, name);
+       dev = dev_get_by_name(sock_net(sk), name);
        if (dev) {
                err = packet_do_bind(sk, dev, pkt_sk(sk)->num);
                dev_put(dev);
@@ -941,7 +941,7 @@ static int packet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len
 
        if (sll->sll_ifindex) {
                err = -ENODEV;
-               dev = dev_get_by_index(sk->sk_net, sll->sll_ifindex);
+               dev = dev_get_by_index(sock_net(sk), sll->sll_ifindex);
                if (dev == NULL)
                        goto out;
        }
@@ -1135,7 +1135,7 @@ static int packet_getname_spkt(struct socket *sock, struct sockaddr *uaddr,
                return -EOPNOTSUPP;
 
        uaddr->sa_family = AF_PACKET;
-       dev = dev_get_by_index(sk->sk_net, pkt_sk(sk)->ifindex);
+       dev = dev_get_by_index(sock_net(sk), pkt_sk(sk)->ifindex);
        if (dev) {
                strlcpy(uaddr->sa_data, dev->name, 15);
                dev_put(dev);
@@ -1160,7 +1160,7 @@ static int packet_getname(struct socket *sock, struct sockaddr *uaddr,
        sll->sll_family = AF_PACKET;
        sll->sll_ifindex = po->ifindex;
        sll->sll_protocol = po->num;
-       dev = dev_get_by_index(sk->sk_net, po->ifindex);
+       dev = dev_get_by_index(sock_net(sk), po->ifindex);
        if (dev) {
                sll->sll_hatype = dev->type;
                sll->sll_halen = dev->addr_len;
@@ -1212,7 +1212,7 @@ static int packet_mc_add(struct sock *sk, struct packet_mreq_max *mreq)
        rtnl_lock();
 
        err = -ENODEV;
-       dev = __dev_get_by_index(sk->sk_net, mreq->mr_ifindex);
+       dev = __dev_get_by_index(sock_net(sk), mreq->mr_ifindex);
        if (!dev)
                goto done;
 
@@ -1266,7 +1266,7 @@ static int packet_mc_drop(struct sock *sk, struct packet_mreq_max *mreq)
                        if (--ml->count == 0) {
                                struct net_device *dev;
                                *mlp = ml->next;
-                               dev = dev_get_by_index(sk->sk_net, ml->ifindex);
+                               dev = dev_get_by_index(sock_net(sk), ml->ifindex);
                                if (dev) {
                                        packet_dev_mc(dev, ml, -1);
                                        dev_put(dev);
@@ -1294,7 +1294,7 @@ static void packet_flush_mclist(struct sock *sk)
                struct net_device *dev;
 
                po->mclist = ml->next;
-               if ((dev = dev_get_by_index(sk->sk_net, ml->ifindex)) != NULL) {
+               if ((dev = dev_get_by_index(sock_net(sk), ml->ifindex)) != NULL) {
                        packet_dev_mc(dev, ml, -1);
                        dev_put(dev);
                }
@@ -1450,7 +1450,7 @@ static int packet_notifier(struct notifier_block *this, unsigned long msg, void
        struct sock *sk;
        struct hlist_node *node;
        struct net_device *dev = data;
-       struct net *net = dev->nd_net;
+       struct net *net = dev_net(dev);
 
        read_lock(&net->packet.sklist_lock);
        sk_for_each(sk, node, &net->packet.sklist) {
@@ -1540,7 +1540,7 @@ static int packet_ioctl(struct socket *sock, unsigned int cmd,
                case SIOCGIFDSTADDR:
                case SIOCSIFDSTADDR:
                case SIOCSIFFLAGS:
-                       if (sk->sk_net != &init_net)
+                       if (sock_net(sk) != &init_net)
                                return -ENOIOCTLCMD;
                        return inet_dgram_ops.ioctl(sock, cmd, arg);
 #endif
index 4a31a81059abb93a34c176d14e41b33e1f2e6fd8..92d85c38e4d26d2f84f7acc9cf8a9cc2973bd902 100644 (file)
@@ -197,7 +197,7 @@ static int rose_device_event(struct notifier_block *this, unsigned long event,
 {
        struct net_device *dev = (struct net_device *)ptr;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        if (event != NETDEV_DOWN)
@@ -551,7 +551,7 @@ static struct sock *rose_make_new(struct sock *osk)
        if (osk->sk_type != SOCK_SEQPACKET)
                return NULL;
 
-       sk = sk_alloc(osk->sk_net, PF_ROSE, GFP_ATOMIC, &rose_proto);
+       sk = sk_alloc(sock_net(osk), PF_ROSE, GFP_ATOMIC, &rose_proto);
        if (sk == NULL)
                return NULL;
 
index 0b8eb235bc136fff1eeb349f72c549a5ce4df3df..74e662cbb2c5b7a61a1c0815a358899c6abc694a 100644 (file)
@@ -951,7 +951,7 @@ done:
 
 static int tc_ctl_action(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct nlattr *tca[TCA_ACT_MAX + 1];
        u32 pid = skb ? NETLINK_CB(skb).pid : 0;
        int ret = 0, ovr = 0;
@@ -1029,7 +1029,7 @@ find_dump_kind(struct nlmsghdr *n)
 static int
 tc_dump_action(struct sk_buff *skb, struct netlink_callback *cb)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct nlmsghdr *nlh;
        unsigned char *b = skb_tail_pointer(skb);
        struct nlattr *nest;
index 0fbedcabf1110759c41117253ae7cc73d6f7a768..1086df7478bcee1309702022c7824403e9fbd47c 100644 (file)
@@ -118,7 +118,7 @@ static inline u32 tcf_auto_prio(struct tcf_proto *tp)
 
 static int tc_ctl_tfilter(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct nlattr *tca[TCA_MAX + 1];
        struct tcmsg *t;
        u32 protocol;
@@ -389,7 +389,7 @@ static int tcf_node_dump(struct tcf_proto *tp, unsigned long n,
 
 static int tc_dump_tfilter(struct sk_buff *skb, struct netlink_callback *cb)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        int t;
        int s_t;
        struct net_device *dev;
index 7e3c048ba9b1f1421d74435608924d77d36b50f4..15b91a9ee8e83af22fb8edcd475b8ba94ce3e8da 100644 (file)
@@ -605,7 +605,7 @@ check_loop_fn(struct Qdisc *q, unsigned long cl, struct qdisc_walker *w)
 
 static int tc_get_qdisc(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct tcmsg *tcm = NLMSG_DATA(n);
        struct nlattr *tca[TCA_MAX + 1];
        struct net_device *dev;
@@ -674,7 +674,7 @@ static int tc_get_qdisc(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
 
 static int tc_modify_qdisc(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct tcmsg *tcm;
        struct nlattr *tca[TCA_MAX + 1];
        struct net_device *dev;
@@ -893,7 +893,7 @@ err_out:
 
 static int tc_dump_qdisc(struct sk_buff *skb, struct netlink_callback *cb)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        int idx, q_idx;
        int s_idx, s_q_idx;
        struct net_device *dev;
@@ -945,7 +945,7 @@ done:
 
 static int tc_ctl_tclass(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        struct tcmsg *tcm = NLMSG_DATA(n);
        struct nlattr *tca[TCA_MAX + 1];
        struct net_device *dev;
@@ -1139,7 +1139,7 @@ static int qdisc_class_dump(struct Qdisc *q, unsigned long cl, struct qdisc_walk
 
 static int tc_dump_tclass(struct sk_buff *skb, struct netlink_callback *cb)
 {
-       struct net *net = skb->sk->sk_net;
+       struct net *net = sock_net(skb->sk);
        int t;
        int s_t;
        struct net_device *dev;
index dc71d0d837539be10162edaf6f99fe5f1d920761..036bfcc8d15b748d6b0f242f7cc35a920eadfeb3 100644 (file)
@@ -636,7 +636,7 @@ static struct sock *sctp_v6_create_accept_sk(struct sock *sk,
        struct ipv6_pinfo *newnp, *np = inet6_sk(sk);
        struct sctp6_sock *newsctp6sk;
 
-       newsk = sk_alloc(sk->sk_net, PF_INET6, GFP_KERNEL, sk->sk_prot);
+       newsk = sk_alloc(sock_net(sk), PF_INET6, GFP_KERNEL, sk->sk_prot);
        if (!newsk)
                goto out;
 
index beea2fb18b157f5903f5618ccf1952184cc7ede8..5aea91137fbb3c8760dc210b72b74b09930a8218 100644 (file)
@@ -554,7 +554,7 @@ static struct sock *sctp_v4_create_accept_sk(struct sock *sk,
 {
        struct inet_sock *inet = inet_sk(sk);
        struct inet_sock *newinet;
-       struct sock *newsk = sk_alloc(sk->sk_net, PF_INET, GFP_KERNEL,
+       struct sock *newsk = sk_alloc(sock_net(sk), PF_INET, GFP_KERNEL,
                        sk->sk_prot);
 
        if (!newsk)
@@ -630,7 +630,7 @@ static int sctp_inetaddr_event(struct notifier_block *this, unsigned long ev,
        struct sctp_sockaddr_entry *temp;
        int found = 0;
 
-       if (ifa->ifa_dev->dev->nd_net != &init_net)
+       if (dev_net(ifa->ifa_dev->dev) != &init_net)
                return NOTIFY_DONE;
 
        switch (ev) {
index 9d3fbfbc8535c8b3f2e0639990098730ba4ecbc7..79e5382fd11060110bf37aa89f07b736d41821f4 100644 (file)
@@ -857,7 +857,7 @@ static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
 
        sock = file->private_data;
        sk = sock->sk;
-       net = sk->sk_net;
+       net = sock_net(sk);
        if (cmd >= SIOCDEVPRIVATE && cmd <= (SIOCDEVPRIVATE + 15)) {
                err = dev_ioctl(net, cmd, argp);
        } else
@@ -1375,7 +1375,7 @@ asmlinkage long sys_listen(int fd, int backlog)
 
        sock = sockfd_lookup_light(fd, &err, &fput_needed);
        if (sock) {
-               somaxconn = sock->sk->sk_net->sysctl_somaxconn;
+               somaxconn = sock_net(sock->sk)->sysctl_somaxconn;
                if ((unsigned)backlog > somaxconn)
                        backlog = somaxconn;
 
index 3bbef2ab22ae8c6ead19093ee0bcebbf0efc04c1..9cd35eec3e7fe4f39ae59e209b8b20f1fb3dfb3b 100644 (file)
@@ -101,7 +101,7 @@ static int recv_msg(struct sk_buff *buf, struct net_device *dev,
        struct eth_bearer *eb_ptr = (struct eth_bearer *)pt->af_packet_priv;
        u32 size;
 
-       if (dev->nd_net != &init_net) {
+       if (dev_net(dev) != &init_net) {
                kfree_skb(buf);
                return 0;
        }
@@ -198,7 +198,7 @@ static int recv_notification(struct notifier_block *nb, unsigned long evt,
        struct eth_bearer *eb_ptr = &eth_bearers[0];
        struct eth_bearer *stop = &eth_bearers[MAX_ETH_BEARERS];
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        while ((eb_ptr->dev != dev)) {
index 3220d5cb5b5d3d14d9192fe2d6d2443565fe64fe..ae45df060e3a793702a8490b4835d9c8e3e5ea6c 100644 (file)
@@ -1375,7 +1375,7 @@ static int accept(struct socket *sock, struct socket *newsock, int flags)
        }
        buf = skb_peek(&sock->sk->sk_receive_queue);
 
-       res = tipc_create(sock->sk->sk_net, newsock, 0);
+       res = tipc_create(sock_net(sock->sk), newsock, 0);
        if (!res) {
                struct tipc_sock *new_tsock = tipc_sk(newsock->sk);
                struct tipc_portid id;
index ae584356852cc4f5a46a83485ef135d2d3836b12..50bbf6bb1a224f8ecb3114990fa400c137efad82 100644 (file)
@@ -252,7 +252,7 @@ static struct sock *__unix_find_socket_byname(struct net *net,
        sk_for_each(s, node, &unix_socket_table[hash ^ type]) {
                struct unix_sock *u = unix_sk(s);
 
-               if (s->sk_net != net)
+               if (!net_eq(sock_net(s), net))
                        continue;
 
                if (u->addr->len == len &&
@@ -289,7 +289,7 @@ static struct sock *unix_find_socket_byinode(struct net *net, struct inode *i)
                    &unix_socket_table[i->i_ino & (UNIX_HASH_SIZE - 1)]) {
                struct dentry *dentry = unix_sk(s)->dentry;
 
-               if (s->sk_net != net)
+               if (!net_eq(sock_net(s), net))
                        continue;
 
                if(dentry && dentry->d_inode == i)
@@ -654,7 +654,7 @@ static int unix_release(struct socket *sock)
 static int unix_autobind(struct socket *sock)
 {
        struct sock *sk = sock->sk;
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
        struct unix_sock *u = unix_sk(sk);
        static u32 ordernum = 1;
        struct unix_address * addr;
@@ -758,7 +758,7 @@ fail:
 static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
 {
        struct sock *sk = sock->sk;
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
        struct unix_sock *u = unix_sk(sk);
        struct sockaddr_un *sunaddr=(struct sockaddr_un *)uaddr;
        struct dentry * dentry = NULL;
@@ -899,7 +899,7 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr,
                              int alen, int flags)
 {
        struct sock *sk = sock->sk;
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
        struct sockaddr_un *sunaddr=(struct sockaddr_un*)addr;
        struct sock *other;
        unsigned hash;
@@ -996,7 +996,7 @@ static int unix_stream_connect(struct socket *sock, struct sockaddr *uaddr,
 {
        struct sockaddr_un *sunaddr=(struct sockaddr_un *)uaddr;
        struct sock *sk = sock->sk;
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
        struct unix_sock *u = unix_sk(sk), *newu, *otheru;
        struct sock *newsk = NULL;
        struct sock *other = NULL;
@@ -1025,7 +1025,7 @@ static int unix_stream_connect(struct socket *sock, struct sockaddr *uaddr,
        err = -ENOMEM;
 
        /* create new sock for complete connection */
-       newsk = unix_create1(sk->sk_net, NULL);
+       newsk = unix_create1(sock_net(sk), NULL);
        if (newsk == NULL)
                goto out;
 
@@ -1312,7 +1312,7 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock,
 {
        struct sock_iocb *siocb = kiocb_to_siocb(kiocb);
        struct sock *sk = sock->sk;
-       struct net *net = sk->sk_net;
+       struct net *net = sock_net(sk);
        struct unix_sock *u = unix_sk(sk);
        struct sockaddr_un *sunaddr=msg->msg_name;
        struct sock *other = NULL;
@@ -2016,13 +2016,14 @@ struct unix_iter_state {
        struct seq_net_private p;
        int i;
 };
-static struct sock *unix_seq_idx(struct unix_iter_state *iter, loff_t pos)
+static struct sock *unix_seq_idx(struct seq_file *seq, loff_t pos)
 {
+       struct unix_iter_state *iter = seq->private;
        loff_t off = 0;
        struct sock *s;
 
        for (s = first_unix_socket(&iter->i); s; s = next_unix_socket(&iter->i, s)) {
-               if (s->sk_net != iter->p.net)
+               if (sock_net(s) != seq_file_net(seq))
                        continue;
                if (off == pos)
                        return s;
@@ -2035,9 +2036,8 @@ static struct sock *unix_seq_idx(struct unix_iter_state *iter, loff_t pos)
 static void *unix_seq_start(struct seq_file *seq, loff_t *pos)
        __acquires(unix_table_lock)
 {
-       struct unix_iter_state *iter = seq->private;
        spin_lock(&unix_table_lock);
-       return *pos ? unix_seq_idx(iter, *pos - 1) : ((void *) 1);
+       return *pos ? unix_seq_idx(seq, *pos - 1) : ((void *) 1);
 }
 
 static void *unix_seq_next(struct seq_file *seq, void *v, loff_t *pos)
@@ -2050,7 +2050,7 @@ static void *unix_seq_next(struct seq_file *seq, void *v, loff_t *pos)
                sk = first_unix_socket(&iter->i);
        else
                sk = next_unix_socket(&iter->i, sk);
-       while (sk && (sk->sk_net != iter->p.net))
+       while (sk && (sock_net(sk) != seq_file_net(seq)))
                sk = next_unix_socket(&iter->i, sk);
        return sk;
 }
index 2c569b63e7d8f07dfca46b9e56c463d0bf13dd5b..947188a5b937ed96d71afbf81997211102bae071 100644 (file)
@@ -1157,7 +1157,7 @@ static void rtmsg_iwinfo(struct net_device *dev, char *event, int event_len)
        struct sk_buff *skb;
        int err;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return;
 
        skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
index 339ca4a8e89ed262295fa1851770e34a03a86738..6ba67c523c16d54f1976dddb12619b21df4eb92a 100644 (file)
@@ -191,7 +191,7 @@ static int x25_device_event(struct notifier_block *this, unsigned long event,
        struct net_device *dev = ptr;
        struct x25_neigh *nb;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        if (dev->type == ARPHRD_X25
@@ -549,7 +549,7 @@ static struct sock *x25_make_new(struct sock *osk)
        if (osk->sk_type != SOCK_SEQPACKET)
                goto out;
 
-       if ((sk = x25_alloc_socket(osk->sk_net)) == NULL)
+       if ((sk = x25_alloc_socket(sock_net(osk))) == NULL)
                goto out;
 
        x25 = x25_sk(sk);
index f0679d283110885e4e7f29f7358e07df3c753e49..3ff206c0ae945759e1e38fd4b287fb966a0354e1 100644 (file)
@@ -95,7 +95,7 @@ int x25_lapb_receive_frame(struct sk_buff *skb, struct net_device *dev,
        struct sk_buff *nskb;
        struct x25_neigh *nb;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                goto drop;
 
        nskb = skb_copy(skb, GFP_ATOMIC);
index 8e588f20c60c5988238043afcc446a1888cc0772..15d73e47cc2c6ee2241453362f8b2b5af715bb9f 100644 (file)
@@ -2079,7 +2079,7 @@ static int stale_bundle(struct dst_entry *dst)
 void xfrm_dst_ifdown(struct dst_entry *dst, struct net_device *dev)
 {
        while ((dst = dst->child) && dst->xfrm && dst->dev == dev) {
-               dst->dev = dev->nd_net->loopback_dev;
+               dst->dev = dev_net(dev)->loopback_dev;
                dev_hold(dst->dev);
                dev_put(dev);
        }
@@ -2350,7 +2350,7 @@ static int xfrm_dev_event(struct notifier_block *this, unsigned long event, void
 {
        struct net_device *dev = ptr;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        switch (event) {
index 013d3117a86b78ef57a159bf41de4d360c499029..9c8a82aa8baf17b2bdcf01e822a243c8d3a0d8c1 100644 (file)
@@ -281,7 +281,7 @@ static int sel_netif_netdev_notifier_handler(struct notifier_block *this,
 {
        struct net_device *dev = ptr;
 
-       if (dev->nd_net != &init_net)
+       if (dev_net(dev) != &init_net)
                return NOTIFY_DONE;
 
        if (event == NETDEV_DOWN)