Hi:
[NET] back: Add GSO features field and check gso_size
This patch adds the as-yet unused GSO features which will contain
protocol-independent bits such as the ECN marker.
It also makes the backend check gso_size to ensure that it is non-zero.
Signed-off-by: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>
Cheers,
--
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <herbert@xxxxxxxxxxxxxxxxxxx>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
diff -r 3656a2985ae1 -r 8c37d0d4526e
linux-2.6-xen-sparse/drivers/xen/netback/netback.c
--- a/linux-2.6-xen-sparse/drivers/xen/netback/netback.c Mon Jul 03
14:18:54 2006 +1000
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/netback.c Mon Jul 03
14:31:15 2006 +1000
@@ -691,6 +691,29 @@ int netbk_get_extras(netif_t *netif, str
return work_to_do;
}
+static int netbk_set_skb_gso(struct sk_buff *skb, struct netif_extra_info *gso)
+{
+ if (!gso->u.gso.size) {
+ DPRINTK("GSO size must not be zero.\n");
+ return -EINVAL;
+ }
+
+ /* Currently on TCPv4 S.O. is supported. */
+ if (gso->u.gso.type != XEN_NETIF_GSO_TCPV4) {
+ DPRINTK("Bad GSO type %d.\n", gso->u.gso.type);
+ return -EINVAL;
+ }
+
+ skb_shinfo(skb)->gso_size = gso->u.gso.size;
+ skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
+
+ /* Header must be checked, and gso_segs computed. */
+ skb_shinfo(skb)->gso_type |= SKB_GSO_DODGY;
+ skb_shinfo(skb)->gso_segs = 0;
+
+ return 0;
+}
+
/* Called after netfront has transmitted */
static void net_tx_action(unsigned long unused)
{
@@ -819,20 +842,11 @@ static void net_tx_action(unsigned long
struct netif_extra_info *gso;
gso = &extras[XEN_NETIF_EXTRA_TYPE_GSO - 1];
- /* Currently on TCPv4 S.O. is supported. */
- if (gso->u.gso.type != XEN_NETIF_GSO_TCPV4) {
- DPRINTK("Bad GSO type %d.\n", gso->u.gso.type);
+ if (netbk_set_skb_gso(skb, gso)) {
kfree_skb(skb);
netbk_tx_err(netif, &txreq, i);
- break;
+ continue;
}
-
- skb_shinfo(skb)->gso_size = gso->u.gso.size;
- skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
-
- /* Header must be checked, and gso_segs computed. */
- skb_shinfo(skb)->gso_type |= SKB_GSO_DODGY;
- skb_shinfo(skb)->gso_segs = 0;
}
gnttab_set_map_op(mop, MMAP_VADDR(pending_idx),
diff -r 3656a2985ae1 -r 8c37d0d4526e xen/include/public/io/netif.h
--- a/xen/include/public/io/netif.h Mon Jul 03 14:18:54 2006 +1000
+++ b/xen/include/public/io/netif.h Mon Jul 03 14:31:15 2006 +1000
@@ -88,6 +88,12 @@ struct netif_extra_info {
* extra features required to segment the packet properly.
*/
uint16_t type; /* XEN_NETIF_GSO_* */
+
+ /*
+ * GSO features . This specifies any extra GSO features required
+ * to process this packet, such as ECN support for TCPv4.
+ */
+ uint16_t features; /* XEN_NETIF_FEAT_* */
} gso;
uint16_t pad[3];
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|