aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/udp.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/udp.c')
-rw-r--r--net/ipv4/udp.c30
1 files changed, 17 insertions, 13 deletions
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index ebaa96bd3464..ab0966df1e2a 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -1397,6 +1397,8 @@ int udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
1397 nf_reset(skb); 1397 nf_reset(skb);
1398 1398
1399 if (up->encap_type) { 1399 if (up->encap_type) {
1400 int (*encap_rcv)(struct sock *sk, struct sk_buff *skb);
1401
1400 /* 1402 /*
1401 * This is an encapsulation socket so pass the skb to 1403 * This is an encapsulation socket so pass the skb to
1402 * the socket's udp_encap_rcv() hook. Otherwise, just 1404 * the socket's udp_encap_rcv() hook. Otherwise, just
@@ -1409,11 +1411,11 @@ int udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
1409 */ 1411 */
1410 1412
1411 /* if we're overly short, let UDP handle it */ 1413 /* if we're overly short, let UDP handle it */
1412 if (skb->len > sizeof(struct udphdr) && 1414 encap_rcv = ACCESS_ONCE(up->encap_rcv);
1413 up->encap_rcv != NULL) { 1415 if (skb->len > sizeof(struct udphdr) && encap_rcv != NULL) {
1414 int ret; 1416 int ret;
1415 1417
1416 ret = (*up->encap_rcv)(sk, skb); 1418 ret = encap_rcv(sk, skb);
1417 if (ret <= 0) { 1419 if (ret <= 0) {
1418 UDP_INC_STATS_BH(sock_net(sk), 1420 UDP_INC_STATS_BH(sock_net(sk),
1419 UDP_MIB_INDATAGRAMS, 1421 UDP_MIB_INDATAGRAMS,
@@ -2037,7 +2039,7 @@ static void udp_seq_stop(struct seq_file *seq, void *v)
2037 spin_unlock_bh(&state->udp_table->hash[state->bucket].lock); 2039 spin_unlock_bh(&state->udp_table->hash[state->bucket].lock);
2038} 2040}
2039 2041
2040static int udp_seq_open(struct inode *inode, struct file *file) 2042int udp_seq_open(struct inode *inode, struct file *file)
2041{ 2043{
2042 struct udp_seq_afinfo *afinfo = PDE(inode)->data; 2044 struct udp_seq_afinfo *afinfo = PDE(inode)->data;
2043 struct udp_iter_state *s; 2045 struct udp_iter_state *s;
@@ -2053,6 +2055,7 @@ static int udp_seq_open(struct inode *inode, struct file *file)
2053 s->udp_table = afinfo->udp_table; 2055 s->udp_table = afinfo->udp_table;
2054 return err; 2056 return err;
2055} 2057}
2058EXPORT_SYMBOL(udp_seq_open);
2056 2059
2057/* ------------------------------------------------------------------------ */ 2060/* ------------------------------------------------------------------------ */
2058int udp_proc_register(struct net *net, struct udp_seq_afinfo *afinfo) 2061int udp_proc_register(struct net *net, struct udp_seq_afinfo *afinfo)
@@ -2060,17 +2063,12 @@ int udp_proc_register(struct net *net, struct udp_seq_afinfo *afinfo)
2060 struct proc_dir_entry *p; 2063 struct proc_dir_entry *p;
2061 int rc = 0; 2064 int rc = 0;
2062 2065
2063 afinfo->seq_fops.open = udp_seq_open;
2064 afinfo->seq_fops.read = seq_read;
2065 afinfo->seq_fops.llseek = seq_lseek;
2066 afinfo->seq_fops.release = seq_release_net;
2067
2068 afinfo->seq_ops.start = udp_seq_start; 2066 afinfo->seq_ops.start = udp_seq_start;
2069 afinfo->seq_ops.next = udp_seq_next; 2067 afinfo->seq_ops.next = udp_seq_next;
2070 afinfo->seq_ops.stop = udp_seq_stop; 2068 afinfo->seq_ops.stop = udp_seq_stop;
2071 2069
2072 p = proc_create_data(afinfo->name, S_IRUGO, net->proc_net, 2070 p = proc_create_data(afinfo->name, S_IRUGO, net->proc_net,
2073 &afinfo->seq_fops, afinfo); 2071 afinfo->seq_fops, afinfo);
2074 if (!p) 2072 if (!p)
2075 rc = -ENOMEM; 2073 rc = -ENOMEM;
2076 return rc; 2074 return rc;
@@ -2120,14 +2118,20 @@ int udp4_seq_show(struct seq_file *seq, void *v)
2120 return 0; 2118 return 0;
2121} 2119}
2122 2120
2121static const struct file_operations udp_afinfo_seq_fops = {
2122 .owner = THIS_MODULE,
2123 .open = udp_seq_open,
2124 .read = seq_read,
2125 .llseek = seq_lseek,
2126 .release = seq_release_net
2127};
2128
2123/* ------------------------------------------------------------------------ */ 2129/* ------------------------------------------------------------------------ */
2124static struct udp_seq_afinfo udp4_seq_afinfo = { 2130static struct udp_seq_afinfo udp4_seq_afinfo = {
2125 .name = "udp", 2131 .name = "udp",
2126 .family = AF_INET, 2132 .family = AF_INET,
2127 .udp_table = &udp_table, 2133 .udp_table = &udp_table,
2128 .seq_fops = { 2134 .seq_fops = &udp_afinfo_seq_fops,
2129 .owner = THIS_MODULE,
2130 },
2131 .seq_ops = { 2135 .seq_ops = {
2132 .show = udp4_seq_show, 2136 .show = udp4_seq_show,
2133 }, 2137 },