aboutsummaryrefslogtreecommitdiffstats
path: root/include/net/sock.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/net/sock.h')
-rw-r--r--include/net/sock.h118
1 files changed, 51 insertions, 67 deletions
diff --git a/include/net/sock.h b/include/net/sock.h
index fd9876087651..dc42b44c2aa1 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -47,7 +47,6 @@
47#include <linux/module.h> 47#include <linux/module.h>
48#include <linux/lockdep.h> 48#include <linux/lockdep.h>
49#include <linux/netdevice.h> 49#include <linux/netdevice.h>
50#include <linux/pcounter.h>
51#include <linux/skbuff.h> /* struct sk_buff */ 50#include <linux/skbuff.h> /* struct sk_buff */
52#include <linux/mm.h> 51#include <linux/mm.h>
53#include <linux/security.h> 52#include <linux/security.h>
@@ -70,7 +69,11 @@
70#define SOCK_DEBUG(sk, msg...) do { if ((sk) && sock_flag((sk), SOCK_DBG)) \ 69#define SOCK_DEBUG(sk, msg...) do { if ((sk) && sock_flag((sk), SOCK_DBG)) \
71 printk(KERN_DEBUG msg); } while (0) 70 printk(KERN_DEBUG msg); } while (0)
72#else 71#else
73#define SOCK_DEBUG(sk, msg...) do { } while (0) 72/* Validate arguments and do nothing */
73static void inline int __attribute__ ((format (printf, 2, 3)))
74SOCK_DEBUG(struct sock *sk, const char *msg, ...)
75{
76}
74#endif 77#endif
75 78
76/* This is the per-socket lock. The spinlock provides a synchronization 79/* This is the per-socket lock. The spinlock provides a synchronization
@@ -122,7 +125,9 @@ struct sock_common {
122 atomic_t skc_refcnt; 125 atomic_t skc_refcnt;
123 unsigned int skc_hash; 126 unsigned int skc_hash;
124 struct proto *skc_prot; 127 struct proto *skc_prot;
128#ifdef CONFIG_NET_NS
125 struct net *skc_net; 129 struct net *skc_net;
130#endif
126}; 131};
127 132
128/** 133/**
@@ -151,6 +156,7 @@ struct sock_common {
151 * @sk_no_check: %SO_NO_CHECK setting, wether or not checkup packets 156 * @sk_no_check: %SO_NO_CHECK setting, wether or not checkup packets
152 * @sk_route_caps: route capabilities (e.g. %NETIF_F_TSO) 157 * @sk_route_caps: route capabilities (e.g. %NETIF_F_TSO)
153 * @sk_gso_type: GSO type (e.g. %SKB_GSO_TCPV4) 158 * @sk_gso_type: GSO type (e.g. %SKB_GSO_TCPV4)
159 * @sk_gso_max_size: Maximum GSO segment size to build
154 * @sk_lingertime: %SO_LINGER l_linger setting 160 * @sk_lingertime: %SO_LINGER l_linger setting
155 * @sk_backlog: always used with the per-socket spinlock held 161 * @sk_backlog: always used with the per-socket spinlock held
156 * @sk_callback_lock: used with the callbacks in the end of this struct 162 * @sk_callback_lock: used with the callbacks in the end of this struct
@@ -237,6 +243,7 @@ struct sock {
237 gfp_t sk_allocation; 243 gfp_t sk_allocation;
238 int sk_route_caps; 244 int sk_route_caps;
239 int sk_gso_type; 245 int sk_gso_type;
246 unsigned int sk_gso_max_size;
240 int sk_rcvlowat; 247 int sk_rcvlowat;
241 unsigned long sk_flags; 248 unsigned long sk_flags;
242 unsigned long sk_lingertime; 249 unsigned long sk_lingertime;
@@ -498,6 +505,7 @@ extern int sk_wait_data(struct sock *sk, long *timeo);
498struct request_sock_ops; 505struct request_sock_ops;
499struct timewait_sock_ops; 506struct timewait_sock_ops;
500struct inet_hashinfo; 507struct inet_hashinfo;
508struct raw_hashinfo;
501 509
502/* Networking protocol blocks we attach to sockets. 510/* Networking protocol blocks we attach to sockets.
503 * socket layer -> transport layer interface 511 * socket layer -> transport layer interface
@@ -553,7 +561,7 @@ struct proto {
553 561
554 /* Keeping track of sockets in use */ 562 /* Keeping track of sockets in use */
555#ifdef CONFIG_PROC_FS 563#ifdef CONFIG_PROC_FS
556 struct pcounter inuse; 564 unsigned int inuse_idx;
557#endif 565#endif
558 566
559 /* Memory pressure */ 567 /* Memory pressure */
@@ -580,7 +588,11 @@ struct proto {
580 struct request_sock_ops *rsk_prot; 588 struct request_sock_ops *rsk_prot;
581 struct timewait_sock_ops *twsk_prot; 589 struct timewait_sock_ops *twsk_prot;
582 590
583 struct inet_hashinfo *hashinfo; 591 union {
592 struct inet_hashinfo *hashinfo;
593 struct hlist_head *udp_hash;
594 struct raw_hashinfo *raw_hash;
595 } h;
584 596
585 struct module *owner; 597 struct module *owner;
586 598
@@ -622,36 +634,12 @@ static inline void sk_refcnt_debug_release(const struct sock *sk)
622 634
623 635
624#ifdef CONFIG_PROC_FS 636#ifdef CONFIG_PROC_FS
625# define DEFINE_PROTO_INUSE(NAME) DEFINE_PCOUNTER(NAME)
626# define REF_PROTO_INUSE(NAME) PCOUNTER_MEMBER_INITIALIZER(NAME, .inuse)
627/* Called with local bh disabled */ 637/* Called with local bh disabled */
628static inline void sock_prot_inuse_add(struct proto *prot, int inc) 638extern void sock_prot_inuse_add(struct net *net, struct proto *prot, int inc);
629{ 639extern int sock_prot_inuse_get(struct net *net, struct proto *proto);
630 pcounter_add(&prot->inuse, inc);
631}
632static inline int sock_prot_inuse_init(struct proto *proto)
633{
634 return pcounter_alloc(&proto->inuse);
635}
636static inline int sock_prot_inuse_get(struct proto *proto)
637{
638 return pcounter_getval(&proto->inuse);
639}
640static inline void sock_prot_inuse_free(struct proto *proto)
641{
642 pcounter_free(&proto->inuse);
643}
644#else 640#else
645# define DEFINE_PROTO_INUSE(NAME) 641static void inline sock_prot_inuse_add(struct net *net, struct proto *prot,
646# define REF_PROTO_INUSE(NAME) 642 int inc)
647static void inline sock_prot_inuse_add(struct proto *prot, int inc)
648{
649}
650static int inline sock_prot_inuse_init(struct proto *proto)
651{
652 return 0;
653}
654static void inline sock_prot_inuse_free(struct proto *proto)
655{ 643{
656} 644}
657#endif 645#endif
@@ -850,6 +838,7 @@ extern struct sock *sk_alloc(struct net *net, int family,
850 gfp_t priority, 838 gfp_t priority,
851 struct proto *prot); 839 struct proto *prot);
852extern void sk_free(struct sock *sk); 840extern void sk_free(struct sock *sk);
841extern void sk_release_kernel(struct sock *sk);
853extern struct sock *sk_clone(const struct sock *sk, 842extern struct sock *sk_clone(const struct sock *sk,
854 const gfp_t priority); 843 const gfp_t priority);
855 844
@@ -939,41 +928,6 @@ extern void sk_common_release(struct sock *sk);
939extern void sock_init_data(struct socket *sock, struct sock *sk); 928extern void sock_init_data(struct socket *sock, struct sock *sk);
940 929
941/** 930/**
942 * sk_filter - run a packet through a socket filter
943 * @sk: sock associated with &sk_buff
944 * @skb: buffer to filter
945 * @needlock: set to 1 if the sock is not locked by caller.
946 *
947 * Run the filter code and then cut skb->data to correct size returned by
948 * sk_run_filter. If pkt_len is 0 we toss packet. If skb->len is smaller
949 * than pkt_len we keep whole skb->data. This is the socket level
950 * wrapper to sk_run_filter. It returns 0 if the packet should
951 * be accepted or -EPERM if the packet should be tossed.
952 *
953 */
954
955static inline int sk_filter(struct sock *sk, struct sk_buff *skb)
956{
957 int err;
958 struct sk_filter *filter;
959
960 err = security_sock_rcv_skb(sk, skb);
961 if (err)
962 return err;
963
964 rcu_read_lock_bh();
965 filter = rcu_dereference(sk->sk_filter);
966 if (filter) {
967 unsigned int pkt_len = sk_run_filter(skb, filter->insns,
968 filter->len);
969 err = pkt_len ? pskb_trim(skb, pkt_len) : -EPERM;
970 }
971 rcu_read_unlock_bh();
972
973 return err;
974}
975
976/**
977 * sk_filter_release: Release a socket filter 931 * sk_filter_release: Release a socket filter
978 * @sk: socket 932 * @sk: socket
979 * @fp: filter to remove 933 * @fp: filter to remove
@@ -1333,6 +1287,36 @@ static inline void sk_eat_skb(struct sock *sk, struct sk_buff *skb, int copied_e
1333} 1287}
1334#endif 1288#endif
1335 1289
1290static inline
1291struct net *sock_net(const struct sock *sk)
1292{
1293#ifdef CONFIG_NET_NS
1294 return sk->sk_net;
1295#else
1296 return &init_net;
1297#endif
1298}
1299
1300static inline
1301void sock_net_set(struct sock *sk, struct net *net)
1302{
1303#ifdef CONFIG_NET_NS
1304 sk->sk_net = net;
1305#endif
1306}
1307
1308/*
1309 * Kernel sockets, f.e. rtnl or icmp_socket, are a part of a namespace.
1310 * They should not hold a referrence to a namespace in order to allow
1311 * to stop it.
1312 * Sockets after sk_change_net should be released using sk_release_kernel
1313 */
1314static inline void sk_change_net(struct sock *sk, struct net *net)
1315{
1316 put_net(sock_net(sk));
1317 sock_net_set(sk, hold_net(net));
1318}
1319
1336extern void sock_enable_timestamp(struct sock *sk); 1320extern void sock_enable_timestamp(struct sock *sk);
1337extern int sock_get_timestamp(struct sock *, struct timeval __user *); 1321extern int sock_get_timestamp(struct sock *, struct timeval __user *);
1338extern int sock_get_timestampns(struct sock *, struct timespec __user *); 1322extern int sock_get_timestampns(struct sock *, struct timespec __user *);