Create psample netlink socket as a pre-step towards receiving
sampled packets.

Signed-off-by: Chris Mi <c...@nvidia.com>
Reviewed-by: Eli Britstein <el...@nvidia.com>
---
 lib/dpif-netlink.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c
index 7da4fb54d..79afef5f1 100644
--- a/lib/dpif-netlink.c
+++ b/lib/dpif-netlink.c
@@ -25,6 +25,7 @@
 #include <net/if.h>
 #include <linux/types.h>
 #include <linux/pkt_sched.h>
+#include <linux/psample.h>
 #include <poll.h>
 #include <stdlib.h>
 #include <strings.h>
@@ -208,6 +209,9 @@ struct dpif_netlink {
     /* Change notification. */
     struct nl_sock *port_notifier; /* vport multicast group subscriber. */
     bool refresh_channels;
+
+    /* receive sampled packets from psample */
+    struct nl_sock *psample_sock;
 };
 
 static void report_loss(struct dpif_netlink *, struct dpif_channel *,
@@ -224,11 +228,13 @@ static int ovs_flow_family;
 static int ovs_packet_family;
 static int ovs_meter_family;
 static int ovs_ct_limit_family;
+static int psample_family;
 
 /* Generic Netlink multicast groups for OVS.
  *
  * Initialized by dpif_netlink_init(). */
 static unsigned int ovs_vport_mcgroup;
+static unsigned int psample_mcgroup;
 
 /* If true, tunnel devices are created using OVS compat/genetlink.
  * If false, tunnel devices are created with rtnetlink and using light weight
@@ -371,6 +377,34 @@ dpif_netlink_open(const struct dpif_class *class 
OVS_UNUSED, const char *name,
     return error;
 }
 
+static int
+open_dpif_psample(struct dpif_netlink *dpif)
+{
+    struct nl_sock *sock;
+    int error;
+
+    dpif->psample_sock = NULL;
+    if (!netdev_is_flow_api_enabled() || !psample_mcgroup) {
+        return 0;
+    }
+
+    error = nl_sock_create(NETLINK_GENERIC, &sock);
+    if (error) {
+        VLOG_WARN("%s: failed to create psample socket", __func__);
+        return error;
+    }
+
+    error = nl_sock_join_mcgroup(sock, psample_mcgroup);
+    if (error) {
+        VLOG_WARN("%s: failed to join psample mcgroup", __func__);
+        nl_sock_destroy(sock);
+        return error;
+    }
+    dpif->psample_sock = sock;
+
+    return 0;
+}
+
 static int
 open_dpif(const struct dpif_netlink_dp *dp, struct dpif **dpifp)
 {
@@ -378,6 +412,7 @@ open_dpif(const struct dpif_netlink_dp *dp, struct dpif 
**dpifp)
 
     dpif = xzalloc(sizeof *dpif);
     dpif->port_notifier = NULL;
+    open_dpif_psample(dpif);
     fat_rwlock_init(&dpif->upcall_lock);
 
     dpif_init(&dpif->dpif, &dpif_netlink_class, dp->name,
@@ -615,6 +650,7 @@ dpif_netlink_close(struct dpif *dpif_)
     struct dpif_netlink *dpif = dpif_netlink_cast(dpif_);
 
     nl_sock_destroy(dpif->port_notifier);
+    nl_sock_destroy(dpif->psample_sock);
 
     fat_rwlock_wrlock(&dpif->upcall_lock);
     destroy_all_channels(dpif);
@@ -4098,6 +4134,18 @@ dpif_netlink_init(void)
                       "Please update the Open vSwitch kernel module to enable "
                       "the conntrack limit feature.", OVS_CT_LIMIT_FAMILY);
         }
+        if (nl_lookup_genl_family(PSAMPLE_GENL_NAME, &psample_family) < 0) {
+            VLOG_INFO("Generic Netlink family '%s' does not exist. "
+                      "Please make sure the kernel module psample is loaded",
+                      PSAMPLE_GENL_NAME);
+        }
+        if (nl_lookup_genl_mcgroup(PSAMPLE_GENL_NAME,
+                                   PSAMPLE_NL_MCGRP_SAMPLE_NAME,
+                                   &psample_mcgroup) < 0) {
+            VLOG_INFO("Failed to join multicast group '%s' for Generic "
+                      "Netlink family '%s'", PSAMPLE_NL_MCGRP_SAMPLE_NAME,
+                      PSAMPLE_GENL_NAME);
+        }
 
         ovs_tunnels_out_of_tree = dpif_netlink_rtnl_probe_oot_tunnels();
 
-- 
2.21.1

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to