-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Simon Horman says: ==================== In the case where a non-MPLS packet is received and an MPLS stack is added it may well be the case that the original skb is GSO but the NIC used for transmit does not support GSO of MPLS packets. The aim of this short series is to provide GSO in software for MPLS packets whose skbs are GSO. Change since v4: Update first patch of the series to use 16 bits for all *_headers rather than just inner_*_headers Simon Horman (2): net: Use 16bits for *_headers fields of struct skbuff MPLS: Add limited GSO support ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
- Loading branch information
Showing
15 changed files
with
149 additions
and
116 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
# | ||
# MPLS configuration | ||
# | ||
config NET_MPLS_GSO | ||
tristate "MPLS: GSO support" | ||
help | ||
This is helper module to allow segmentation of non-MPLS GSO packets | ||
that have had MPLS stack entries pushed onto them and thus | ||
become MPLS GSO packets. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
# | ||
# Makefile for MPLS. | ||
# | ||
obj-y += mpls_gso.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
/* | ||
* MPLS GSO Support | ||
* | ||
* Authors: Simon Horman (horms@verge.net.au) | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation; either version | ||
* 2 of the License, or (at your option) any later version. | ||
* | ||
* Based on: GSO portions of net/ipv4/gre.c | ||
*/ | ||
|
||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||
|
||
#include <linux/err.h> | ||
#include <linux/module.h> | ||
#include <linux/netdev_features.h> | ||
#include <linux/netdevice.h> | ||
#include <linux/skbuff.h> | ||
|
||
static struct sk_buff *mpls_gso_segment(struct sk_buff *skb, | ||
netdev_features_t features) | ||
{ | ||
struct sk_buff *segs = ERR_PTR(-EINVAL); | ||
netdev_features_t mpls_features; | ||
__be16 mpls_protocol; | ||
|
||
if (unlikely(skb_shinfo(skb)->gso_type & | ||
~(SKB_GSO_TCPV4 | | ||
SKB_GSO_TCPV6 | | ||
SKB_GSO_UDP | | ||
SKB_GSO_DODGY | | ||
SKB_GSO_TCP_ECN | | ||
SKB_GSO_GRE | | ||
SKB_GSO_MPLS))) | ||
goto out; | ||
|
||
/* Setup inner SKB. */ | ||
mpls_protocol = skb->protocol; | ||
skb->protocol = skb->inner_protocol; | ||
|
||
/* Push back the mac header that skb_mac_gso_segment() has pulled. | ||
* It will be re-pulled by the call to skb_mac_gso_segment() below | ||
*/ | ||
__skb_push(skb, skb->mac_len); | ||
|
||
/* Segment inner packet. */ | ||
mpls_features = skb->dev->mpls_features & netif_skb_features(skb); | ||
segs = skb_mac_gso_segment(skb, mpls_features); | ||
|
||
|
||
/* Restore outer protocol. */ | ||
skb->protocol = mpls_protocol; | ||
|
||
/* Re-pull the mac header that the call to skb_mac_gso_segment() | ||
* above pulled. It will be re-pushed after returning | ||
* skb_mac_gso_segment(), an indirect caller of this function. | ||
*/ | ||
__skb_push(skb, skb->data - skb_mac_header(skb)); | ||
|
||
out: | ||
return segs; | ||
} | ||
|
||
static int mpls_gso_send_check(struct sk_buff *skb) | ||
{ | ||
return 0; | ||
} | ||
|
||
static struct packet_offload mpls_mc_offload = { | ||
.type = cpu_to_be16(ETH_P_MPLS_MC), | ||
.callbacks = { | ||
.gso_send_check = mpls_gso_send_check, | ||
.gso_segment = mpls_gso_segment, | ||
}, | ||
}; | ||
|
||
static struct packet_offload mpls_uc_offload = { | ||
.type = cpu_to_be16(ETH_P_MPLS_UC), | ||
.callbacks = { | ||
.gso_send_check = mpls_gso_send_check, | ||
.gso_segment = mpls_gso_segment, | ||
}, | ||
}; | ||
|
||
static int __init mpls_gso_init(void) | ||
{ | ||
pr_info("MPLS GSO support\n"); | ||
|
||
dev_add_offload(&mpls_uc_offload); | ||
dev_add_offload(&mpls_mc_offload); | ||
|
||
return 0; | ||
} | ||
|
||
static void __exit mpls_gso_exit(void) | ||
{ | ||
dev_remove_offload(&mpls_uc_offload); | ||
dev_remove_offload(&mpls_mc_offload); | ||
} | ||
|
||
module_init(mpls_gso_init); | ||
module_exit(mpls_gso_exit); | ||
|
||
MODULE_DESCRIPTION("MPLS GSO support"); | ||
MODULE_AUTHOR("Simon Horman (horms@verge.net.au)"); | ||
MODULE_LICENSE("GPL"); |