Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8e67f56e authored by Harout Hedeshian's avatar Harout Hedeshian
Browse files

net: core: add MAP support to RPS flow dissector



More efficiently utilize multiple cores when using MAP encoded frames.
RPS flow dissector now appropriately decodes IPv4 and IPv6 frames with
MAP headers prepended.

CRs-Fixed: 681280
Change-Id: Ia4dde47fcc0f3436dcaa71a5160c0a59fe7ed53a
Signed-off-by: default avatarHarout Hedeshian <harouth@codeaurora.org>
parent c4c80c54
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -23,5 +23,8 @@ struct rmnet_map_header_s {
#define RMNET_MAP_GET_LENGTH(Y) (ntohs( \
			       ((struct rmnet_map_header_s *)Y->data)->pkt_len))

#define RMNET_IP_VER_MASK 0xF0
#define RMNET_IPV4        0x40
#define RMNET_IPV6        0x60

#endif /* _NET_MAP_H_ */
+35 −0
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@
#include <linux/if_pppox.h>
#include <linux/ppp_defs.h>
#include <net/flow_keys.h>
#include <linux/net_map.h>

/* copy saddr & daddr, possibly using 64bit load/store
 * Equivalent to :	flow->src = iph->saddr;
@@ -96,6 +97,40 @@ ipv6:
			return false;
		}
	}
	case __constant_htons(ETH_P_MAP): {
		struct {
			struct rmnet_map_header_s map;
			uint8_t proto;
		} *map, _map;
		unsigned int maplen;

		map = skb_header_pointer(skb, nhoff, sizeof(_map), &_map);
		if (!map)
			return false;

		/* Is MAP command? */
		if (map->map.cd_bit)
			return false;

		/* Is aggregated frame? */
		maplen = ntohs(map->map.pkt_len);
		maplen += map->map.pad_len;
		maplen += sizeof(struct rmnet_map_header_s);
		if (maplen < skb->len)
			return false;

		nhoff += sizeof(struct rmnet_map_header_s);
		switch (map->proto & RMNET_IP_VER_MASK) {
		case RMNET_IPV4:
			proto = htons(ETH_P_IP);
			goto ip;
		case RMNET_IPV6:
			proto = htons(ETH_P_IPV6);
			goto ipv6;
		default:
			return false;
		}
	}
	default:
		return false;
	}