Thanks for the checking.

I will correct them. Do you know any similar script for user space codes?

Thanks a lot.
Wenyu


在 2014-7-23,5:29,"Pravin Shelar" <pshe...@nicira.com> 写道:

> I have seen multiple coding style errors and warning from kernel
> checkpatch.pl on kernel part of the patch:-
> 
> WARNING: Missing a blank line after declarations
> #88: FILE: datapath/actions.c:530:
> + struct vport *vport;
> + vport = ovs_vport_ovsl_rcu(dp, nla_get_u32(a));
> 
> ERROR: space required before the open brace '{'
> #89: FILE: datapath/actions.c:531:
> + if (vport->ops->get_out_tun_info){
> 
> WARNING: braces {} are not necessary for single statement blocks
> #92: FILE: datapath/actions.c:534:
> + if (err == 0) {
> + upcall.out_tun_info = &output_tunnel_info;
> + }
> 
> WARNING: line over 80 characters
> #93: FILE: datapath/actions.c:535:
> + upcall.out_tun_info = &output_tunnel_info;
> 
> ERROR: space required after that close brace '}'
> #99: FILE: datapath/actions.c:541:
> + }/* End of switch. */
> 
> ERROR: code indent should use tabs where possible
> #175: FILE: datapath/datapath.c:432:
> +        if (upcall_info->out_tun_info)$
> 
> WARNING: please, no spaces at the start of a line
> #175: FILE: datapath/datapath.c:432:
> +        if (upcall_info->out_tun_info)$
> 
> ERROR: code indent should use tabs where possible
> #197: FILE: datapath/datapath.c:518:
> +        }$
> 
> WARNING: please, no spaces at the start of a line
> #197: FILE: datapath/datapath.c:518:
> +        }$
> 
> ERROR: code indent should use tabs where possible
> #231: FILE: datapath/flow.h:42:
> +        (offsetof(struct ovs_key_ipv4_tunnel, tp_dst) + ^I\$
> 
> WARNING: please, no space before tabs
> #231: FILE: datapath/flow.h:42:
> +        (offsetof(struct ovs_key_ipv4_tunnel, tp_dst) + ^I\$
> 
> WARNING: please, no spaces at the start of a line
> #231: FILE: datapath/flow.h:42:
> +        (offsetof(struct ovs_key_ipv4_tunnel, tp_dst) + ^I\$
> 
> ERROR: code indent should use tabs where possible
> #232: FILE: datapath/flow.h:43:
> +         FIELD_SIZEOF(struct ovs_key_ipv4_tunnel, tp_dst))$
> 
> WARNING: please, no spaces at the start of a line
> #232: FILE: datapath/flow.h:43:
> +         FIELD_SIZEOF(struct ovs_key_ipv4_tunnel, tp_dst))$
> 
> WARNING: line over 80 characters
> #255: FILE: datapath/flow.h:72:
> +    __be32 saddr, __be32 daddr, u8 tos, u8 ttl,
> 
> ERROR: code indent should use tabs where possible
> #345: FILE: datapath/flow_netlink.c:497:
> +^I^I^I        const struct ovs_key_ipv4_tunnel *output,$
> 
> ERROR: code indent should use tabs where possible
> #346: FILE: datapath/flow_netlink.c:498:
> +^I^I^I        const struct geneve_opt *tun_opts,$
> 
> ERROR: code indent should use tabs where possible
> #347: FILE: datapath/flow_netlink.c:499:
> +^I^I^I        int swkey_tun_opts_len)$
> 
> WARNING: braces {} are not necessary for single statement blocks
> #392: FILE: datapath/flow_netlink.c:552:
> + if (err) {
> + return err;
> + }
> 
> ERROR: code indent should use tabs where possible
> #404: FILE: datapath/flow_netlink.c:564:
> +^I                            out_tun_info->options,$
> 
> ERROR: code indent should use tabs where possible
> #405: FILE: datapath/flow_netlink.c:565:
> +^I                            out_tun_info->options_len);$
> 
> ERROR: code indent should use tabs where possible
> #502: FILE: datapath/vport-gre.c:296:
> +                                struct ovs_tunnel_info * out_tun_info)$
> 
> WARNING: please, no spaces at the start of a line
> #502: FILE: datapath/vport-gre.c:296:
> +                                struct ovs_tunnel_info * out_tun_info)$
> 
> ERROR: "foo * bar" should be "foo *bar"
> #502: FILE: datapath/vport-gre.c:296:
> +                                struct ovs_tunnel_info * out_tun_info)
> 
> WARNING: please, no space before tabs
> #522: FILE: datapath/vport-gre.c:311:
> +^I.send^I ^I^I= gre_send,$
> 
> ERROR: code indent should use tabs where possible
> #555: FILE: datapath/vport-lisp.c:250:
> +^I                       key, TUNNEL_KEY, NULL, 0);$
> 
> ERROR: code indent should use tabs where possible
> #564: FILE: datapath/vport-lisp.c:520:
> +                                 struct ovs_tunnel_info * out_tun_info)$
> 
> WARNING: please, no spaces at the start of a line
> #564: FILE: datapath/vport-lisp.c:520:
> +                                 struct ovs_tunnel_info * out_tun_info)$
> 
> ERROR: "foo * bar" should be "foo *bar"
> #564: FILE: datapath/vport-lisp.c:520:
> +                                 struct ovs_tunnel_info * out_tun_info)
> 
> ERROR: code indent should use tabs where possible
> #621: FILE: datapath/vport-vxlan.c:193:
> +                                  struct ovs_tunnel_info * out_tun_info)$
> 
> WARNING: please, no spaces at the start of a line
> #621: FILE: datapath/vport-vxlan.c:193:
> +                                  struct ovs_tunnel_info * out_tun_info)$
> 
> ERROR: "foo * bar" should be "foo *bar"
> #621: FILE: datapath/vport-vxlan.c:193:
> +                                  struct ovs_tunnel_info * out_tun_info)
> 
> WARNING: braces {} are not necessary for single statement blocks
> #630: FILE: datapath/vport-vxlan.c:202:
> + if (unlikely(!OVS_CB(skb)->tun_info)) {
> + return  -EINVAL;
> + }
> 
> WARNING: braces {} are not necessary for single statement blocks
> #693: FILE: datapath/vport.c:593:
> + if (IS_ERR(rt)) {
> + return PTR_ERR(rt);
> + }
> 
> ERROR: code indent should use tabs where possible
> #743: FILE: datapath/vport.h:178:
> +^I^I^I        struct ovs_tunnel_info *);$
> 
> WARNING: line over 80 characters
> #772: FILE: include/linux/openvswitch.h:196:
> + OVS_PACKET_ATTR_ACTIONS,        /* Nested OVS_ACTION_ATTR_* attributes. */
> 
> WARNING: line over 80 characters
> #774: FILE: include/linux/openvswitch.h:198:
> + OVS_PACKET_ATTR_OUT_TUNNEL_KEY, /* Nested OVS_TUNNEL_KEY_ATTR_* attributes 
> */
> 
> WARNING: line over 80 characters
> #782: FILE: include/linux/openvswitch.h:349:
> + OVS_TUNNEL_KEY_ATTR_TP_SRC, /* u16 Tunnel Source Transport Port. */
> 
> WARNING: line over 80 characters
> #783: FILE: include/linux/openvswitch.h:350:
> + OVS_TUNNEL_KEY_ATTR_TP_DST, /* u16 Tunnel Destination Transport Port. */
> 
> ERROR: code indent should use tabs where possible
> #799: FILE: include/linux/openvswitch.h:525:
> +                                              * to get tunnel info.$
> 
> ERROR: code indent should use tabs where possible
> #800: FILE: include/linux/openvswitch.h:526:
> +                                              */$
> 
> total: 21 errors, 20 warnings, 655 lines checked
> 
> -------------------
> Please fix all these issue in next revision.
> 
> Thanks,
> Pravin.
> 
> On Tue, Jul 22, 2014 at 1:02 PM, Pravin Shelar <pshe...@nicira.com> wrote:
>> On Mon, Jul 21, 2014 at 8:35 PM, Wenyu Zhang <wen...@vmware.com> wrote:
>>> Thanks for the review, my comments inline.
>>> 
>>> Bests,
>>> Wenyu
>>> -----Original Message-----
>>> From: Pravin Shelar [mailto:pshe...@nicira.com]
>>> Sent: Tuesday, July 22, 2014 6:56 AM
>>> To: Wenyu Zhang
>>> Cc: Romain Lenglet; Ben Pfaff; Jesse Gross; dev@openvswitch.org
>>> Subject: Re: [PATCH v5] Extend OVS IPFIX exporter to export tunnel headers
>>> 
>>> On Mon, Jul 21, 2014 at 2:39 AM, Wenyu Zhang <wen...@vmware.com> wrote:
>>>> Extend IPFIX exporter to export tunnel headers when both input and output
>>>> of the port.
>>>> Add three other_config options in IPFIX table: enable-input-sampling,
>>>> enable-output-sampling and enable-tunnel-sampling, to control whether
>>>> sampling tunnel info, on which direction (input or output).
>>>> Insert sampling action before output action and the output tunnel port
>>>> is sent to datapath in the sampling action.
>>>> Make datapath collect output tunnel info and send it back to userpace
>>>> in upcall message with a new additional optional attribute.
>>>> Add a tunnel ports map to make the tunnel port lookup faster in sampling
>>>> upcalls in IPFIX exporter. Make the IPFIX exporter generate IPFIX template
>>>> sets with enterprise elements for the tunnel info, save the tunnel info
>>>> in IPFIX cache entries, and send IPFIX DATA with tunnel info.
>>>> Add flowDirection element in IPFIX templates.
>>>> 
>>>> Signed-off-by: Wenyu Zhang <wen...@vmware.com>
>>>> Acked-by: Romain Lenglet <rleng...@vmware.com>
>>> 
>>> This looking close, I have few comments below.
>>> 
>>>> ---
>>>> v2: Address Romain's comments
>>>> v3: Address Pravin's comments, make datapath sent all tunnel info,
>>>>    not only tunnel key to userspace.
>>>> v4: Address Pravin's comments, introduce a common function to get output
>>>>    tunnel info for all vports, remove duplicated codes.
>>>>    Rebase.
>>>> v5: Address Pravin's comments on v4, correct sparse errors, make a common
>>>>    function to setup tunnel info data for both input and output case.
>>>> ---
>>>> datapath/actions.c                    |   18 ++
>>>> datapath/datapath.c                   |   46 +++-
>>>> datapath/datapath.h                   |    2 +
>>>> datapath/flow.h                       |   54 ++--
>>>> datapath/flow_netlink.c               |   58 ++++-
>>>> datapath/flow_netlink.h               |    2 +
>>>> datapath/vport-geneve.c               |   36 ++-
>>>> datapath/vport-gre.c                  |   35 ++-
>>>> datapath/vport-lisp.c                 |   40 ++-
>>>> datapath/vport-vxlan.c                |   39 ++-
>>>> datapath/vport.c                      |   40 +++
>>>> datapath/vport.h                      |   11 +
>>>> include/linux/openvswitch.h           |   21 +-
>>>> lib/dpif-linux.c                      |    2 +
>>>> lib/dpif.h                            |    1 +
>>>> lib/odp-util.c                        |  183 +++++++++-----
>>>> lib/odp-util.h                        |    2 +
>>>> lib/packets.h                         |    9 +-
>>>> ofproto/automake.mk                   |    3 +
>>>> ofproto/ipfix-enterprise-entities.def |   19 ++
>>>> ofproto/ofproto-dpif-ipfix.c          |  444 
>>>> ++++++++++++++++++++++++++++++---
>>>> ofproto/ofproto-dpif-ipfix.h          |   14 +-
>>>> ofproto/ofproto-dpif-upcall.c         |   20 +-
>>>> ofproto/ofproto-dpif-xlate.c          |   51 +++-
>>>> ofproto/ofproto-dpif.c                |   20 ++
>>>> ofproto/ofproto.h                     |    3 +
>>>> ofproto/tunnel.c                      |    4 +
>>>> tests/odp.at                          |    9 +-
>>>> utilities/ovs-vsctl.8.in              |    8 +-
>>>> vswitchd/bridge.c                     |    9 +
>>>> vswitchd/vswitch.ovsschema            |    5 +-
>>>> vswitchd/vswitch.xml                  |   27 ++
>>>> 32 files changed, 1048 insertions(+), 187 deletions(-)
>>>> create mode 100644 ofproto/ipfix-enterprise-entities.def
>>>> 
>>>> diff --git a/datapath/actions.c b/datapath/actions.c
>>>> index 39a21f4..c1ad4dc 100644
>>>> --- a/datapath/actions.c
>>>> +++ b/datapath/actions.c
>>>> @@ -502,6 +502,7 @@ static int output_userspace(struct datapath *dp, 
>>>> struct sk_buff *skb,
>>>>        struct dp_upcall_info upcall;
>>>>        const struct nlattr *a;
>>>>        int rem;
>>>> +       struct ovs_tunnel_info output_tunnel_info;
>>>> 
>>>>        BUG_ON(!OVS_CB(skb)->pkt_key);
>>>> 
>>>> @@ -509,6 +510,7 @@ static int output_userspace(struct datapath *dp, 
>>>> struct sk_buff *skb,
>>>>        upcall.key = OVS_CB(skb)->pkt_key;
>>>>        upcall.userdata = NULL;
>>>>        upcall.portid = 0;
>>>> +       upcall.out_tun_info = NULL;
>>>> 
>>>>        for (a = nla_data(attr), rem = nla_len(attr); rem > 0;
>>>>                 a = nla_next(a, &rem)) {
>>>> @@ -520,7 +522,23 @@ static int output_userspace(struct datapath *dp, 
>>>> struct sk_buff *skb,
>>>>                case OVS_USERSPACE_ATTR_PID:
>>>>                        upcall.portid = nla_get_u32(a);
>>>>                        break;
>>>> +
>>>> +               case OVS_USERSPACE_ATTR_TUNNEL_OUT_PORT: {
>>>> +                       /* Get out tunnel info. */
>>>> +                       int err;
>>>> +                       struct vport *vport;
>>>> +                       vport = ovs_vport_ovsl_rcu(dp, nla_get_u32(a));
>>> This function is never called under ovs_lock, so you can use rcu
>>> version of lookup.
>>> Wenyu: Sorry, I am confused. I have used ovs_vport_ovsl_rcu(), do you mean 
>>> another rcu version of lookup?
>> 
>> You can use ovs_vport_rcu().
>> 
>>>> +                       if (vport->ops->get_out_tun_info){
>>> 
>>> You also need to check for vport, if it is NULL.
>>> Wenyu: Sure, I will add check for vport and vport->ops.
>> ok.
>> 
>>>> +                               err = vport->ops->get_out_tun_info(
>>>> +                                       vport, skb, &output_tunnel_info);
>>>> +                               if (err == 0) {
>>>> +                                       upcall.out_tun_info = 
>>>> &output_tunnel_info;
>>>> +                               }
>>>> +                       }
>>>> +                       break;
>>>>                }
>>>> +
>>>> +               }/* End of switch. */
>>>>        }
>>> 
>>> .......
>>>> {
>>>> +       BUILD_BUG_ON(sizeof(tun_info->tunnel) != OVS_TUNNEL_KEY_SIZE);
>>>> +
>>>>        tun_info->tunnel.tun_id = tun_id;
>>>> -       tun_info->tunnel.ipv4_src = iph->saddr;
>>>> -       tun_info->tunnel.ipv4_dst = iph->daddr;
>>>> -       tun_info->tunnel.ipv4_tos = iph->tos;
>>>> -       tun_info->tunnel.ipv4_ttl = iph->ttl;
>>>> +       tun_info->tunnel.ipv4_src = saddr;
>>>> +       tun_info->tunnel.ipv4_dst = daddr;
>>>> +       tun_info->tunnel.ipv4_tos = tos;
>>>> +       tun_info->tunnel.ipv4_ttl = ttl;
>>>>        tun_info->tunnel.tun_flags = tun_flags;
>>>> 
>>>> -       /* clear struct padding. */
>>>> -       memset((unsigned char *) &tun_info->tunnel + OVS_TUNNEL_KEY_SIZE, 
>>>> 0,
>>>> -              sizeof(tun_info->tunnel) - OVS_TUNNEL_KEY_SIZE);
>>> 
>>> We still need this memset for case where we add another member to this
>>> struct, you can check for size of padding to avoid sparse warning.
>>> Wenyu:  The additional if condition  may affect performance, we'd better to 
>>> add some comments to mention this usage.
>>>               I have added a compling check about the size: 
>>> BUILD_BUG_ON(sizeof(tun_info->tunnel) != OVS_TUNNEL_KEY_SIZE);
>>>               If we add another member to this structre in future, this 
>>> check will failed when compling to mention us, and then we can add the 
>>> memset only when the failure happens.
>>>                And I can add some comments  about the usage of memset here.
>> 
>> Compiler can determine size is zero and it does not generate code if
>> it is not required. so there is no performance penalty.
>> 
>>>> +       /* For the tunnel types on the top of IPsec, the tp_src and tp_dst 
>>>> of
>>>> +        * the upper tunnel are used.
>>>> +        * E.g: GRE over IPSEC, the tp_src and tp_port are zero.
>>>> +        */
>>>> +       tun_info->tunnel.tp_src = tp_src;
>>>> +       tun_info->tunnel.tp_dst = tp_dst;
>>>> 
>>>>        tun_info->options = opts;
>>>>        tun_info->options_len = opts_len;
>>>> }
>>> .....
>>> 
>>>> 
>>>> +static int geneve_get_out_tun_info(struct vport *vport, struct sk_buff 
>>>> *skb,
>>>> +                                  struct ovs_tunnel_info *out_tun_info)
>>>> +{
>>>> +       struct geneve_port *geneve_port = geneve_vport(vport);
>>>> +
>>>> +       if (unlikely(!OVS_CB(skb)->tun_info))
>>>> +               return -EINVAL;
>>>> +
>>> Can you move this check inside ovs_vport_out_tun_info.
>>> Wenyu: Considering that the tp_src and tp_dst need be prepared before 
>>> ovs_vport_get_out_tun_info() is called, we'd better do the check before 
>>> doing the work to calculate tp_src and tp_dst. So I perfer to keep the 
>>> check here.
>> 
>> tp_src and tp_dst does not depend on out_tun_info, so the check should
>> be moved to the common function.
>> 
>>>> +       /*
>>>> +        * Get tp_src and tp_dst, refert to geneve_build_header().
>>>> +        */
>>>> +       return ovs_vport_get_out_tun_info(out_tun_info, 
>>>> OVS_CB(skb)->tun_info,
>>>> +                                         ovs_dp_get_net(vport->dp),
>>>> +                                         IPPROTO_UDP, skb->mark,
>>>> +                                         vxlan_src_port(1, USHRT_MAX, 
>>>> skb),
>>>> +                                         
>>>> inet_sport(geneve_port->sock->sk));
>>>> +
>>>> +}
>>>> +
>>>> const struct vport_ops ovs_geneve_vport_ops = {
>>>> -       .type           = OVS_VPORT_TYPE_GENEVE,
>>>> -       .create         = geneve_tnl_create,
>>>> -       .destroy        = geneve_tnl_destroy,
>>>> -       .get_name       = geneve_get_name,
>>>> -       .get_options    = geneve_get_options,
>>>> -       .send           = geneve_send,
>>>> +       .type                   = OVS_VPORT_TYPE_GENEVE,
>>>> +       .create                 = geneve_tnl_create,
>>>> +       .destroy                = geneve_tnl_destroy,
>>>> +       .get_name               = geneve_get_name,
>>>> +       .get_options            = geneve_get_options,
>>>> +       .send                   = geneve_send,
>>>> +       .get_out_tun_info       = geneve_get_out_tun_info,
>>>> };
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to