From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas Monjalon Subject: Re: [PATCH v1] net: support PPPOE in software packet type parser Date: Tue, 16 May 2017 22:47:03 +0200 Message-ID: <1958581.a6L38vVbnc@xps> References: <1491559197-3307-1-git-send-email-skytap@host-1.skytap.example> <1491560817-3558-1-git-send-email-skytap@host-1.skytap.example> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7Bit Cc: Ray Zhang To: dev@dpdk.org, olivier.matz@6wind.com, bruce.richardson@intel.com Return-path: Received: from out1-smtp.messagingengine.com (out1-smtp.messagingengine.com [66.111.4.25]) by dpdk.org (Postfix) with ESMTP id 2A652292D for ; Tue, 16 May 2017 22:47:05 +0200 (CEST) In-Reply-To: <1491560817-3558-1-git-send-email-skytap@host-1.skytap.example> List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Any volunteer to review this patch, please? 07/04/2017 12:26, Ray Zhang: > From: Ray Zhang > > Add a new RTE_PTYPE_L2_ETHER_PPPOE and its support in > rte_net_get_ptype() > > Signed-off-by: Ray Zhang > --- > > Resend the patch > > lib/librte_mbuf/rte_mbuf_ptype.h | 7 +++++++ > lib/librte_net/rte_ether.h | 12 ++++++++++++ > lib/librte_net/rte_net.c | 19 +++++++++++++++++++ > 3 files changed, 38 insertions(+) > > diff --git a/lib/librte_mbuf/rte_mbuf_ptype.h b/lib/librte_mbuf/rte_mbuf_ptype.h > index ff6de9d..7dd03de 100644 > --- a/lib/librte_mbuf/rte_mbuf_ptype.h > +++ b/lib/librte_mbuf/rte_mbuf_ptype.h > @@ -150,6 +150,13 @@ > */ > #define RTE_PTYPE_L2_ETHER_QINQ 0x00000007 > /** > + * PPPOE packet type. > + * > + * Packet format: > + * <'ether type'=[0x8864]> > + */ > +#define RTE_PTYPE_L2_ETHER_PPPOE 0x00000008 > +/** > * Mask of layer 2 packet types. > * It is used for outer packet for tunneling cases. > */ > diff --git a/lib/librte_net/rte_ether.h b/lib/librte_net/rte_ether.h > index ff3d065..d76edb3 100644 > --- a/lib/librte_net/rte_ether.h > +++ b/lib/librte_net/rte_ether.h > @@ -323,12 +323,24 @@ struct vxlan_hdr { > uint32_t vx_vni; /**< VNI (24) + Reserved (8). */ > } __attribute__((__packed__)); > > +/** > + * PPPOE protocol header > + */ > +struct pppoe_hdr { > + uint8_t type_ver; > + uint8_t code; > + uint16_t sid; > + uint16_t length; > + uint16_t proto; > +} __attribute__((packed)); > + > /* Ethernet frame types */ > #define ETHER_TYPE_IPv4 0x0800 /**< IPv4 Protocol. */ > #define ETHER_TYPE_IPv6 0x86DD /**< IPv6 Protocol. */ > #define ETHER_TYPE_ARP 0x0806 /**< Arp Protocol. */ > #define ETHER_TYPE_RARP 0x8035 /**< Reverse Arp Protocol. */ > #define ETHER_TYPE_VLAN 0x8100 /**< IEEE 802.1Q VLAN tagging. */ > +#define ETHER_TYPE_PPPOE 0x8864 /**< PPPoE Protocol */ > #define ETHER_TYPE_QINQ 0x88A8 /**< IEEE 802.1ad QinQ tagging. */ > #define ETHER_TYPE_1588 0x88F7 /**< IEEE 802.1AS 1588 Precise Time Protocol. */ > #define ETHER_TYPE_SLOW 0x8809 /**< Slow protocols (LACP and Marker). */ > diff --git a/lib/librte_net/rte_net.c b/lib/librte_net/rte_net.c > index a8c7aff..439c2f6 100644 > --- a/lib/librte_net/rte_net.c > +++ b/lib/librte_net/rte_net.c > @@ -302,6 +302,25 @@ uint32_t rte_net_get_ptype(const struct rte_mbuf *m, > off += 2 * sizeof(*vh); > hdr_lens->l2_len += 2 * sizeof(*vh); > proto = vh->eth_proto; > + } else if (proto == rte_cpu_to_be_16(ETHER_TYPE_PPPOE)) { > + const struct pppoe_hdr *ph; > + struct pppoe_hdr ph_copy; > + > + pkt_type = RTE_PTYPE_L2_ETHER_PPPOE; > + ph = rte_pktmbuf_read(m, off, sizeof(*ph), &ph_copy); > + if (unlikely(ph == NULL)) > + return pkt_type; > + > + off += sizeof(*ph); > + hdr_lens->l2_len += sizeof(*ph); > + if (ph->code != 0) /* Not Seesion Data */ > + return pkt_type; > + if (ph->proto == rte_cpu_to_be_16(0x21)) > + proto = rte_cpu_to_be_16(ETHER_TYPE_IPv4); > + else if (ph->proto == rte_cpu_to_be_16(0x57)) > + proto = rte_cpu_to_be_16(ETHER_TYPE_IPv6); > + else > + return pkt_type; > }