From: Yotam Gigi <yot...@mellanox.com> Add the ife_packet_info_pack function which encodes some informative metadata into a packet using the ife encapsulation. The informative metadata consists of: - The packet input/output ifindices - The packet original size, in case it was truncated
This method is useful for anyone that wants to pass informative metadata on a packet alongside with the packet itself. A good usage can be packet sampling. Signed-off-by: Yotam Gigi <yot...@mellanox.com> Signed-off-by: Jiri Pirko <j...@mellanox.com> --- include/net/ife.h | 10 ++++++++++ net/ife/ife.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/include/net/ife.h b/include/net/ife.h index a75d4e0..5fbcfb3 100644 --- a/include/net/ife.h +++ b/include/net/ife.h @@ -18,6 +18,9 @@ int ife_tlv_meta_encode(void *skbdata, u16 attrtype, u16 dlen, void *ife_tlv_meta_next(void *skbdata); +struct ethhdr *ife_packet_info_pack(struct sk_buff *skb, int orig_size, + int in_ifindex, int out_ifindex); + #else static inline void *ife_encode(struct sk_buff *skb, u16 metalen) @@ -47,6 +50,13 @@ static inline void *ife_tlv_meta_next(void *skbdata) return NULL; } +static inline struct ethhdr * +ife_packet_info_pack(struct sk_buff *skb, int orig_size, int in_ifindex, + int out_ifindex) +{ + return NULL; +} + #endif #endif /* __NET_IFE_H */ diff --git a/net/ife/ife.c b/net/ife/ife.c index ee3221a..756af46 100644 --- a/net/ife/ife.c +++ b/net/ife/ife.c @@ -138,6 +138,51 @@ int ife_tlv_meta_encode(void *skbdata, u16 attrtype, u16 dlen, const void *dval) } EXPORT_SYMBOL_GPL(ife_tlv_meta_encode); +struct ethhdr *ife_packet_info_pack(struct sk_buff *skb, int orig_size, + int in_ifindex, int out_ifindex) +{ + int curr_size; + void *ifetlv; + u16 metalen; + + curr_size = skb->len; + + metalen = nla_total_size(sizeof(orig_size)) + + nla_total_size(sizeof(curr_size)); + + if (in_ifindex) + metalen += nla_total_size(sizeof(in_ifindex)); + if (out_ifindex) + metalen += nla_total_size(sizeof(out_ifindex)); + + in_ifindex = htonl(in_ifindex); + out_ifindex = htonl(out_ifindex); + orig_size = htonl(orig_size); + curr_size = htonl(curr_size); + + ifetlv = ife_encode(skb, metalen); + if (!ifetlv) + return NULL; + + if (in_ifindex) + ifetlv += ife_tlv_meta_encode(ifetlv, IFE_META_IN_IFINDEX, + sizeof(in_ifindex), &in_ifindex); + + if (out_ifindex) + ifetlv += ife_tlv_meta_encode(ifetlv, IFE_META_OUT_IFINDEX, + sizeof(out_ifindex), + &out_ifindex); + + ifetlv += ife_tlv_meta_encode(ifetlv, IFE_META_ORIGSIZE, + sizeof(orig_size), &orig_size); + + ifetlv += ife_tlv_meta_encode(ifetlv, IFE_META_SIZE, + sizeof(curr_size), &curr_size); + + return (struct ethhdr *) skb->data; +} +EXPORT_SYMBOL(ife_packet_info_pack); + MODULE_AUTHOR("Jamal Hadi Salim <j...@mojatatu.com>"); MODULE_AUTHOR("Yotam Gigi <yot...@mellanox.com>"); MODULE_DESCRIPTION("Inter-FE LFB action"); -- 2.7.4