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);
+}
+