On Thu, Jul 17, 2014 at 3:05 AM, Wenyu Zhang <wen...@vmware.com> wrote: > Thanks for the review. > > I have removed the incorrect whitespaces. > > About XXX_get_out_tun_info(), I keep the caluclation of saddr, including > route look up process, tp_src and tp_dst in ops for each vport, due to that > the process are a little different for each vport. And I think that the > potential changes for vport ops in future may affect the process too, it's > better to keep this process in vport ops. > And the operation to fill the collected info into out_tun_info data is > exactly same, I abstract a function ovs_flow_get_out_tun_info to do it. > All these function do routing lookup and then copy out key, so you can pass specific parameter to common function to generate out_key.
> I have sent the freshed patch just a moment ago. May you help? > > Bests, > Wenyu > > -----Original Message----- > From: Pravin Shelar [mailto:pshe...@nicira.com] > Sent: Thursday, July 17, 2014 1:03 AM > To: Wenyu Zhang > Cc: Romain Lenglet; Ben Pfaff; Jesse Gross; dev@openvswitch.org > Subject: Re: [PATCH v3] Extend OVS IPFIX exporter to export tunnel headers > > git am warning: > Applying: Extend OVS IPFIX exporter to export tunnel headers > /home/pravin/ovs/w8/.git/rebase-apply/patch:143: trailing whitespace. > if (out_tun_key) > /home/pravin/ovs/w8/.git/rebase-apply/patch:236: space before tab in indent. > const struct udphdr * udp_hdr = tph; > /home/pravin/ovs/w8/.git/rebase-apply/patch:433: trailing whitespace. > /home/pravin/ovs/w8/.git/rebase-apply/patch:594: trailing whitespace. > /home/pravin/ovs/w8/.git/rebase-apply/patch:695: trailing whitespace. > warning: squelched 21 whitespace errors > warning: 26 lines add whitespace errors. > > > > On Wed, Jul 16, 2014 at 12:55 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> >> --- >> datapath/actions.c | 16 +- >> datapath/datapath.c | 42 +++- >> datapath/datapath.h | 2 + >> datapath/flow.h | 24 +- >> datapath/flow_netlink.c | 58 ++++- >> datapath/flow_netlink.h | 2 + >> datapath/vport-geneve.c | 63 ++++- >> datapath/vport-gre.c | 67 ++++- >> datapath/vport-lisp.c | 67 ++++- >> datapath/vport-vxlan.c | 71 +++++- >> datapath/vport.h | 4 + >> 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 | 4 + >> 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 ++ >> 31 files changed, 1097 insertions(+), 174 deletions(-) create mode >> 100644 ofproto/ipfix-enterprise-entities.def >> >> diff --git a/datapath/actions.c b/datapath/actions.c index >> 39a21f4..226b849 100644 >> --- a/datapath/actions.c >> +++ b/datapath/actions.c > ... > >> static inline void ovs_flow_tun_info_init(struct ovs_tunnel_info *tun_info, >> - const struct iphdr *iph, __be64 >> tun_id, >> + const struct iphdr *iph, const >> void *tph, >> + __be64 tun_id, >> __be16 tun_flags, >> struct geneve_opt *opts, >> u8 opts_len) @@ -79,6 +82,21 >> @@ static inline void ovs_flow_tun_info_init(struct ovs_tunnel_info >> *tun_info, >> tun_info->tunnel.ipv4_ttl = iph->ttl; >> tun_info->tunnel.tun_flags = tun_flags; >> >> + /* 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. >> + */ >> + if (tph && >> + (iph->protocol == IPPROTO_UDP || >> + iph->protocol == IPPROTO_TCP)) { >> + const struct udphdr * udp_hdr = tph; >> + tun_info->tunnel.tp_src = udp_hdr->source; >> + tun_info->tunnel.tp_dst = udp_hdr->dest; >> + } else { >> + tun_info->tunnel.tp_src = 0; >> + tun_info->tunnel.tp_dst = 0; >> + } >> + > > Can you pass source port and dst post to to this function, so that we can > avoid these checks this function. > >> /* clear struct padding. */ >> memset((unsigned char *) &tun_info->tunnel + OVS_TUNNEL_KEY_SIZE, 0, >> sizeof(tun_info->tunnel) - OVS_TUNNEL_KEY_SIZE); diff >> --git a/datapath/flow_netlink.c b/datapath/flow_netlink.c index >> 5f975a1..1550daa 100644 >> --- a/datapath/flow_netlink.c > .... > >> >> +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); >> + struct ovs_key_ipv4_tunnel *tun_key; >> + struct ovs_key_ipv4_tunnel *out_tun_key = &out_tun_info->tunnel; >> + struct rtable *rt; >> + __be32 saddr; >> + int err = 0; >> + >> + >> + if (unlikely(!OVS_CB(skb)->tun_info)) >> + return -EINVAL; >> + >> + tun_key = &OVS_CB(skb)->tun_info->tunnel; >> + >> + /* Route lookup */ >> + saddr = tun_key->ipv4_src; >> + rt = find_route(ovs_dp_get_net(vport->dp), >> + &saddr, tun_key->ipv4_dst, >> + IPPROTO_UDP, tun_key->ipv4_tos, >> + skb->mark); >> + if (IS_ERR(rt)) { >> + err = PTR_ERR(rt); >> + goto error; >> + } >> + ip_rt_put(rt); >> + >> + memset(out_tun_info, 0, sizeof(*out_tun_key)); >> + /* Now the tun_key should contain the output tun key*/ >> + out_tun_key->tun_flags |= TUNNEL_KEY; >> + out_tun_key->tun_id = tun_key->tun_id; >> + out_tun_key->ipv4_src = saddr; >> + out_tun_key->ipv4_dst = tun_key->ipv4_dst; >> + out_tun_key->ipv4_tos = tun_key->ipv4_tos; >> + out_tun_key->ipv4_ttl = tun_key->ipv4_ttl; >> + /* Get tp_src and tp_dst, refert to geneve_build_header() */ >> + out_tun_key->tp_src = vxlan_src_port(1, USHRT_MAX, skb); >> + out_tun_key->tp_dst = inet_sport(geneve_port->sock->sk); >> + /* Set GENEVE's option */ >> + out_tun_info->options = OVS_CB(skb)->tun_info->options; >> + out_tun_info->options_len = >> + OVS_CB(skb)->tun_info->options_len; >> + >> +error: >> + return err; >> +} >> + >> 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, >> }; > > geneve_get_out_tun_info(), gre_get_out_tun_info(), vxlan_get_out_tun_info(), > lisp_get_out_tun_info() has basically same code. Can you write one function > then call that from all of these functions? _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev