Add notify message handling for LAG interfaces.
Change-Id: I8900d00207768e349c9d7e7936aa288278154bd8
Signed-off-by: Tushar Mathur <tushar@codeaurora.org>
diff --git a/nss_lag.c b/nss_lag.c
index a39bd36..cdb0d96 100755
--- a/nss_lag.c
+++ b/nss_lag.c
@@ -66,3 +66,98 @@
return NSS_TX_SUCCESS;
}
EXPORT_SYMBOL(nss_lag_tx);
+
+/**
+ * nss_register_lag_if()
+ */
+void nss_register_lag_if(uint32_t if_num,
+ nss_lag_callback_t lag_cb,
+ nss_lag_event_callback_t lag_ev_cb,
+ struct net_device *netdev)
+{
+ nss_assert((if_num != NSS_LAG0_INTERFACE_NUM) && (if_num != NSS_LAG1_INTERFACE_NUM));
+
+ nss_top_main.if_ctx[if_num] = netdev;
+ nss_top_main.if_rx_callback[if_num] = lag_cb;
+ nss_top_main.lag_event_callback = lag_ev_cb;
+}
+EXPORT_SYMBOL(nss_register_lag_if);
+
+
+/**
+ * nss_unregister_lag_if()
+ */
+void nss_unregister_lag_if(uint32_t if_num)
+{
+ nss_assert((if_num != NSS_LAG0_INTERFACE_NUM) && (if_num != NSS_LAG1_INTERFACE_NUM));
+
+ nss_top_main.if_rx_callback[if_num] = NULL;
+ nss_top_main.if_ctx[if_num] = NULL;
+ nss_top_main.lag_event_callback = NULL;
+}
+EXPORT_SYMBOL(nss_unregister_lag_if);
+
+
+/**
+ * nss_lag_handler()
+ */
+void nss_lag_handler(struct nss_ctx_instance *nss_ctx,
+ struct nss_cmn_msg *ncm,
+ void *app_data)
+{
+ struct nss_lag_msg *lm = (struct nss_lag_msg *)ncm;
+ void *ctx = NULL;
+ nss_lag_event_callback_t cb;
+
+ BUG_ON(ncm->interface != NSS_LAG0_INTERFACE_NUM
+ && ncm->interface != NSS_LAG1_INTERFACE_NUM);
+
+ if (ncm->type >= NSS_TX_METADATA_LAG_MAX) {
+ nss_warning("%p: received invalid message %d for LAG interface", nss_ctx, ncm->type);
+ return;
+ }
+
+ if (ncm->len > sizeof(struct nss_lag_msg)) {
+ nss_warning("%p: invalid length for LAG message: %d", nss_ctx, ncm->len);
+ return;
+ }
+
+ /**
+ * Update the callback and app_data for NOTIFY messages.
+ * LAG sends all notify messages to the same callback.
+ */
+ if (ncm->response == NSS_CMM_RESPONSE_NOTIFY) {
+ ncm->cb = (uint32_t)nss_ctx->nss_top->lag_event_callback;
+ }
+
+ /**
+ * Log failures
+ */
+ nss_core_log_msg_failures(nss_ctx, ncm);
+
+ /**
+ * Do we have a call back
+ */
+ if (!ncm->cb) {
+ return;
+ }
+
+ /**
+ * callback
+ */
+ cb = (nss_lag_event_callback_t)ncm->cb;
+ ctx = nss_ctx->nss_top->if_ctx[ncm->interface];
+
+ cb(ctx, lm);
+}
+
+
+/**
+ * nss_lag_register_handler()
+ */
+void nss_lag_register_handler(void)
+{
+ nss_core_register_handler(NSS_LAG0_INTERFACE_NUM, nss_lag_handler, NULL);
+ nss_core_register_handler(NSS_LAG1_INTERFACE_NUM, nss_lag_handler, NULL);
+}
+