summaryrefslogtreecommitdiffstats
path: root/net/ipv6
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2019-02-08 08:20:32 -0500
committerTakashi Iwai <tiwai@suse.de>2019-02-08 08:20:32 -0500
commitd02cac152c97dffcb0cdd91e09b54fd6e2cca63d (patch)
tree68e4c6bd842703009f3edbf8f0e0e9326e4b2fad /net/ipv6
parent36e4617c01153757cde9e5fcd375a75a8f8425c3 (diff)
parenta50e32694fbcdbf55875095258b9398e2eabd71f (diff)
Merge tag 'asoc-v5.1' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-next
ASoC: Updates for v5.1 Lots and lots of new drivers so far, a highlight being the MediaTek BTCVSD which is a driver for a Bluetooth radio chip - the first such driver we've had upstream. Hopefully we will soon also see a baseband with an upstream driver! - Support for only powering up channels that are actively being used. - Quite a few improvements to simplify the generic card drivers, especially the merge of the SCU cards into the main generic drivers. - Lots of fixes for probing on Intel systems, trying to rationalize things to look more standard from a framework point of view. - New drivers for Asahi Kasei Microdevices AK4497, Cirrus Logic CS4341, Google ChromeOS embedded controllers, Ingenic JZ4725B, MediaTek BTCVSD, MT8183 and MT6358, NXP MICFIL, Rockchip RK3328, Spreadtrum DMA controllers, Qualcomm WCD9335, Xilinx S/PDIF and PCM formatters.
Diffstat (limited to 'net/ipv6')
-rw-r--r--net/ipv6/addrconf.c8
-rw-r--r--net/ipv6/af_inet6.c14
-rw-r--r--net/ipv6/datagram.c11
-rw-r--r--net/ipv6/fou6.c17
-rw-r--r--net/ipv6/icmp.c8
-rw-r--r--net/ipv6/ip6_gre.c18
-rw-r--r--net/ipv6/route.c14
-rw-r--r--net/ipv6/udp.c26
-rw-r--r--net/ipv6/udp_impl.h1
-rw-r--r--net/ipv6/udplite.c1
10 files changed, 75 insertions, 43 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 8eeec6eb2bd3..84c358804355 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -3495,8 +3495,8 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
3495 3495
3496 if (!addrconf_link_ready(dev)) { 3496 if (!addrconf_link_ready(dev)) {
3497 /* device is not ready yet. */ 3497 /* device is not ready yet. */
3498 pr_info("ADDRCONF(NETDEV_UP): %s: link is not ready\n", 3498 pr_debug("ADDRCONF(NETDEV_UP): %s: link is not ready\n",
3499 dev->name); 3499 dev->name);
3500 break; 3500 break;
3501 } 3501 }
3502 3502
@@ -5120,6 +5120,8 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
5120 if (idev) { 5120 if (idev) {
5121 err = in6_dump_addrs(idev, skb, cb, s_ip_idx, 5121 err = in6_dump_addrs(idev, skb, cb, s_ip_idx,
5122 &fillargs); 5122 &fillargs);
5123 if (err > 0)
5124 err = 0;
5123 } 5125 }
5124 goto put_tgt_net; 5126 goto put_tgt_net;
5125 } 5127 }
@@ -5154,7 +5156,7 @@ put_tgt_net:
5154 if (fillargs.netnsid >= 0) 5156 if (fillargs.netnsid >= 0)
5155 put_net(tgt_net); 5157 put_net(tgt_net);
5156 5158
5157 return err < 0 ? err : skb->len; 5159 return skb->len ? : err;
5158} 5160}
5159 5161
5160static int inet6_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) 5162static int inet6_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c
index 0bfb6cc0a30a..d99753b5e39b 100644
--- a/net/ipv6/af_inet6.c
+++ b/net/ipv6/af_inet6.c
@@ -310,6 +310,7 @@ static int __inet6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len,
310 310
311 /* Check if the address belongs to the host. */ 311 /* Check if the address belongs to the host. */
312 if (addr_type == IPV6_ADDR_MAPPED) { 312 if (addr_type == IPV6_ADDR_MAPPED) {
313 struct net_device *dev = NULL;
313 int chk_addr_ret; 314 int chk_addr_ret;
314 315
315 /* Binding to v4-mapped address on a v6-only socket 316 /* Binding to v4-mapped address on a v6-only socket
@@ -320,9 +321,20 @@ static int __inet6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len,
320 goto out; 321 goto out;
321 } 322 }
322 323
324 rcu_read_lock();
325 if (sk->sk_bound_dev_if) {
326 dev = dev_get_by_index_rcu(net, sk->sk_bound_dev_if);
327 if (!dev) {
328 err = -ENODEV;
329 goto out_unlock;
330 }
331 }
332
323 /* Reproduce AF_INET checks to make the bindings consistent */ 333 /* Reproduce AF_INET checks to make the bindings consistent */
324 v4addr = addr->sin6_addr.s6_addr32[3]; 334 v4addr = addr->sin6_addr.s6_addr32[3];
325 chk_addr_ret = inet_addr_type(net, v4addr); 335 chk_addr_ret = inet_addr_type_dev_table(net, dev, v4addr);
336 rcu_read_unlock();
337
326 if (!inet_can_nonlocal_bind(net, inet) && 338 if (!inet_can_nonlocal_bind(net, inet) &&
327 v4addr != htonl(INADDR_ANY) && 339 v4addr != htonl(INADDR_ANY) &&
328 chk_addr_ret != RTN_LOCAL && 340 chk_addr_ret != RTN_LOCAL &&
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c
index bde08aa549f3..ee4a4e54d016 100644
--- a/net/ipv6/datagram.c
+++ b/net/ipv6/datagram.c
@@ -341,6 +341,7 @@ void ipv6_local_error(struct sock *sk, int err, struct flowi6 *fl6, u32 info)
341 skb_reset_network_header(skb); 341 skb_reset_network_header(skb);
342 iph = ipv6_hdr(skb); 342 iph = ipv6_hdr(skb);
343 iph->daddr = fl6->daddr; 343 iph->daddr = fl6->daddr;
344 ip6_flow_hdr(iph, 0, 0);
344 345
345 serr = SKB_EXT_ERR(skb); 346 serr = SKB_EXT_ERR(skb);
346 serr->ee.ee_errno = err; 347 serr->ee.ee_errno = err;
@@ -700,17 +701,15 @@ void ip6_datagram_recv_specific_ctl(struct sock *sk, struct msghdr *msg,
700 } 701 }
701 if (np->rxopt.bits.rxorigdstaddr) { 702 if (np->rxopt.bits.rxorigdstaddr) {
702 struct sockaddr_in6 sin6; 703 struct sockaddr_in6 sin6;
703 __be16 *ports; 704 __be16 _ports[2], *ports;
704 int end;
705 705
706 end = skb_transport_offset(skb) + 4; 706 ports = skb_header_pointer(skb, skb_transport_offset(skb),
707 if (end <= 0 || pskb_may_pull(skb, end)) { 707 sizeof(_ports), &_ports);
708 if (ports) {
708 /* All current transport protocols have the port numbers in the 709 /* All current transport protocols have the port numbers in the
709 * first four bytes of the transport header and this function is 710 * first four bytes of the transport header and this function is
710 * written with this assumption in mind. 711 * written with this assumption in mind.
711 */ 712 */
712 ports = (__be16 *)skb_transport_header(skb);
713
714 sin6.sin6_family = AF_INET6; 713 sin6.sin6_family = AF_INET6;
715 sin6.sin6_addr = ipv6_hdr(skb)->daddr; 714 sin6.sin6_addr = ipv6_hdr(skb)->daddr;
716 sin6.sin6_port = ports[1]; 715 sin6.sin6_port = ports[1];
diff --git a/net/ipv6/fou6.c b/net/ipv6/fou6.c
index bd675c61deb1..b858bd5280bf 100644
--- a/net/ipv6/fou6.c
+++ b/net/ipv6/fou6.c
@@ -90,10 +90,11 @@ static int gue6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
90{ 90{
91 int transport_offset = skb_transport_offset(skb); 91 int transport_offset = skb_transport_offset(skb);
92 struct guehdr *guehdr; 92 struct guehdr *guehdr;
93 size_t optlen; 93 size_t len, optlen;
94 int ret; 94 int ret;
95 95
96 if (skb->len < sizeof(struct udphdr) + sizeof(struct guehdr)) 96 len = sizeof(struct udphdr) + sizeof(struct guehdr);
97 if (!pskb_may_pull(skb, len))
97 return -EINVAL; 98 return -EINVAL;
98 99
99 guehdr = (struct guehdr *)&udp_hdr(skb)[1]; 100 guehdr = (struct guehdr *)&udp_hdr(skb)[1];
@@ -128,9 +129,21 @@ static int gue6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
128 129
129 optlen = guehdr->hlen << 2; 130 optlen = guehdr->hlen << 2;
130 131
132 if (!pskb_may_pull(skb, len + optlen))
133 return -EINVAL;
134
135 guehdr = (struct guehdr *)&udp_hdr(skb)[1];
131 if (validate_gue_flags(guehdr, optlen)) 136 if (validate_gue_flags(guehdr, optlen))
132 return -EINVAL; 137 return -EINVAL;
133 138
139 /* Handling exceptions for direct UDP encapsulation in GUE would lead to
140 * recursion. Besides, this kind of encapsulation can't even be
141 * configured currently. Discard this.
142 */
143 if (guehdr->proto_ctype == IPPROTO_UDP ||
144 guehdr->proto_ctype == IPPROTO_UDPLITE)
145 return -EOPNOTSUPP;
146
134 skb_set_transport_header(skb, -(int)sizeof(struct icmp6hdr)); 147 skb_set_transport_header(skb, -(int)sizeof(struct icmp6hdr));
135 ret = gue6_err_proto_handler(guehdr->proto_ctype, skb, 148 ret = gue6_err_proto_handler(guehdr->proto_ctype, skb,
136 opt, type, code, offset, info); 149 opt, type, code, offset, info);
diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c
index 5d7aa2c2770c..bbcdfd299692 100644
--- a/net/ipv6/icmp.c
+++ b/net/ipv6/icmp.c
@@ -423,10 +423,10 @@ static int icmp6_iif(const struct sk_buff *skb)
423static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info, 423static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
424 const struct in6_addr *force_saddr) 424 const struct in6_addr *force_saddr)
425{ 425{
426 struct net *net = dev_net(skb->dev);
427 struct inet6_dev *idev = NULL; 426 struct inet6_dev *idev = NULL;
428 struct ipv6hdr *hdr = ipv6_hdr(skb); 427 struct ipv6hdr *hdr = ipv6_hdr(skb);
429 struct sock *sk; 428 struct sock *sk;
429 struct net *net;
430 struct ipv6_pinfo *np; 430 struct ipv6_pinfo *np;
431 const struct in6_addr *saddr = NULL; 431 const struct in6_addr *saddr = NULL;
432 struct dst_entry *dst; 432 struct dst_entry *dst;
@@ -437,12 +437,16 @@ static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
437 int iif = 0; 437 int iif = 0;
438 int addr_type = 0; 438 int addr_type = 0;
439 int len; 439 int len;
440 u32 mark = IP6_REPLY_MARK(net, skb->mark); 440 u32 mark;
441 441
442 if ((u8 *)hdr < skb->head || 442 if ((u8 *)hdr < skb->head ||
443 (skb_network_header(skb) + sizeof(*hdr)) > skb_tail_pointer(skb)) 443 (skb_network_header(skb) + sizeof(*hdr)) > skb_tail_pointer(skb))
444 return; 444 return;
445 445
446 if (!skb->dev)
447 return;
448 net = dev_net(skb->dev);
449 mark = IP6_REPLY_MARK(net, skb->mark);
446 /* 450 /*
447 * Make sure we respect the rules 451 * Make sure we respect the rules
448 * i.e. RFC 1885 2.4(e) 452 * i.e. RFC 1885 2.4(e)
diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c
index 09d0826742f8..4416368dbd49 100644
--- a/net/ipv6/ip6_gre.c
+++ b/net/ipv6/ip6_gre.c
@@ -534,13 +534,9 @@ static int ip6erspan_rcv(struct sk_buff *skb, int gre_hdr_len,
534 struct ip6_tnl *tunnel; 534 struct ip6_tnl *tunnel;
535 u8 ver; 535 u8 ver;
536 536
537 if (unlikely(!pskb_may_pull(skb, sizeof(*ershdr))))
538 return PACKET_REJECT;
539
540 ipv6h = ipv6_hdr(skb); 537 ipv6h = ipv6_hdr(skb);
541 ershdr = (struct erspan_base_hdr *)skb->data; 538 ershdr = (struct erspan_base_hdr *)skb->data;
542 ver = ershdr->ver; 539 ver = ershdr->ver;
543 tpi->key = cpu_to_be32(get_session_id(ershdr));
544 540
545 tunnel = ip6gre_tunnel_lookup(skb->dev, 541 tunnel = ip6gre_tunnel_lookup(skb->dev,
546 &ipv6h->saddr, &ipv6h->daddr, tpi->key, 542 &ipv6h->saddr, &ipv6h->daddr, tpi->key,
@@ -922,6 +918,7 @@ static netdev_tx_t ip6erspan_tunnel_xmit(struct sk_buff *skb,
922 __u8 dsfield = false; 918 __u8 dsfield = false;
923 struct flowi6 fl6; 919 struct flowi6 fl6;
924 int err = -EINVAL; 920 int err = -EINVAL;
921 __be16 proto;
925 __u32 mtu; 922 __u32 mtu;
926 int nhoff; 923 int nhoff;
927 int thoff; 924 int thoff;
@@ -1035,8 +1032,9 @@ static netdev_tx_t ip6erspan_tunnel_xmit(struct sk_buff *skb,
1035 } 1032 }
1036 1033
1037 /* Push GRE header. */ 1034 /* Push GRE header. */
1038 gre_build_header(skb, 8, TUNNEL_SEQ, 1035 proto = (t->parms.erspan_ver == 1) ? htons(ETH_P_ERSPAN)
1039 htons(ETH_P_ERSPAN), 0, htonl(t->o_seqno++)); 1036 : htons(ETH_P_ERSPAN2);
1037 gre_build_header(skb, 8, TUNNEL_SEQ, proto, 0, htonl(t->o_seqno++));
1040 1038
1041 /* TooBig packet may have updated dst->dev's mtu */ 1039 /* TooBig packet may have updated dst->dev's mtu */
1042 if (!t->parms.collect_md && dst && dst_mtu(dst) > dst->dev->mtu) 1040 if (!t->parms.collect_md && dst && dst_mtu(dst) > dst->dev->mtu)
@@ -1169,6 +1167,10 @@ static void ip6gre_tnl_copy_tnl_parm(struct ip6_tnl *t,
1169 t->parms.i_flags = p->i_flags; 1167 t->parms.i_flags = p->i_flags;
1170 t->parms.o_flags = p->o_flags; 1168 t->parms.o_flags = p->o_flags;
1171 t->parms.fwmark = p->fwmark; 1169 t->parms.fwmark = p->fwmark;
1170 t->parms.erspan_ver = p->erspan_ver;
1171 t->parms.index = p->index;
1172 t->parms.dir = p->dir;
1173 t->parms.hwid = p->hwid;
1172 dst_cache_reset(&t->dst_cache); 1174 dst_cache_reset(&t->dst_cache);
1173} 1175}
1174 1176
@@ -2025,9 +2027,9 @@ static int ip6gre_changelink(struct net_device *dev, struct nlattr *tb[],
2025 struct nlattr *data[], 2027 struct nlattr *data[],
2026 struct netlink_ext_ack *extack) 2028 struct netlink_ext_ack *extack)
2027{ 2029{
2028 struct ip6gre_net *ign = net_generic(dev_net(dev), ip6gre_net_id); 2030 struct ip6_tnl *t = netdev_priv(dev);
2031 struct ip6gre_net *ign = net_generic(t->net, ip6gre_net_id);
2029 struct __ip6_tnl_parm p; 2032 struct __ip6_tnl_parm p;
2030 struct ip6_tnl *t;
2031 2033
2032 t = ip6gre_changelink_common(dev, tb, data, &p, extack); 2034 t = ip6gre_changelink_common(dev, tb, data, &p, extack);
2033 if (IS_ERR(t)) 2035 if (IS_ERR(t))
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index 40b225f87d5e..964491cf3672 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -4251,17 +4251,6 @@ struct rt6_nh {
4251 struct list_head next; 4251 struct list_head next;
4252}; 4252};
4253 4253
4254static void ip6_print_replace_route_err(struct list_head *rt6_nh_list)
4255{
4256 struct rt6_nh *nh;
4257
4258 list_for_each_entry(nh, rt6_nh_list, next) {
4259 pr_warn("IPV6: multipath route replace failed (check consistency of installed routes): %pI6c nexthop %pI6c ifi %d\n",
4260 &nh->r_cfg.fc_dst, &nh->r_cfg.fc_gateway,
4261 nh->r_cfg.fc_ifindex);
4262 }
4263}
4264
4265static int ip6_route_info_append(struct net *net, 4254static int ip6_route_info_append(struct net *net,
4266 struct list_head *rt6_nh_list, 4255 struct list_head *rt6_nh_list,
4267 struct fib6_info *rt, 4256 struct fib6_info *rt,
@@ -4407,7 +4396,8 @@ static int ip6_route_multipath_add(struct fib6_config *cfg,
4407 nh->fib6_info = NULL; 4396 nh->fib6_info = NULL;
4408 if (err) { 4397 if (err) {
4409 if (replace && nhn) 4398 if (replace && nhn)
4410 ip6_print_replace_route_err(&rt6_nh_list); 4399 NL_SET_ERR_MSG_MOD(extack,
4400 "multipath route replace failed (check consistency of installed routes)");
4411 err_nh = nh; 4401 err_nh = nh;
4412 goto add_errout; 4402 goto add_errout;
4413 } 4403 }
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index 9cbf363172bd..2596ffdeebea 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -102,7 +102,7 @@ int udp_v6_get_port(struct sock *sk, unsigned short snum)
102 return udp_lib_get_port(sk, snum, hash2_nulladdr); 102 return udp_lib_get_port(sk, snum, hash2_nulladdr);
103} 103}
104 104
105static void udp_v6_rehash(struct sock *sk) 105void udp_v6_rehash(struct sock *sk)
106{ 106{
107 u16 new_hash = ipv6_portaddr_hash(sock_net(sk), 107 u16 new_hash = ipv6_portaddr_hash(sock_net(sk),
108 &sk->sk_v6_rcv_saddr, 108 &sk->sk_v6_rcv_saddr,
@@ -1132,15 +1132,23 @@ static int udp_v6_send_skb(struct sk_buff *skb, struct flowi6 *fl6,
1132 const int hlen = skb_network_header_len(skb) + 1132 const int hlen = skb_network_header_len(skb) +
1133 sizeof(struct udphdr); 1133 sizeof(struct udphdr);
1134 1134
1135 if (hlen + cork->gso_size > cork->fragsize) 1135 if (hlen + cork->gso_size > cork->fragsize) {
1136 kfree_skb(skb);
1136 return -EINVAL; 1137 return -EINVAL;
1137 if (skb->len > cork->gso_size * UDP_MAX_SEGMENTS) 1138 }
1139 if (skb->len > cork->gso_size * UDP_MAX_SEGMENTS) {
1140 kfree_skb(skb);
1138 return -EINVAL; 1141 return -EINVAL;
1139 if (udp_sk(sk)->no_check6_tx) 1142 }
1143 if (udp_sk(sk)->no_check6_tx) {
1144 kfree_skb(skb);
1140 return -EINVAL; 1145 return -EINVAL;
1146 }
1141 if (skb->ip_summed != CHECKSUM_PARTIAL || is_udplite || 1147 if (skb->ip_summed != CHECKSUM_PARTIAL || is_udplite ||
1142 dst_xfrm(skb_dst(skb))) 1148 dst_xfrm(skb_dst(skb))) {
1149 kfree_skb(skb);
1143 return -EIO; 1150 return -EIO;
1151 }
1144 1152
1145 skb_shinfo(skb)->gso_size = cork->gso_size; 1153 skb_shinfo(skb)->gso_size = cork->gso_size;
1146 skb_shinfo(skb)->gso_type = SKB_GSO_UDP_L4; 1154 skb_shinfo(skb)->gso_type = SKB_GSO_UDP_L4;
@@ -1390,10 +1398,7 @@ do_udp_sendmsg:
1390 ipc6.opt = opt; 1398 ipc6.opt = opt;
1391 1399
1392 fl6.flowi6_proto = sk->sk_protocol; 1400 fl6.flowi6_proto = sk->sk_protocol;
1393 if (!ipv6_addr_any(daddr)) 1401 fl6.daddr = *daddr;
1394 fl6.daddr = *daddr;
1395 else
1396 fl6.daddr.s6_addr[15] = 0x1; /* :: means loopback (BSD'ism) */
1397 if (ipv6_addr_any(&fl6.saddr) && !ipv6_addr_any(&np->saddr)) 1402 if (ipv6_addr_any(&fl6.saddr) && !ipv6_addr_any(&np->saddr))
1398 fl6.saddr = np->saddr; 1403 fl6.saddr = np->saddr;
1399 fl6.fl6_sport = inet->inet_sport; 1404 fl6.fl6_sport = inet->inet_sport;
@@ -1421,6 +1426,9 @@ do_udp_sendmsg:
1421 } 1426 }
1422 } 1427 }
1423 1428
1429 if (ipv6_addr_any(&fl6.daddr))
1430 fl6.daddr.s6_addr[15] = 0x1; /* :: means loopback (BSD'ism) */
1431
1424 final_p = fl6_update_dst(&fl6, opt, &final); 1432 final_p = fl6_update_dst(&fl6, opt, &final);
1425 if (final_p) 1433 if (final_p)
1426 connected = false; 1434 connected = false;
diff --git a/net/ipv6/udp_impl.h b/net/ipv6/udp_impl.h
index 5730e6503cb4..20e324b6f358 100644
--- a/net/ipv6/udp_impl.h
+++ b/net/ipv6/udp_impl.h
@@ -13,6 +13,7 @@ int __udp6_lib_err(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int,
13 __be32, struct udp_table *); 13 __be32, struct udp_table *);
14 14
15int udp_v6_get_port(struct sock *sk, unsigned short snum); 15int udp_v6_get_port(struct sock *sk, unsigned short snum);
16void udp_v6_rehash(struct sock *sk);
16 17
17int udpv6_getsockopt(struct sock *sk, int level, int optname, 18int udpv6_getsockopt(struct sock *sk, int level, int optname,
18 char __user *optval, int __user *optlen); 19 char __user *optval, int __user *optlen);
diff --git a/net/ipv6/udplite.c b/net/ipv6/udplite.c
index a125aebc29e5..f35907836444 100644
--- a/net/ipv6/udplite.c
+++ b/net/ipv6/udplite.c
@@ -49,6 +49,7 @@ struct proto udplitev6_prot = {
49 .recvmsg = udpv6_recvmsg, 49 .recvmsg = udpv6_recvmsg,
50 .hash = udp_lib_hash, 50 .hash = udp_lib_hash,
51 .unhash = udp_lib_unhash, 51 .unhash = udp_lib_unhash,
52 .rehash = udp_v6_rehash,
52 .get_port = udp_v6_get_port, 53 .get_port = udp_v6_get_port,
53 .memory_allocated = &udp_memory_allocated, 54 .memory_allocated = &udp_memory_allocated,
54 .sysctl_mem = sysctl_udp_mem, 55 .sysctl_mem = sysctl_udp_mem,