aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorTom Herbert <therbert@google.com>2014-06-04 20:19:56 -0400
committerDavid S. Miller <davem@davemloft.net>2014-06-05 01:46:38 -0400
commit77157e1973cbdb8d60bdb0ec749d6014bedc5bd5 (patch)
treed4dab38f82bb1e287693a78c5e5b983202eab07a /net
parentaf5fcba7f38f3166392f4087ab734433c84f160b (diff)
l2tp: call udp{6}_set_csum
Call common functions to set checksum for UDP tunnel. Signed-off-by: Tom Herbert <therbert@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r--net/l2tp/l2tp_core.c54
1 files changed, 5 insertions, 49 deletions
diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c
index 379558014b60..bea259043205 100644
--- a/net/l2tp/l2tp_core.c
+++ b/net/l2tp/l2tp_core.c
@@ -1095,33 +1095,6 @@ static int l2tp_xmit_core(struct l2tp_session *session, struct sk_buff *skb,
1095 return 0; 1095 return 0;
1096} 1096}
1097 1097
1098#if IS_ENABLED(CONFIG_IPV6)
1099static void l2tp_xmit_ipv6_csum(struct sock *sk, struct sk_buff *skb,
1100 int udp_len)
1101{
1102 struct ipv6_pinfo *np = inet6_sk(sk);
1103 struct udphdr *uh = udp_hdr(skb);
1104
1105 if (udp_get_no_check6_tx(sk))
1106 skb->ip_summed = CHECKSUM_NONE;
1107 else if (!skb_dst(skb) || !skb_dst(skb)->dev ||
1108 !(skb_dst(skb)->dev->features & NETIF_F_IPV6_CSUM)) {
1109 __wsum csum = skb_checksum(skb, 0, udp_len, 0);
1110 skb->ip_summed = CHECKSUM_UNNECESSARY;
1111 uh->check = csum_ipv6_magic(&np->saddr, &sk->sk_v6_daddr, udp_len,
1112 IPPROTO_UDP, csum);
1113 if (uh->check == 0)
1114 uh->check = CSUM_MANGLED_0;
1115 } else {
1116 skb->ip_summed = CHECKSUM_PARTIAL;
1117 skb->csum_start = skb_transport_header(skb) - skb->head;
1118 skb->csum_offset = offsetof(struct udphdr, check);
1119 uh->check = ~csum_ipv6_magic(&np->saddr, &sk->sk_v6_daddr,
1120 udp_len, IPPROTO_UDP, 0);
1121 }
1122}
1123#endif
1124
1125/* If caller requires the skb to have a ppp header, the header must be 1098/* If caller requires the skb to have a ppp header, the header must be
1126 * inserted in the skb data before calling this function. 1099 * inserted in the skb data before calling this function.
1127 */ 1100 */
@@ -1133,7 +1106,6 @@ int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb, int hdr_len
1133 struct flowi *fl; 1106 struct flowi *fl;
1134 struct udphdr *uh; 1107 struct udphdr *uh;
1135 struct inet_sock *inet; 1108 struct inet_sock *inet;
1136 __wsum csum;
1137 int headroom; 1109 int headroom;
1138 int uhlen = (tunnel->encap == L2TP_ENCAPTYPE_UDP) ? sizeof(struct udphdr) : 0; 1110 int uhlen = (tunnel->encap == L2TP_ENCAPTYPE_UDP) ? sizeof(struct udphdr) : 0;
1139 int udp_len; 1111 int udp_len;
@@ -1182,33 +1154,17 @@ int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb, int hdr_len
1182 uh->dest = inet->inet_dport; 1154 uh->dest = inet->inet_dport;
1183 udp_len = uhlen + hdr_len + data_len; 1155 udp_len = uhlen + hdr_len + data_len;
1184 uh->len = htons(udp_len); 1156 uh->len = htons(udp_len);
1185 uh->check = 0;
1186 1157
1187 /* Calculate UDP checksum if configured to do so */ 1158 /* Calculate UDP checksum if configured to do so */
1188#if IS_ENABLED(CONFIG_IPV6) 1159#if IS_ENABLED(CONFIG_IPV6)
1189 if (sk->sk_family == PF_INET6 && !tunnel->v4mapped) 1160 if (sk->sk_family == PF_INET6 && !tunnel->v4mapped)
1190 l2tp_xmit_ipv6_csum(sk, skb, udp_len); 1161 udp6_set_csum(udp_get_no_check6_tx(sk),
1162 skb, &inet6_sk(sk)->saddr,
1163 &sk->sk_v6_daddr, udp_len);
1191 else 1164 else
1192#endif 1165#endif
1193 if (sk->sk_no_check_tx) 1166 udp_set_csum(sk->sk_no_check_tx, skb, inet->inet_saddr,
1194 skb->ip_summed = CHECKSUM_NONE; 1167 inet->inet_daddr, udp_len);
1195 else if ((skb_dst(skb) && skb_dst(skb)->dev) &&
1196 (!(skb_dst(skb)->dev->features & NETIF_F_V4_CSUM))) {
1197 skb->ip_summed = CHECKSUM_COMPLETE;
1198 csum = skb_checksum(skb, 0, udp_len, 0);
1199 uh->check = csum_tcpudp_magic(inet->inet_saddr,
1200 inet->inet_daddr,
1201 udp_len, IPPROTO_UDP, csum);
1202 if (uh->check == 0)
1203 uh->check = CSUM_MANGLED_0;
1204 } else {
1205 skb->ip_summed = CHECKSUM_PARTIAL;
1206 skb->csum_start = skb_transport_header(skb) - skb->head;
1207 skb->csum_offset = offsetof(struct udphdr, check);
1208 uh->check = ~csum_tcpudp_magic(inet->inet_saddr,
1209 inet->inet_daddr,
1210 udp_len, IPPROTO_UDP, 0);
1211 }
1212 break; 1168 break;
1213 1169
1214 case L2TP_ENCAPTYPE_IP: 1170 case L2TP_ENCAPTYPE_IP: