@@ -395,6 +395,7 @@ lib_libopenvswitch_la_SOURCES += \
lib/dpif-netlink-rtnl.h \
lib/if-notifier.c \
lib/if-notifier.h \
+ lib/if-notifier-dpdk.h \
lib/netdev-linux.c \
lib/netdev-linux.h \
lib/netdev-linux-private.h \
@@ -426,7 +427,8 @@ if DPDK_NETDEV
lib_libopenvswitch_la_SOURCES += \
lib/dpdk.c \
lib/netdev-dpdk.c \
- lib/netdev-offload-dpdk.c
+ lib/netdev-offload-dpdk.c \
+ lib/if-notifier-dpdk.c
else
lib_libopenvswitch_la_SOURCES += \
lib/dpdk-stub.c
new file mode 100644
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2019 Red Hat, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <config.h>
+
+#include "if-notifier-dpdk.h"
+#include "ovs-thread.h"
+#include "openvswitch/list.h"
+
+static struct ovs_mutex dpdk_notifiers_mutex = OVS_MUTEX_INITIALIZER;
+static struct ovs_list dpdk_all_notifiers OVS_GUARDED_BY(dpdk_notifiers_mutex) \
+ = OVS_LIST_INITIALIZER(&dpdk_all_notifiers);
+
+struct dpdk_notifier {
+ struct ovs_list node;
+ dpdk_notify_func *cb;
+ void *aux;
+};
+
+struct dpdk_notifier *
+dpdk_notifier_create(dpdk_notify_func *cb, void *aux)
+{
+ struct dpdk_notifier *new = xmalloc(sizeof *new);
+
+ ovs_mutex_lock(&dpdk_notifiers_mutex);
+
+ new->cb = cb;
+ new->aux = aux;
+ ovs_list_push_back(&dpdk_all_notifiers, &new->node);
+
+ ovs_mutex_unlock(&dpdk_notifiers_mutex);
+
+ return new;
+}
+
+void
+dpdk_notifier_destroy(struct dpdk_notifier *notifier)
+{
+ if (!notifier) {
+ return;
+ }
+
+ ovs_mutex_lock(&dpdk_notifiers_mutex);
+
+ ovs_list_remove(¬ifier->node);
+ free(notifier);
+
+ ovs_mutex_unlock(&dpdk_notifiers_mutex);
+}
+
+void
+dpdk_notifierr_report_link(void)
+{
+ struct dpdk_notifier *notifier;
+
+ ovs_mutex_lock(&dpdk_notifiers_mutex);
+
+ LIST_FOR_EACH (notifier, node, &dpdk_all_notifiers) {
+ if (!notifier->cb) {
+ continue;
+ }
+
+ notifier->cb(notifier->aux);
+ }
+
+ ovs_mutex_unlock(&dpdk_notifiers_mutex);
+}
+
+
new file mode 100644
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2019 Red Hat, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef IF_NOTIFIER_DPDK_H
+#define IF_NOTIFIER_DPDK_H 1
+
+typedef void dpdk_notify_func(void *aux);
+
+struct dpdk_notifier;
+
+#ifdef DPDK_NETDEV
+
+struct dpdk_notifier *dpdk_notifier_create(dpdk_notify_func *cb, void *aux);
+void dpdk_notifier_destroy(struct dpdk_notifier *notifier);
+void dpdk_notifierr_report_link(void);
+
+#else
+
+static inline struct dpdk_notifier *dpdk_notifier_create(
+ dpdk_notify_func *cb OVS_UNUSED, void *aux OVS_UNUSED)
+{
+ return NULL;
+}
+
+static inline void dpdk_notifier_destroy(
+ struct dpdk_notifier *notifier OVS_UNUSED)
+{
+}
+
+#endif
+
+
+#endif /* if-notifier-dpdk.h */
@@ -18,9 +18,11 @@
#include "if-notifier.h"
#include "rtnetlink.h"
#include "util.h"
+#include "if-notifier-dpdk.h"
struct if_notifier {
- struct nln_notifier *notifier;
+ struct nln_notifier *nl_notifier;
+ struct dpdk_notifier *dpdk_notifier;
if_notify_func *cb;
void *aux;
};
@@ -33,6 +35,15 @@ if_notifier_cb(const struct rtnetlink_change *change OVS_UNUSED, void *aux)
notifier->cb(notifier->aux);
}
+static void
+dpdk_if_notifier_cb(void *aux)
+{
+ struct if_notifier *notifier;
+ notifier = aux;
+ notifier->cb(notifier->aux);
+}
+
+
struct if_notifier *
if_notifier_create(if_notify_func *cb, void *aux)
{
@@ -40,7 +51,10 @@ if_notifier_create(if_notify_func *cb, void *aux)
notifier = xmalloc(sizeof *notifier);
notifier->cb = cb;
notifier->aux = aux;
- notifier->notifier = rtnetlink_notifier_create(if_notifier_cb, notifier);
+ notifier->nl_notifier = rtnetlink_notifier_create(if_notifier_cb,
+ notifier);
+ notifier->dpdk_notifier = dpdk_notifier_create(dpdk_if_notifier_cb,
+ notifier);
return notifier;
}
@@ -48,7 +62,8 @@ void
if_notifier_destroy(struct if_notifier *notifier)
{
if (notifier) {
- rtnetlink_notifier_destroy(notifier->notifier);
+ rtnetlink_notifier_destroy(notifier->nl_notifier);
+ dpdk_notifier_destroy(notifier->dpdk_notifier);
free(notifier);
}
}
This patch adds support for DPDK to notify link layer changes trough the if_notifier_xxx() APIs. Signed-off-by: Eelco Chaudron <echaudro@redhat.com> --- lib/automake.mk | 4 ++ lib/if-notifier-dpdk.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++ lib/if-notifier-dpdk.h | 46 +++++++++++++++++++++++++++ lib/if-notifier.c | 21 +++++++++++- 4 files changed, 149 insertions(+), 4 deletions(-) create mode 100644 lib/if-notifier-dpdk.c create mode 100644 lib/if-notifier-dpdk.h