diff options
Diffstat (limited to 'drivers/net/xen-netback/netback.c')
-rw-r--r-- | drivers/net/xen-netback/netback.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index e884ee1fe7ed..78425554a537 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c | |||
@@ -608,7 +608,7 @@ void xenvif_rx_action(struct xenvif *vif) | |||
608 | if (!npo.copy_prod) | 608 | if (!npo.copy_prod) |
609 | return; | 609 | return; |
610 | 610 | ||
611 | BUG_ON(npo.copy_prod > ARRAY_SIZE(vif->grant_copy_op)); | 611 | BUG_ON(npo.copy_prod > MAX_GRANT_COPY_OPS); |
612 | gnttab_batch_copy(vif->grant_copy_op, npo.copy_prod); | 612 | gnttab_batch_copy(vif->grant_copy_op, npo.copy_prod); |
613 | 613 | ||
614 | while ((skb = __skb_dequeue(&rxq)) != NULL) { | 614 | while ((skb = __skb_dequeue(&rxq)) != NULL) { |
@@ -1197,6 +1197,9 @@ static int checksum_setup_ip(struct xenvif *vif, struct sk_buff *skb, | |||
1197 | 1197 | ||
1198 | err = -EPROTO; | 1198 | err = -EPROTO; |
1199 | 1199 | ||
1200 | if (fragment) | ||
1201 | goto out; | ||
1202 | |||
1200 | switch (ip_hdr(skb)->protocol) { | 1203 | switch (ip_hdr(skb)->protocol) { |
1201 | case IPPROTO_TCP: | 1204 | case IPPROTO_TCP: |
1202 | err = maybe_pull_tail(skb, | 1205 | err = maybe_pull_tail(skb, |
@@ -1206,8 +1209,10 @@ static int checksum_setup_ip(struct xenvif *vif, struct sk_buff *skb, | |||
1206 | goto out; | 1209 | goto out; |
1207 | 1210 | ||
1208 | if (!skb_partial_csum_set(skb, off, | 1211 | if (!skb_partial_csum_set(skb, off, |
1209 | offsetof(struct tcphdr, check))) | 1212 | offsetof(struct tcphdr, check))) { |
1213 | err = -EPROTO; | ||
1210 | goto out; | 1214 | goto out; |
1215 | } | ||
1211 | 1216 | ||
1212 | if (recalculate_partial_csum) | 1217 | if (recalculate_partial_csum) |
1213 | tcp_hdr(skb)->check = | 1218 | tcp_hdr(skb)->check = |
@@ -1224,8 +1229,10 @@ static int checksum_setup_ip(struct xenvif *vif, struct sk_buff *skb, | |||
1224 | goto out; | 1229 | goto out; |
1225 | 1230 | ||
1226 | if (!skb_partial_csum_set(skb, off, | 1231 | if (!skb_partial_csum_set(skb, off, |
1227 | offsetof(struct udphdr, check))) | 1232 | offsetof(struct udphdr, check))) { |
1233 | err = -EPROTO; | ||
1228 | goto out; | 1234 | goto out; |
1235 | } | ||
1229 | 1236 | ||
1230 | if (recalculate_partial_csum) | 1237 | if (recalculate_partial_csum) |
1231 | udp_hdr(skb)->check = | 1238 | udp_hdr(skb)->check = |
@@ -1347,8 +1354,10 @@ static int checksum_setup_ipv6(struct xenvif *vif, struct sk_buff *skb, | |||
1347 | goto out; | 1354 | goto out; |
1348 | 1355 | ||
1349 | if (!skb_partial_csum_set(skb, off, | 1356 | if (!skb_partial_csum_set(skb, off, |
1350 | offsetof(struct tcphdr, check))) | 1357 | offsetof(struct tcphdr, check))) { |
1358 | err = -EPROTO; | ||
1351 | goto out; | 1359 | goto out; |
1360 | } | ||
1352 | 1361 | ||
1353 | if (recalculate_partial_csum) | 1362 | if (recalculate_partial_csum) |
1354 | tcp_hdr(skb)->check = | 1363 | tcp_hdr(skb)->check = |
@@ -1365,8 +1374,10 @@ static int checksum_setup_ipv6(struct xenvif *vif, struct sk_buff *skb, | |||
1365 | goto out; | 1374 | goto out; |
1366 | 1375 | ||
1367 | if (!skb_partial_csum_set(skb, off, | 1376 | if (!skb_partial_csum_set(skb, off, |
1368 | offsetof(struct udphdr, check))) | 1377 | offsetof(struct udphdr, check))) { |
1378 | err = -EPROTO; | ||
1369 | goto out; | 1379 | goto out; |
1380 | } | ||
1370 | 1381 | ||
1371 | if (recalculate_partial_csum) | 1382 | if (recalculate_partial_csum) |
1372 | udp_hdr(skb)->check = | 1383 | udp_hdr(skb)->check = |