lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-ID: <20230530010348.21425-2-kuniyu@amazon.com> Date: Mon, 29 May 2023 18:03:35 -0700 From: Kuniyuki Iwashima <kuniyu@...zon.com> To: "David S. Miller" <davem@...emloft.net>, Eric Dumazet <edumazet@...gle.com>, Jakub Kicinski <kuba@...nel.org>, Paolo Abeni <pabeni@...hat.com>, David Ahern <dsahern@...nel.org>, Willem de Bruijn <willemdebruijn.kernel@...il.com> CC: Kuniyuki Iwashima <kuniyu@...zon.com>, Kuniyuki Iwashima <kuni1840@...il.com>, <netdev@...r.kernel.org> Subject: [PATCH v1 net-next 01/14] udp: Random clenaup. This is preparation patch to make the following diff smaller. No functional changes are intended: - Keep Reverse Xmas Tree Order - Define struct net instead of using sock_net() repeatedly Signed-off-by: Kuniyuki Iwashima <kuniyu@...zon.com> --- net/ipv4/udp.c | 68 +++++++++++++++++++++++++++----------------------- net/ipv6/udp.c | 58 +++++++++++++++++++++++------------------- 2 files changed, 69 insertions(+), 57 deletions(-) diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index fd3dae081f3a..7a874c497cbd 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -901,16 +901,17 @@ EXPORT_SYMBOL(udp_set_csum); static int udp_send_skb(struct sk_buff *skb, struct flowi4 *fl4, struct inet_cork *cork) { + int err, len, datalen, is_udplite; struct sock *sk = skb->sk; - struct inet_sock *inet = inet_sk(sk); + struct inet_sock *inet; struct udphdr *uh; - int err; - int is_udplite = IS_UDPLITE(sk); - int offset = skb_transport_offset(skb); - int len = skb->len - offset; - int datalen = len - sizeof(*uh); __wsum csum = 0; + inet = inet_sk(sk); + is_udplite = IS_UDPLITE(sk); + len = skb->len - skb_transport_offset(skb); + datalen = len - sizeof(*uh); + /* * Create a UDP header */ @@ -1051,24 +1052,25 @@ EXPORT_SYMBOL_GPL(udp_cmsg_send); int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) { + int (*getfrag)(void *, char *, int, int, int, struct sk_buff *); + DECLARE_SOCKADDR(struct sockaddr_in *, usin, msg->msg_name); struct inet_sock *inet = inet_sk(sk); struct udp_sock *up = udp_sk(sk); - DECLARE_SOCKADDR(struct sockaddr_in *, usin, msg->msg_name); + struct ip_options_data opt_copy; + int is_udplite = IS_UDPLITE(sk); + __be32 daddr, faddr, saddr; + struct rtable *rt = NULL; struct flowi4 fl4_stack; - struct flowi4 *fl4; - int ulen = len; struct ipcm_cookie ipc; - struct rtable *rt = NULL; - int free = 0; + struct sk_buff *skb; + struct flowi4 *fl4; int connected = 0; - __be32 daddr, faddr, saddr; + int ulen = len; u8 tos, scope; __be16 dport; - int err, is_udplite = IS_UDPLITE(sk); - int corkreq = READ_ONCE(up->corkflag) || msg->msg_flags&MSG_MORE; - int (*getfrag)(void *, char *, int, int, int, struct sk_buff *); - struct sk_buff *skb; - struct ip_options_data opt_copy; + int free = 0; + int corkreq; + int err; if (len > 0xFFFF) return -EMSGSIZE; @@ -1080,6 +1082,7 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) if (msg->msg_flags & MSG_OOB) /* Mirror BSD error message compatibility */ return -EOPNOTSUPP; + corkreq = READ_ONCE(up->corkflag) || msg->msg_flags & MSG_MORE; getfrag = is_udplite ? udplite_getfrag : ip_generic_getfrag; fl4 = &inet->cork.fl.u.ip4; @@ -1805,13 +1808,13 @@ EXPORT_SYMBOL(udp_read_skb); int udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int flags, int *addr_len) { - struct inet_sock *inet = inet_sk(sk); DECLARE_SOCKADDR(struct sockaddr_in *, sin, msg->msg_name); - struct sk_buff *skb; - unsigned int ulen, copied; int off, err, peeking = flags & MSG_PEEK; + struct inet_sock *inet = inet_sk(sk); int is_udplite = IS_UDPLITE(sk); bool checksum_valid = false; + unsigned int ulen, copied; + struct sk_buff *skb; if (flags & MSG_ERRQUEUE) return ip_recv_error(sk, msg, len, addr_len); @@ -1965,9 +1968,9 @@ void udp_lib_unhash(struct sock *sk) if (sk_hashed(sk)) { struct udp_table *udptable = udp_get_table_prot(sk); struct udp_hslot *hslot, *hslot2; + struct net *net = sock_net(sk); - hslot = udp_hashslot(udptable, sock_net(sk), - udp_sk(sk)->udp_port_hash); + hslot = udp_hashslot(udptable, net, udp_sk(sk)->udp_port_hash); hslot2 = udp_hashslot2(udptable, udp_sk(sk)->udp_portaddr_hash); spin_lock_bh(&hslot->lock); @@ -1976,7 +1979,7 @@ void udp_lib_unhash(struct sock *sk) if (sk_del_node_init_rcu(sk)) { hslot->count--; inet_sk(sk)->inet_num = 0; - sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); + sock_prot_inuse_add(net, sk->sk_prot, -1); spin_lock(&hslot2->lock); hlist_del_init_rcu(&udp_sk(sk)->udp_portaddr_node); @@ -1996,6 +1999,7 @@ void udp_lib_rehash(struct sock *sk, u16 newhash) if (sk_hashed(sk)) { struct udp_table *udptable = udp_get_table_prot(sk); struct udp_hslot *hslot, *hslot2, *nhslot2; + struct net *net = sock_net(sk); hslot2 = udp_hashslot2(udptable, udp_sk(sk)->udp_portaddr_hash); nhslot2 = udp_hashslot2(udptable, newhash); @@ -2003,8 +2007,7 @@ void udp_lib_rehash(struct sock *sk, u16 newhash) if (hslot2 != nhslot2 || rcu_access_pointer(sk->sk_reuseport_cb)) { - hslot = udp_hashslot(udptable, sock_net(sk), - udp_sk(sk)->udp_port_hash); + hslot = udp_hashslot(udptable, net, udp_sk(sk)->udp_port_hash); /* we must lock primary chain too */ spin_lock_bh(&hslot->lock); if (rcu_access_pointer(sk->sk_reuseport_cb)) @@ -2239,15 +2242,18 @@ static int __udp4_lib_mcast_deliver(struct net *net, struct sk_buff *skb, struct udp_table *udptable, int proto) { - struct sock *sk, *first = NULL; + int dif = skb->dev->ifindex, sdif = inet_sdif(skb); + unsigned int offset, hash2 = 0, hash2_any = 0; unsigned short hnum = ntohs(uh->dest); - struct udp_hslot *hslot = udp_hashslot(udptable, net, hnum); - unsigned int hash2 = 0, hash2_any = 0, use_hash2 = (hslot->count > 10); - unsigned int offset = offsetof(typeof(*sk), sk_node); - int dif = skb->dev->ifindex; - int sdif = inet_sdif(skb); + struct sock *sk, *first = NULL; struct hlist_node *node; + struct udp_hslot *hslot; struct sk_buff *nskb; + bool use_hash2; + + hslot = udp_hashslot(udptable, net, hnum); + offset = offsetof(typeof(*sk), sk_node); + use_hash2 = hslot->count > 10; if (use_hash2) { hash2_any = ipv4_portaddr_hash(net, htonl(INADDR_ANY), hnum) & diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index e5a337e6b970..2ec611c2f964 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -340,14 +340,14 @@ static int udp6_skb_len(struct sk_buff *skb) int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int flags, int *addr_len) { + int off, err, peeking = flags & MSG_PEEK; struct ipv6_pinfo *np = inet6_sk(sk); struct inet_sock *inet = inet_sk(sk); - struct sk_buff *skb; - unsigned int ulen, copied; - int off, err, peeking = flags & MSG_PEEK; int is_udplite = IS_UDPLITE(sk); struct udp_mib __percpu *mib; bool checksum_valid = false; + unsigned int ulen, copied; + struct sk_buff *skb; int is_udp4; if (flags & MSG_ERRQUEUE) @@ -848,16 +848,19 @@ static int __udp6_lib_mcast_deliver(struct net *net, struct sk_buff *skb, const struct in6_addr *saddr, const struct in6_addr *daddr, struct udp_table *udptable, int proto) { - struct sock *sk, *first = NULL; + int dif = inet6_iif(skb), sdif = inet6_sdif(skb); + unsigned int offset, hash2 = 0, hash2_any = 0; const struct udphdr *uh = udp_hdr(skb); unsigned short hnum = ntohs(uh->dest); - struct udp_hslot *hslot = udp_hashslot(udptable, net, hnum); - unsigned int offset = offsetof(typeof(*sk), sk_node); - unsigned int hash2 = 0, hash2_any = 0, use_hash2 = (hslot->count > 10); - int dif = inet6_iif(skb); - int sdif = inet6_sdif(skb); + struct sock *sk, *first = NULL; struct hlist_node *node; + struct udp_hslot *hslot; struct sk_buff *nskb; + bool use_hash2; + + hslot = udp_hashslot(udptable, net, hnum); + offset = offsetof(typeof(*sk), sk_node); + use_hash2 = hslot->count > 10; if (use_hash2) { hash2_any = ipv6_portaddr_hash(net, &in6addr_any, hnum) & @@ -1225,14 +1228,14 @@ static void udp6_hwcsum_outgoing(struct sock *sk, struct sk_buff *skb, static int udp_v6_send_skb(struct sk_buff *skb, struct flowi6 *fl6, struct inet_cork *cork) { + int err, len, datalen, is_udplite; struct sock *sk = skb->sk; struct udphdr *uh; - int err = 0; - int is_udplite = IS_UDPLITE(sk); __wsum csum = 0; - int offset = skb_transport_offset(skb); - int len = skb->len - offset; - int datalen = len - sizeof(*uh); + + is_udplite = IS_UDPLITE(sk); + len = skb->len - skb_transport_offset(skb); + datalen = len - sizeof(*uh); /* * Create a UDP header @@ -1330,26 +1333,26 @@ static int udp_v6_push_pending_frames(struct sock *sk) int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) { - struct ipv6_txoptions opt_space; - struct udp_sock *up = udp_sk(sk); - struct inet_sock *inet = inet_sk(sk); - struct ipv6_pinfo *np = inet6_sk(sk); + int (*getfrag)(void *, char *, int, int, int, struct sk_buff *); DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name); - struct in6_addr *daddr, *final_p, final; - struct ipv6_txoptions *opt = NULL; struct ipv6_txoptions *opt_to_free = NULL; + struct in6_addr *daddr, *final_p, final; struct ip6_flowlabel *flowlabel = NULL; + struct inet_sock *inet = inet_sk(sk); + struct ipv6_pinfo *np = inet6_sk(sk); + struct ipv6_txoptions *opt = NULL; + struct udp_sock *up = udp_sk(sk); + struct ipv6_txoptions opt_space; + int addr_len = msg->msg_namelen; + int is_udplite = IS_UDPLITE(sk); struct inet_cork_full cork; - struct flowi6 *fl6 = &cork.fl.u.ip6; - struct dst_entry *dst; struct ipcm6_cookie ipc6; - int addr_len = msg->msg_namelen; bool connected = false; + struct dst_entry *dst; + struct flowi6 *fl6; int ulen = len; - int corkreq = READ_ONCE(up->corkflag) || msg->msg_flags&MSG_MORE; + int corkreq; int err; - int is_udplite = IS_UDPLITE(sk); - int (*getfrag)(void *, char *, int, int, int, struct sk_buff *); ipcm6_init(&ipc6); ipc6.gso_size = READ_ONCE(up->gso_size); @@ -1411,6 +1414,9 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) if (len > INT_MAX - sizeof(struct udphdr)) return -EMSGSIZE; + corkreq = READ_ONCE(up->corkflag) || msg->msg_flags & MSG_MORE; + fl6 = &cork.fl.u.ip6; + getfrag = is_udplite ? udplite_getfrag : ip_generic_getfrag; if (up->pending) { if (up->pending == AF_INET) -- 2.30.2
Powered by blists - more mailing lists