Phonet: implement GPRS virtual interface over PEP socket
[safe/jmp/linux-2.6] / include / net / udp.h
index 496f89d..d38f6f2 100644 (file)
@@ -65,6 +65,13 @@ extern rwlock_t udp_hash_lock;
 
 extern struct proto udp_prot;
 
+extern atomic_t udp_memory_allocated;
+
+/* sysctl variables for udp */
+extern int sysctl_udp_mem[3];
+extern int sysctl_udp_rmem_min;
+extern int sysctl_udp_wmem_min;
+
 struct sk_buff;
 
 /*
@@ -108,7 +115,7 @@ static inline void udp_lib_unhash(struct sock *sk)
        write_lock_bh(&udp_hash_lock);
        if (sk_del_node_init(sk)) {
                inet_sk(sk)->num = 0;
-               sock_prot_dec_use(sk->sk_prot);
+               sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
        }
        write_unlock_bh(&udp_hash_lock);
 }
@@ -118,21 +125,17 @@ static inline void udp_lib_close(struct sock *sk, long timeout)
        sk_common_release(sk);
 }
 
-
-struct udp_get_port_ops {
-       int (*saddr_cmp)(const struct sock *sk1, const struct sock *sk2);
-       int (*saddr_any)(const struct sock *sk);
-       unsigned int (*hash_port_and_rcv_saddr)(__u16 port,
-                                               const struct sock *sk);
-};
+extern int     udp_lib_get_port(struct sock *sk, unsigned short snum,
+               int (*)(const struct sock*,const struct sock*));
 
 /* net/ipv4/udp.c */
 extern int     udp_get_port(struct sock *sk, unsigned short snum,
-                            const struct udp_get_port_ops *ops);
+                            int (*saddr_cmp)(const struct sock *, const struct sock *));
 extern void    udp_err(struct sk_buff *, u32);
 
 extern int     udp_sendmsg(struct kiocb *iocb, struct sock *sk,
                            struct msghdr *msg, size_t len);
+extern void    udp_flush_pending_frames(struct sock *sk);
 
 extern int     udp_rcv(struct sk_buff *skb);
 extern int     udp_ioctl(struct sock *sk, int cmd, unsigned long arg);
@@ -145,39 +148,67 @@ extern int        udp_lib_setsockopt(struct sock *sk, int level, int optname,
                                   char __user *optval, int optlen,
                                   int (*push_pending_frames)(struct sock *));
 
-DECLARE_SNMP_STAT(struct udp_mib, udp_statistics);
+extern struct sock *udp4_lib_lookup(struct net *net, __be32 saddr, __be16 sport,
+                                   __be32 daddr, __be16 dport,
+                                   int dif);
+
+DECLARE_SNMP_STAT(struct udp_mib, udp_stats_in6);
+
+/* UDP-Lite does not have a standardized MIB yet, so we inherit from UDP */
+DECLARE_SNMP_STAT(struct udp_mib, udplite_stats_in6);
+
 /*
  *     SNMP statistics for UDP and UDP-Lite
  */
-#define UDP_INC_STATS_USER(field, is_udplite)                         do {   \
-       if (is_udplite) SNMP_INC_STATS_USER(udplite_statistics, field);       \
-       else            SNMP_INC_STATS_USER(udp_statistics, field);  }  while(0)
-#define UDP_INC_STATS_BH(field, is_udplite)                           do  {  \
-       if (is_udplite) SNMP_INC_STATS_BH(udplite_statistics, field);         \
-       else            SNMP_INC_STATS_BH(udp_statistics, field);    }  while(0)
+#define UDP_INC_STATS_USER(net, field, is_udplite)           do { \
+       if (is_udplite) SNMP_INC_STATS_USER((net)->mib.udplite_statistics, field);       \
+       else            SNMP_INC_STATS_USER((net)->mib.udp_statistics, field);  }  while(0)
+#define UDP_INC_STATS_BH(net, field, is_udplite)             do { \
+       if (is_udplite) SNMP_INC_STATS_BH((net)->mib.udplite_statistics, field);         \
+       else            SNMP_INC_STATS_BH((net)->mib.udp_statistics, field);    }  while(0)
+
+#define UDP6_INC_STATS_BH(net, field, is_udplite)          do { (void)net;  \
+       if (is_udplite) SNMP_INC_STATS_BH(udplite_stats_in6, field);         \
+       else            SNMP_INC_STATS_BH(udp_stats_in6, field);    } while(0)
+#define UDP6_INC_STATS_USER(net, field, is_udplite)        do { (void)net;    \
+       if (is_udplite) SNMP_INC_STATS_USER(udplite_stats_in6, field);         \
+       else            SNMP_INC_STATS_USER(udp_stats_in6, field);    } while(0)
+
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+#define UDPX_INC_STATS_BH(sk, field) \
+       do { \
+               if ((sk)->sk_family == AF_INET) \
+                       UDP_INC_STATS_BH(sock_net(sk), field, 0); \
+               else \
+                       UDP6_INC_STATS_BH(sock_net(sk), field, 0); \
+       } while (0);
+#else
+#define UDPX_INC_STATS_BH(sk, field) UDP_INC_STATS_BH(sock_net(sk), field, 0)
+#endif
 
 /* /proc */
 struct udp_seq_afinfo {
-       struct module           *owner;
        char                    *name;
        sa_family_t             family;
        struct hlist_head       *hashtable;
-       int                     (*seq_show) (struct seq_file *m, void *v);
-       struct file_operations  *seq_fops;
+       struct file_operations  seq_fops;
+       struct seq_operations   seq_ops;
 };
 
 struct udp_iter_state {
+       struct seq_net_private  p;
        sa_family_t             family;
-       struct hlist_head       *hashtable;
        int                     bucket;
-       struct seq_operations   seq_ops;
+       struct hlist_head       *hashtable;
 };
 
 #ifdef CONFIG_PROC_FS
-extern int udp_proc_register(struct udp_seq_afinfo *afinfo);
-extern void udp_proc_unregister(struct udp_seq_afinfo *afinfo);
+extern int udp_proc_register(struct net *net, struct udp_seq_afinfo *afinfo);
+extern void udp_proc_unregister(struct net *net, struct udp_seq_afinfo *afinfo);
 
 extern int  udp4_proc_init(void);
 extern void udp4_proc_exit(void);
 #endif
+
+extern void udp_init(void);
 #endif /* _UDP_H */