All of lore.kernel.org
 help / color / mirror / Atom feed
From: Martin Varghese <martinvarghesenokia@gmail.com>
To: Pravin Shelar <pshelar@ovn.org>
Cc: Linux Kernel Network Developers <netdev@vger.kernel.org>,
	"David S. Miller" <davem@davemloft.net>,
	Jamal Hadi Salim <jhs@mojatatu.com>,
	Cong Wang <xiyou.wangcong@gmail.com>,
	Jiri Pirko <jiri@resnulli.us>,
	"Varghese,
	Martin (Nokia - IN/Bangalore)" <martin.varghese@nokia.com>
Subject: Re: [PATCH v2 net-next] Enhanced skb_mpls_pop to update ethertype of the packet in all the cases when an ethernet header is present is the packet.
Date: Mon, 25 Nov 2019 16:09:30 +0530	[thread overview]
Message-ID: <20191125103930.GA2684@martin-VirtualBox> (raw)
In-Reply-To: <CAOrHB_AeJFYsvTLigMDB=j4XDsDsHR0sKADK33P5Qf7BiMVrug@mail.gmail.com>

On Sun, Nov 24, 2019 at 09:32:21PM -0800, Pravin Shelar wrote:
> On Sat, Nov 23, 2019 at 2:35 AM Martin Varghese
> <martinvarghesenokia@gmail.com> wrote:
> >
> > From: Martin Varghese <martin.varghese@nokia.com>
> >
> > The skb_mpls_pop was not updating ethertype of an ethernet packet if the
> > packet was originally received from a non ARPHRD_ETHER device.
> >
> > In the below OVS data path flow, since the device corresponding to port 7
> > is an l3 device (ARPHRD_NONE) the skb_mpls_pop function does not update
> > the ethertype of the packet even though the previous push_eth action had
> > added an ethernet header to the packet.
> >
> > recirc_id(0),in_port(7),eth_type(0x8847),
> > mpls(label=12/0xfffff,tc=0/0,ttl=0/0x0,bos=1/1),
> > actions:push_eth(src=00:00:00:00:00:00,dst=00:00:00:00:00:00),
> > pop_mpls(eth_type=0x800),4
> >
> > Signed-off-by: Martin Varghese <martin.varghese@nokia.com>
> > ---
> > Changes in v2:
> >     - check for dev type removed while updating ethertype
> >       in function skb_mpls_pop.
> >     - key->mac_proto is checked in function pop_mpls to pass
> >       ethernt flag to skb_mpls_pop.
> >     - dev type is checked in function tcf_mpls_act to pass
> >       ethernet flag to skb_mpls_pop.
> >
> >  include/linux/skbuff.h    | 3 ++-
> >  net/core/skbuff.c         | 7 ++++---
> >  net/openvswitch/actions.c | 4 +++-
> >  net/sched/act_mpls.c      | 4 +++-
> >  4 files changed, 12 insertions(+), 6 deletions(-)
> >
> > diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
> > index dfe02b6..70204b9 100644
> > --- a/include/linux/skbuff.h
> > +++ b/include/linux/skbuff.h
> > @@ -3530,7 +3530,8 @@ int skb_zerocopy(struct sk_buff *to, struct sk_buff *from,
> >  int skb_vlan_push(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci);
> >  int skb_mpls_push(struct sk_buff *skb, __be32 mpls_lse, __be16 mpls_proto,
> >                   int mac_len);
> > -int skb_mpls_pop(struct sk_buff *skb, __be16 next_proto, int mac_len);
> > +int skb_mpls_pop(struct sk_buff *skb, __be16 next_proto, int mac_len,
> > +                bool ethernet);
> >  int skb_mpls_update_lse(struct sk_buff *skb, __be32 mpls_lse);
> >  int skb_mpls_dec_ttl(struct sk_buff *skb);
> >  struct sk_buff *pskb_extract(struct sk_buff *skb, int off, int to_copy,
> > diff --git a/net/core/skbuff.c b/net/core/skbuff.c
> > index 867e61d..988eefb 100644
> > --- a/net/core/skbuff.c
> > +++ b/net/core/skbuff.c
> > @@ -5529,12 +5529,13 @@ int skb_mpls_push(struct sk_buff *skb, __be32 mpls_lse, __be16 mpls_proto,
> >   * @skb: buffer
> >   * @next_proto: ethertype of header after popped MPLS header
> >   * @mac_len: length of the MAC header
> > - *
> > + * @ethernet: flag to indicate if ethernet header is present in packet
> >   * Expects skb->data at mac header.
> >   *
> >   * Returns 0 on success, -errno otherwise.
> >   */
> > -int skb_mpls_pop(struct sk_buff *skb, __be16 next_proto, int mac_len)
> > +int skb_mpls_pop(struct sk_buff *skb, __be16 next_proto, int mac_len,
> > +                bool ethernet)
> >  {
> >         int err;
> >
> > @@ -5553,7 +5554,7 @@ int skb_mpls_pop(struct sk_buff *skb, __be16 next_proto, int mac_len)
> >         skb_reset_mac_header(skb);
> >         skb_set_network_header(skb, mac_len);
> >
> > -       if (skb->dev && skb->dev->type == ARPHRD_ETHER) {
> > +       if (ethernet) {
> >                 struct ethhdr *hdr;
> >
> >                 /* use mpls_hdr() to get ethertype to account for VLANs. */
> > diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c
> > index 12936c1..264c3c0 100644
> > --- a/net/openvswitch/actions.c
> > +++ b/net/openvswitch/actions.c
> > @@ -179,7 +179,9 @@ static int pop_mpls(struct sk_buff *skb, struct sw_flow_key *key,
> >  {
> >         int err;
> >
> > -       err = skb_mpls_pop(skb, ethertype, skb->mac_len);
> > +       err = skb_mpls_pop(skb, ethertype, skb->mac_len,
> > +                          (key->mac_proto & ~SW_FLOW_KEY_INVALID)
> > +                           == MAC_PROTO_ETHERNET);
> >         if (err)
> >                 return err;
> >
> Why you are not using ovs_key_mac_proto() here?
>

ovs_key_mac_proto returns u8  (supposedly enum sw_flow_mac_proto)

The new skb_mpls_pop takes bool as the last argument.
int skb_mpls_pop(struct sk_buff *skb, __be16 next_proto, int mac_len,
                 bool ethernet)

But if I change the new prototype to take u8(enum sw_flow_mac_proto) as the last argument

I need to make the generic skb_mpls_pop code aware of enum sw_flow_mac_proto defined in Openvswitch/flow.h .

-  if (ethernet) {
+ if(ethernet == MAC_PROTO_ETHERNET)
                struct ethhdr *hdr;

                /* use mpls_hdr() to get ethertype to account for VLANs. */
                hdr = (struct ethhdr *)((void *)mpls_hdr(skb) - ETH_HLEN);
                skb_mod_eth_type(skb, hdr, next_proto);
        }
        skb->protocol = next_proto;

Also ,it means at all the places where skb_mpls_pop is used, this Openvswitch header file (Openvswitch/flow.h)
has to be included, which I assume is not clean.
 
> > diff --git a/net/sched/act_mpls.c b/net/sched/act_mpls.c
> > index 4d8c822..f919f95 100644
> > --- a/net/sched/act_mpls.c
> > +++ b/net/sched/act_mpls.c
> > @@ -13,6 +13,7 @@
> >  #include <net/pkt_sched.h>
> >  #include <net/pkt_cls.h>
> >  #include <net/tc_act/tc_mpls.h>
> > +#include <linux/if_arp.h>
> >
> >  static unsigned int mpls_net_id;
> >  static struct tc_action_ops act_mpls_ops;
> > @@ -76,7 +77,8 @@ static int tcf_mpls_act(struct sk_buff *skb, const struct tc_action *a,
> >
> >         switch (p->tcfm_action) {
> >         case TCA_MPLS_ACT_POP:
> > -               if (skb_mpls_pop(skb, p->tcfm_proto, mac_len))
> > +               if (skb_mpls_pop(skb, p->tcfm_proto, mac_len,
> > +                                (skb->dev && skb->dev->type == ARPHRD_ETHER)))
> >                         goto drop;
> >                 break;
> >         case TCA_MPLS_ACT_PUSH:
> > --
> > 1.8.3.1
> >

  reply	other threads:[~2019-11-25 10:39 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-23 10:34 [PATCH v2 net-next] Enhanced skb_mpls_pop to update ethertype of the packet in all the cases when an ethernet header is present is the packet Martin Varghese
2019-11-25  3:10 ` Jakub Kicinski
2019-11-25 11:02   ` Martin Varghese
2019-11-25 17:05     ` Jakub Kicinski
2019-11-25  5:32 ` Pravin Shelar
2019-11-25 10:39   ` Martin Varghese [this message]
2019-11-25 15:49   ` Martin Varghese

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20191125103930.GA2684@martin-VirtualBox \
    --to=martinvarghesenokia@gmail.com \
    --cc=davem@davemloft.net \
    --cc=jhs@mojatatu.com \
    --cc=jiri@resnulli.us \
    --cc=martin.varghese@nokia.com \
    --cc=netdev@vger.kernel.org \
    --cc=pshelar@ovn.org \
    --cc=xiyou.wangcong@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.