Commit 28e45033 authored by Ido Schimmel's avatar Ido Schimmel Committed by David S. Miller

inet: Refactor INET_ECN_decapsulate()

Drivers that support tunnel decapsulation (IPinIP or NVE) need to
configure the underlying device to conform to the behavior outlined in
RFC 6040 with respect to the ECN bits.

This behavior is implemented by INET_ECN_decapsulate() which requires an
skb to be passed where the ECN CE bit can be potentially set. Since
these drivers do not need to mark an skb, but only configure the device
to do so, factor out the business logic to __INET_ECN_decapsulate() and
potentially perform the marking in INET_ECN_decapsulate().

This allows drivers to invoke __INET_ECN_decapsulate() and configure the
device.
Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
Suggested-by: default avatarPetr Machata <petrm@mellanox.com>
Reviewed-by: default avatarPetr Machata <petrm@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent cca45e05
...@@ -183,8 +183,7 @@ static inline int INET_ECN_set_ce(struct sk_buff *skb) ...@@ -183,8 +183,7 @@ static inline int INET_ECN_set_ce(struct sk_buff *skb)
* 1 if something is broken and should be logged (!!! above) * 1 if something is broken and should be logged (!!! above)
* 2 if packet should be dropped * 2 if packet should be dropped
*/ */
static inline int INET_ECN_decapsulate(struct sk_buff *skb, static inline int __INET_ECN_decapsulate(__u8 outer, __u8 inner, bool *set_ce)
__u8 outer, __u8 inner)
{ {
if (INET_ECN_is_not_ect(inner)) { if (INET_ECN_is_not_ect(inner)) {
switch (outer & INET_ECN_MASK) { switch (outer & INET_ECN_MASK) {
...@@ -198,10 +197,21 @@ static inline int INET_ECN_decapsulate(struct sk_buff *skb, ...@@ -198,10 +197,21 @@ static inline int INET_ECN_decapsulate(struct sk_buff *skb,
} }
} }
if (INET_ECN_is_ce(outer)) *set_ce = INET_ECN_is_ce(outer);
return 0;
}
static inline int INET_ECN_decapsulate(struct sk_buff *skb,
__u8 outer, __u8 inner)
{
bool set_ce = false;
int rc;
rc = __INET_ECN_decapsulate(outer, inner, &set_ce);
if (!rc && set_ce)
INET_ECN_set_ce(skb); INET_ECN_set_ce(skb);
return 0; return rc;
} }
static inline int IP_ECN_decapsulate(const struct iphdr *oiph, static inline int IP_ECN_decapsulate(const struct iphdr *oiph,
......
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