aboutsummaryrefslogtreecommitdiffstats
path: root/net/openvswitch/actions.c
diff options
context:
space:
mode:
authorWenyu Zhang <wenyuz@vmware.com>2014-11-06 09:51:24 -0500
committerPravin B Shelar <pshelar@nicira.com>2014-11-09 21:58:44 -0500
commit8f0aad6f35f7e8b3118b7b8a65e8e76b135cc4cb (patch)
tree5f3dd8374c3c1584cb2b516f4191e70b82472f68 /net/openvswitch/actions.c
parent9ba559d9ca3711940be3e7207dac13c4f0654d43 (diff)
openvswitch: Extend packet attribute for egress tunnel info
OVS vswitch has extended IPFIX exporter to export tunnel headers to improve network visibility. To export this information userspace needs to know egress tunnel for given packet. By extending packet attributes datapath can export egress tunnel info for given packet. So that userspace can ask for egress tunnel info in userspace action. This information is used to build IPFIX data for given flow. Signed-off-by: Wenyu Zhang <wenyuz@vmware.com> Acked-by: Romain Lenglet <rlenglet@vmware.com> Acked-by: Ben Pfaff <blp@nicira.com> Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
Diffstat (limited to 'net/openvswitch/actions.c')
-rw-r--r--net/openvswitch/actions.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c
index f7e589159e4a..ceb618cf1292 100644
--- a/net/openvswitch/actions.c
+++ b/net/openvswitch/actions.c
@@ -564,6 +564,7 @@ static void do_output(struct datapath *dp, struct sk_buff *skb, int out_port)
564static int output_userspace(struct datapath *dp, struct sk_buff *skb, 564static int output_userspace(struct datapath *dp, struct sk_buff *skb,
565 struct sw_flow_key *key, const struct nlattr *attr) 565 struct sw_flow_key *key, const struct nlattr *attr)
566{ 566{
567 struct ovs_tunnel_info info;
567 struct dp_upcall_info upcall; 568 struct dp_upcall_info upcall;
568 const struct nlattr *a; 569 const struct nlattr *a;
569 int rem; 570 int rem;
@@ -572,6 +573,7 @@ static int output_userspace(struct datapath *dp, struct sk_buff *skb,
572 upcall.key = key; 573 upcall.key = key;
573 upcall.userdata = NULL; 574 upcall.userdata = NULL;
574 upcall.portid = 0; 575 upcall.portid = 0;
576 upcall.egress_tun_info = NULL;
575 577
576 for (a = nla_data(attr), rem = nla_len(attr); rem > 0; 578 for (a = nla_data(attr), rem = nla_len(attr); rem > 0;
577 a = nla_next(a, &rem)) { 579 a = nla_next(a, &rem)) {
@@ -583,7 +585,24 @@ static int output_userspace(struct datapath *dp, struct sk_buff *skb,
583 case OVS_USERSPACE_ATTR_PID: 585 case OVS_USERSPACE_ATTR_PID:
584 upcall.portid = nla_get_u32(a); 586 upcall.portid = nla_get_u32(a);
585 break; 587 break;
588
589 case OVS_USERSPACE_ATTR_EGRESS_TUN_PORT: {
590 /* Get out tunnel info. */
591 struct vport *vport;
592
593 vport = ovs_vport_rcu(dp, nla_get_u32(a));
594 if (vport) {
595 int err;
596
597 err = ovs_vport_get_egress_tun_info(vport, skb,
598 &info);
599 if (!err)
600 upcall.egress_tun_info = &info;
601 }
602 break;
586 } 603 }
604
605 } /* End of switch. */
587 } 606 }
588 607
589 return ovs_dp_upcall(dp, skb, &upcall); 608 return ovs_dp_upcall(dp, skb, &upcall);