Commit 28448b80 authored by Tom Herbert's avatar Tom Herbert Committed by David S. Miller

net: Split sk_no_check into sk_no_check_{rx,tx}

Define separate fields in the sock structure for configuring disabling
checksums in both TX and RX-- sk_no_check_tx and sk_no_check_rx.
The SO_NO_CHECK socket option only affects sk_no_check_tx. Also,
removed UDP_CSUM_* defines since they are no longer necessary.
Signed-off-by: default avatarTom Herbert <therbert@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b26ba202
...@@ -244,7 +244,7 @@ iscsi_sw_tcp_conn_restore_callbacks(struct iscsi_conn *conn) ...@@ -244,7 +244,7 @@ iscsi_sw_tcp_conn_restore_callbacks(struct iscsi_conn *conn)
sk->sk_data_ready = tcp_sw_conn->old_data_ready; sk->sk_data_ready = tcp_sw_conn->old_data_ready;
sk->sk_state_change = tcp_sw_conn->old_state_change; sk->sk_state_change = tcp_sw_conn->old_state_change;
sk->sk_write_space = tcp_sw_conn->old_write_space; sk->sk_write_space = tcp_sw_conn->old_write_space;
sk->sk_no_check = 0; sk->sk_no_check_tx = 0;
write_unlock_bh(&sk->sk_callback_lock); write_unlock_bh(&sk->sk_callback_lock);
} }
......
...@@ -243,7 +243,8 @@ struct cg_proto; ...@@ -243,7 +243,8 @@ struct cg_proto;
* @sk_sndbuf: size of send buffer in bytes * @sk_sndbuf: size of send buffer in bytes
* @sk_flags: %SO_LINGER (l_onoff), %SO_BROADCAST, %SO_KEEPALIVE, * @sk_flags: %SO_LINGER (l_onoff), %SO_BROADCAST, %SO_KEEPALIVE,
* %SO_OOBINLINE settings, %SO_TIMESTAMPING settings * %SO_OOBINLINE settings, %SO_TIMESTAMPING settings
* @sk_no_check: %SO_NO_CHECK setting, whether or not checkup packets * @sk_no_check_tx: %SO_NO_CHECK setting, set checksum in TX packets
* @sk_no_check_rx: allow zero checksum in RX packets
* @sk_route_caps: route capabilities (e.g. %NETIF_F_TSO) * @sk_route_caps: route capabilities (e.g. %NETIF_F_TSO)
* @sk_route_nocaps: forbidden route capabilities (e.g NETIF_F_GSO_MASK) * @sk_route_nocaps: forbidden route capabilities (e.g NETIF_F_GSO_MASK)
* @sk_gso_type: GSO type (e.g. %SKB_GSO_TCPV4) * @sk_gso_type: GSO type (e.g. %SKB_GSO_TCPV4)
...@@ -371,7 +372,8 @@ struct sock { ...@@ -371,7 +372,8 @@ struct sock {
struct sk_buff_head sk_write_queue; struct sk_buff_head sk_write_queue;
kmemcheck_bitfield_begin(flags); kmemcheck_bitfield_begin(flags);
unsigned int sk_shutdown : 2, unsigned int sk_shutdown : 2,
sk_no_check : 2, sk_no_check_tx : 1,
sk_no_check_rx : 1,
sk_userlocks : 4, sk_userlocks : 4,
sk_protocol : 8, sk_protocol : 8,
sk_type : 16; sk_type : 16;
......
...@@ -95,15 +95,6 @@ static inline struct udp_hslot *udp_hashslot2(struct udp_table *table, ...@@ -95,15 +95,6 @@ static inline struct udp_hslot *udp_hashslot2(struct udp_table *table,
return &table->hash2[hash & table->mask]; return &table->hash2[hash & table->mask];
} }
/* Note: this must match 'valbool' in sock_setsockopt */
#define UDP_CSUM_NOXMIT 1
/* Used by SunRPC/xprt layer. */
#define UDP_CSUM_NORCV 2
/* Default, as per the RFC, is to always do csums. */
#define UDP_CSUM_DEFAULT 0
extern struct proto udp_prot; extern struct proto udp_prot;
extern atomic_long_t udp_memory_allocated; extern atomic_long_t udp_memory_allocated;
......
...@@ -1669,7 +1669,7 @@ static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr ...@@ -1669,7 +1669,7 @@ static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr
goto out; goto out;
} }
if (sk->sk_no_check == 1) if (sk->sk_no_check_tx)
ddp->deh_sum = 0; ddp->deh_sum = 0;
else else
ddp->deh_sum = atalk_checksum(skb, len + sizeof(*ddp)); ddp->deh_sum = atalk_checksum(skb, len + sizeof(*ddp));
......
...@@ -784,7 +784,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname, ...@@ -784,7 +784,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
break; break;
case SO_NO_CHECK: case SO_NO_CHECK:
sk->sk_no_check = valbool; sk->sk_no_check_tx = valbool;
break; break;
case SO_PRIORITY: case SO_PRIORITY:
...@@ -1064,7 +1064,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname, ...@@ -1064,7 +1064,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
break; break;
case SO_NO_CHECK: case SO_NO_CHECK:
v.val = sk->sk_no_check; v.val = sk->sk_no_check_tx;
break; break;
case SO_PRIORITY: case SO_PRIORITY:
......
...@@ -481,7 +481,7 @@ static struct sock *dn_alloc_sock(struct net *net, struct socket *sock, gfp_t gf ...@@ -481,7 +481,7 @@ static struct sock *dn_alloc_sock(struct net *net, struct socket *sock, gfp_t gf
sk->sk_backlog_rcv = dn_nsp_backlog_rcv; sk->sk_backlog_rcv = dn_nsp_backlog_rcv;
sk->sk_destruct = dn_destruct; sk->sk_destruct = dn_destruct;
sk->sk_no_check = 1; sk->sk_no_check_tx = 1;
sk->sk_family = PF_DECnet; sk->sk_family = PF_DECnet;
sk->sk_protocol = 0; sk->sk_protocol = 0;
sk->sk_allocation = gfp; sk->sk_allocation = gfp;
......
...@@ -785,7 +785,7 @@ static int udp_send_skb(struct sk_buff *skb, struct flowi4 *fl4) ...@@ -785,7 +785,7 @@ static int udp_send_skb(struct sk_buff *skb, struct flowi4 *fl4)
if (is_udplite) /* UDP-Lite */ if (is_udplite) /* UDP-Lite */
csum = udplite_csum(skb); csum = udplite_csum(skb);
else if (sk->sk_no_check == UDP_CSUM_NOXMIT) { /* UDP csum disabled */ else if (sk->sk_no_check_tx) { /* UDP csum disabled */
skb->ip_summed = CHECKSUM_NONE; skb->ip_summed = CHECKSUM_NONE;
goto send; goto send;
......
...@@ -797,7 +797,7 @@ static int __udp6_lib_mcast_deliver(struct net *net, struct sk_buff *skb, ...@@ -797,7 +797,7 @@ static int __udp6_lib_mcast_deliver(struct net *net, struct sk_buff *skb,
/* If zero checksum and sk_no_check is not on for /* If zero checksum and sk_no_check is not on for
* the socket then skip it. * the socket then skip it.
*/ */
if (uh->check || sk->sk_no_check) if (uh->check || sk->sk_no_check_rx)
stack[count++] = sk; stack[count++] = sk;
sk = udp_v6_mcast_next(net, sk_nulls_next(sk), uh->dest, daddr, sk = udp_v6_mcast_next(net, sk_nulls_next(sk), uh->dest, daddr,
...@@ -887,7 +887,7 @@ int __udp6_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, ...@@ -887,7 +887,7 @@ int __udp6_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
if (sk != NULL) { if (sk != NULL) {
int ret; int ret;
if (!uh->check && !sk->sk_no_check) { if (!uh->check && !sk->sk_no_check_rx) {
sock_put(sk); sock_put(sk);
udp6_csum_zero_error(skb); udp6_csum_zero_error(skb);
goto csum_error; goto csum_error;
...@@ -1037,7 +1037,7 @@ static int udp_v6_push_pending_frames(struct sock *sk) ...@@ -1037,7 +1037,7 @@ static int udp_v6_push_pending_frames(struct sock *sk)
if (is_udplite) if (is_udplite)
csum = udplite_csum_outgoing(sk, skb); csum = udplite_csum_outgoing(sk, skb);
else if (sk->sk_no_check == UDP_CSUM_NOXMIT) { /* UDP csum disabled */ else if (sk->sk_no_check_tx) { /* UDP csum disabled */
skb->ip_summed = CHECKSUM_NONE; skb->ip_summed = CHECKSUM_NONE;
goto send; goto send;
} else if (skb->ip_summed == CHECKSUM_PARTIAL) { /* UDP hardware csum */ } else if (skb->ip_summed == CHECKSUM_PARTIAL) { /* UDP hardware csum */
......
...@@ -1353,7 +1353,7 @@ static int ipx_create(struct net *net, struct socket *sock, int protocol, ...@@ -1353,7 +1353,7 @@ static int ipx_create(struct net *net, struct socket *sock, int protocol,
sk_refcnt_debug_inc(sk); sk_refcnt_debug_inc(sk);
sock_init_data(sock, sk); sock_init_data(sock, sk);
sk->sk_no_check = 1; /* Checksum off by default */ sk->sk_no_check_tx = 1; /* Checksum off by default */
sock->ops = &ipx_dgram_ops; sock->ops = &ipx_dgram_ops;
rc = 0; rc = 0;
out: out:
......
...@@ -236,7 +236,8 @@ int ipxrtr_route_packet(struct sock *sk, struct sockaddr_ipx *usipx, ...@@ -236,7 +236,8 @@ int ipxrtr_route_packet(struct sock *sk, struct sockaddr_ipx *usipx,
} }
/* Apply checksum. Not allowed on 802.3 links. */ /* Apply checksum. Not allowed on 802.3 links. */
if (sk->sk_no_check || intrfc->if_dlink_type == htons(IPX_FRAME_8023)) if (sk->sk_no_check_tx ||
intrfc->if_dlink_type == htons(IPX_FRAME_8023))
ipx->ipx_checksum = htons(0xFFFF); ipx->ipx_checksum = htons(0xFFFF);
else else
ipx->ipx_checksum = ipx_cksum(ipx, len + sizeof(struct ipxhdr)); ipx->ipx_checksum = ipx_cksum(ipx, len + sizeof(struct ipxhdr));
......
...@@ -1188,7 +1188,7 @@ int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb, int hdr_len ...@@ -1188,7 +1188,7 @@ int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb, int hdr_len
l2tp_xmit_ipv6_csum(sk, skb, udp_len); l2tp_xmit_ipv6_csum(sk, skb, udp_len);
else else
#endif #endif
if (sk->sk_no_check == UDP_CSUM_NOXMIT) if (sk->sk_no_check_tx)
skb->ip_summed = CHECKSUM_NONE; skb->ip_summed = CHECKSUM_NONE;
else if ((skb_dst(skb) && skb_dst(skb)->dev) && else if ((skb_dst(skb) && skb_dst(skb)->dev) &&
(!(skb_dst(skb)->dev->features & NETIF_F_V4_CSUM))) { (!(skb_dst(skb)->dev->features & NETIF_F_V4_CSUM))) {
...@@ -1463,7 +1463,7 @@ static int l2tp_tunnel_sock_create(struct net *net, ...@@ -1463,7 +1463,7 @@ static int l2tp_tunnel_sock_create(struct net *net,
} }
if (!cfg->use_udp_checksums) if (!cfg->use_udp_checksums)
sock->sk->sk_no_check = UDP_CSUM_NOXMIT; sock->sk->sk_no_check_tx = 1;
break; break;
......
...@@ -297,8 +297,7 @@ static int l2tp_nl_tunnel_send(struct sk_buff *skb, u32 portid, u32 seq, int fla ...@@ -297,8 +297,7 @@ static int l2tp_nl_tunnel_send(struct sk_buff *skb, u32 portid, u32 seq, int fla
case L2TP_ENCAPTYPE_UDP: case L2TP_ENCAPTYPE_UDP:
if (nla_put_u16(skb, L2TP_ATTR_UDP_SPORT, ntohs(inet->inet_sport)) || if (nla_put_u16(skb, L2TP_ATTR_UDP_SPORT, ntohs(inet->inet_sport)) ||
nla_put_u16(skb, L2TP_ATTR_UDP_DPORT, ntohs(inet->inet_dport)) || nla_put_u16(skb, L2TP_ATTR_UDP_DPORT, ntohs(inet->inet_dport)) ||
nla_put_u8(skb, L2TP_ATTR_UDP_CSUM, nla_put_u8(skb, L2TP_ATTR_UDP_CSUM, !sk->sk_no_check_tx))
(sk->sk_no_check != UDP_CSUM_NOXMIT)))
goto nla_put_failure; goto nla_put_failure;
/* NOBREAK */ /* NOBREAK */
case L2TP_ENCAPTYPE_IP: case L2TP_ENCAPTYPE_IP:
......
...@@ -6946,7 +6946,8 @@ void sctp_copy_sock(struct sock *newsk, struct sock *sk, ...@@ -6946,7 +6946,8 @@ void sctp_copy_sock(struct sock *newsk, struct sock *sk,
newsk->sk_type = sk->sk_type; newsk->sk_type = sk->sk_type;
newsk->sk_bound_dev_if = sk->sk_bound_dev_if; newsk->sk_bound_dev_if = sk->sk_bound_dev_if;
newsk->sk_flags = sk->sk_flags; newsk->sk_flags = sk->sk_flags;
newsk->sk_no_check = sk->sk_no_check; newsk->sk_no_check_tx = sk->sk_no_check_tx;
newsk->sk_no_check_rx = sk->sk_no_check_rx;
newsk->sk_reuse = sk->sk_reuse; newsk->sk_reuse = sk->sk_reuse;
newsk->sk_shutdown = sk->sk_shutdown; newsk->sk_shutdown = sk->sk_shutdown;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment