forked from torvalds/linux
-
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.
net: Introduce ife encapsulation module
This module is responsible for the ife encapsulation protocol encode/decode logics. That module can: - ife_encode: encode skb and reserve space for the ife meta header - ife_decode: decode skb and extract the meta header size - ife_tlv_meta_encode - encodes one tlv entry into the reserved ife header space. - ife_tlv_meta_decode - decodes one tlv entry from the packet - ife_tlv_meta_next - advance to the next tlv Reviewed-by: Jiri Pirko <[email protected]> Signed-off-by: Yotam Gigi <[email protected]> Signed-off-by: Jamal Hadi Salim <[email protected]> Signed-off-by: Roman Mashak <[email protected]> Signed-off-by: David S. Miller <[email protected]>
- Loading branch information
Showing
9 changed files
with
242 additions
and
0 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
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6250,6 +6250,13 @@ F: include/net/cfg802154.h | |
F: include/net/ieee802154_netdev.h | ||
F: Documentation/networking/ieee802154.txt | ||
|
||
IFE PROTOCOL | ||
M: Yotam Gigi <[email protected]> | ||
M: Jamal Hadi Salim <[email protected]> | ||
F: net/ife | ||
F: include/net/ife.h | ||
F: include/uapi/linux/ife.h | ||
|
||
IGORPLUG-USB IR RECEIVER | ||
M: Sean Young <[email protected]> | ||
L: [email protected] | ||
|
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
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
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 <[email protected]> | ||
* Copyright (c) 2017 Yotam Gigi <[email protected]> | ||
* | ||
* 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 <[email protected]>"); | ||
MODULE_AUTHOR("Yotam Gigi <[email protected]>"); | ||
MODULE_DESCRIPTION("Inter-FE LFB action"); | ||
MODULE_LICENSE("GPL"); |