-
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.
Yotam Gigi says: ==================== Extract IFE logic to module Extract ife logic from the tc_ife action into an independent module, and make the tc_ife action use it. This way, the ife encapsulation can be used by other modules other than tc_ife action. v1->v2: Fix duplicate symbol error by introducing a new patch that makes the original symbol static. The symbol ife_tlv_meta_extract is exported in act_ife, though not being used by any other module. As the symbol is being moved to the new ife module, introducing the new module creates duplicate symbol. To fix it, add a new patch (1/3) that makes the ife_tlv_meta_extract symbol static in act_ife, thus the symbol does not collide. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
- Loading branch information
Showing
13 changed files
with
276 additions
and
90 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
#ifndef __NET_IFE_H | ||
#define __NET_IFE_H | ||
|
||
#include <linux/etherdevice.h> | ||
#include <linux/rtnetlink.h> | ||
#include <linux/module.h> | ||
#include <uapi/linux/ife.h> | ||
|
||
#if IS_ENABLED(CONFIG_NET_IFE) | ||
|
||
void *ife_encode(struct sk_buff *skb, u16 metalen); | ||
void *ife_decode(struct sk_buff *skb, u16 *metalen); | ||
|
||
void *ife_tlv_meta_decode(void *skbdata, u16 *attrtype, u16 *dlen, u16 *totlen); | ||
int ife_tlv_meta_encode(void *skbdata, u16 attrtype, u16 dlen, | ||
const void *dval); | ||
|
||
void *ife_tlv_meta_next(void *skbdata); | ||
|
||
#else | ||
|
||
static inline void *ife_encode(struct sk_buff *skb, u16 metalen) | ||
{ | ||
return NULL; | ||
} | ||
|
||
static inline void *ife_decode(struct sk_buff *skb, u16 *metalen) | ||
{ | ||
return NULL; | ||
} | ||
|
||
static inline void *ife_tlv_meta_decode(void *skbdata, u16 *attrtype, u16 *dlen, | ||
u16 *totlen) | ||
{ | ||
return NULL; | ||
} | ||
|
||
static inline int ife_tlv_meta_encode(void *skbdata, u16 attrtype, u16 dlen, | ||
const void *dval) | ||
{ | ||
return 0; | ||
} | ||
|
||
static inline void *ife_tlv_meta_next(void *skbdata) | ||
{ | ||
return NULL; | ||
} | ||
|
||
#endif | ||
|
||
#endif /* __NET_IFE_H */ |
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,18 @@ | ||
#ifndef __UAPI_IFE_H | ||
#define __UAPI_IFE_H | ||
|
||
#define IFE_METAHDRLEN 2 | ||
|
||
enum { | ||
IFE_META_SKBMARK = 1, | ||
IFE_META_HASHID, | ||
IFE_META_PRIO, | ||
IFE_META_QMAP, | ||
IFE_META_TCINDEX, | ||
__IFE_META_MAX | ||
}; | ||
|
||
/*Can be overridden at runtime by module option*/ | ||
#define IFE_META_MAX (__IFE_META_MAX - 1) | ||
|
||
#endif |
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,16 @@ | ||
# | ||
# IFE subsystem configuration | ||
# | ||
|
||
menuconfig NET_IFE | ||
depends on NET | ||
tristate "Inter-FE based on IETF ForCES InterFE LFB" | ||
default n | ||
help | ||
Say Y here to add support of IFE encapsulation protocol | ||
For details refer to netdev01 paper: | ||
"Distributing Linux Traffic Control Classifier-Action Subsystem" | ||
Authors: Jamal Hadi Salim and Damascene M. Joachimpillai | ||
|
||
To compile this support as a module, choose M here: the module will | ||
be called ife. |
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,5 @@ | ||
# | ||
# Makefile for the IFE encapsulation protocol | ||
# | ||
|
||
obj-$(CONFIG_NET_IFE) += ife.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,142 @@ | ||
/* | ||
* net/ife/ife.c - Inter-FE protocol based on ForCES WG InterFE LFB | ||
* Copyright (c) 2015 Jamal Hadi Salim <jhs@mojatatu.com> | ||
* Copyright (c) 2017 Yotam Gigi <yotamg@mellanox.com> | ||
* | ||
* Refer to: draft-ietf-forces-interfelfb-03 and netdev01 paper: | ||
* "Distributing Linux Traffic Control Classifier-Action Subsystem" | ||
* Authors: Jamal Hadi Salim and Damascene M. Joachimpillai | ||
* | ||
* 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. | ||
*/ | ||
|
||
#include <linux/types.h> | ||
#include <linux/kernel.h> | ||
#include <linux/string.h> | ||
#include <linux/errno.h> | ||
#include <linux/skbuff.h> | ||
#include <linux/rtnetlink.h> | ||
#include <linux/module.h> | ||
#include <linux/init.h> | ||
#include <net/net_namespace.h> | ||
#include <net/netlink.h> | ||
#include <net/pkt_sched.h> | ||
#include <linux/etherdevice.h> | ||
#include <net/ife.h> | ||
|
||
struct ifeheadr { | ||
__be16 metalen; | ||
u8 tlv_data[]; | ||
}; | ||
|
||
void *ife_encode(struct sk_buff *skb, u16 metalen) | ||
{ | ||
/* OUTERHDR:TOTMETALEN:{TLVHDR:Metadatum:TLVHDR..}:ORIGDATA | ||
* where ORIGDATA = original ethernet header ... | ||
*/ | ||
int hdrm = metalen + IFE_METAHDRLEN; | ||
int total_push = hdrm + skb->dev->hard_header_len; | ||
struct ifeheadr *ifehdr; | ||
struct ethhdr *iethh; /* inner ether header */ | ||
int skboff = 0; | ||
int err; | ||
|
||
err = skb_cow_head(skb, total_push); | ||
if (unlikely(err)) | ||
return NULL; | ||
|
||
iethh = (struct ethhdr *) skb->data; | ||
|
||
__skb_push(skb, total_push); | ||
memcpy(skb->data, iethh, skb->dev->hard_header_len); | ||
skb_reset_mac_header(skb); | ||
skboff += skb->dev->hard_header_len; | ||
|
||
/* total metadata length */ | ||
ifehdr = (struct ifeheadr *) (skb->data + skboff); | ||
metalen += IFE_METAHDRLEN; | ||
ifehdr->metalen = htons(metalen); | ||
|
||
return ifehdr->tlv_data; | ||
} | ||
EXPORT_SYMBOL_GPL(ife_encode); | ||
|
||
void *ife_decode(struct sk_buff *skb, u16 *metalen) | ||
{ | ||
struct ifeheadr *ifehdr; | ||
int total_pull; | ||
u16 ifehdrln; | ||
|
||
ifehdr = (struct ifeheadr *) (skb->data + skb->dev->hard_header_len); | ||
ifehdrln = ntohs(ifehdr->metalen); | ||
total_pull = skb->dev->hard_header_len + ifehdrln; | ||
|
||
if (unlikely(ifehdrln < 2)) | ||
return NULL; | ||
|
||
if (unlikely(!pskb_may_pull(skb, total_pull))) | ||
return NULL; | ||
|
||
skb_set_mac_header(skb, total_pull); | ||
__skb_pull(skb, total_pull); | ||
*metalen = ifehdrln - IFE_METAHDRLEN; | ||
|
||
return &ifehdr->tlv_data; | ||
} | ||
EXPORT_SYMBOL_GPL(ife_decode); | ||
|
||
struct meta_tlvhdr { | ||
__be16 type; | ||
__be16 len; | ||
}; | ||
|
||
/* Caller takes care of presenting data in network order | ||
*/ | ||
void *ife_tlv_meta_decode(void *skbdata, u16 *attrtype, u16 *dlen, u16 *totlen) | ||
{ | ||
struct meta_tlvhdr *tlv = (struct meta_tlvhdr *) skbdata; | ||
|
||
*dlen = ntohs(tlv->len) - NLA_HDRLEN; | ||
*attrtype = ntohs(tlv->type); | ||
|
||
if (totlen) | ||
*totlen = nla_total_size(*dlen); | ||
|
||
return skbdata + sizeof(struct meta_tlvhdr); | ||
} | ||
EXPORT_SYMBOL_GPL(ife_tlv_meta_decode); | ||
|
||
void *ife_tlv_meta_next(void *skbdata) | ||
{ | ||
struct meta_tlvhdr *tlv = (struct meta_tlvhdr *) skbdata; | ||
u16 tlvlen = ntohs(tlv->len); | ||
|
||
tlvlen = NLA_ALIGN(tlvlen); | ||
|
||
return skbdata + tlvlen; | ||
} | ||
EXPORT_SYMBOL_GPL(ife_tlv_meta_next); | ||
|
||
/* Caller takes care of presenting data in network order | ||
*/ | ||
int ife_tlv_meta_encode(void *skbdata, u16 attrtype, u16 dlen, const void *dval) | ||
{ | ||
__be32 *tlv = (__be32 *) (skbdata); | ||
u16 totlen = nla_total_size(dlen); /*alignment + hdr */ | ||
char *dptr = (char *) tlv + NLA_HDRLEN; | ||
u32 htlv = attrtype << 16 | (dlen + NLA_HDRLEN); | ||
|
||
*tlv = htonl(htlv); | ||
memset(dptr, 0, totlen - NLA_HDRLEN); | ||
memcpy(dptr, dval, dlen); | ||
|
||
return totlen; | ||
} | ||
EXPORT_SYMBOL_GPL(ife_tlv_meta_encode); | ||
|
||
MODULE_AUTHOR("Jamal Hadi Salim <jhs@mojatatu.com>"); | ||
MODULE_AUTHOR("Yotam Gigi <yotamg@mellanox.com>"); | ||
MODULE_DESCRIPTION("Inter-FE LFB action"); | ||
MODULE_LICENSE("GPL"); |
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
Oops, something went wrong.