diff -Naur /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/include/appl/diag/bal_cmd.h sdk-all-6.5.7/include/appl/diag/bal_cmd.h
--- /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/include/appl/diag/bal_cmd.h	1970-01-01 02:00:00.000000000 +0200
+++ sdk-all-6.5.7/include/appl/diag/bal_cmd.h	2017-01-26 11:24:18.251278489 +0200
@@ -0,0 +1,22 @@
+/******************************************************************************
+ *  
+ *  Copyright 2016 - Broadcom Corporation
+ *    
+ ******************************************************************************/  
+
+#ifndef BAL_CMD_H
+#define BAL_CMD_H
+
+#include <appl/diag/shell.h>
+ 
+static char cmd_bal_usage[] = 
+    "bal [cmd]\n\t"
+    "Commands:\n\t"
+    "  trap_target <target_ip:port>  - Set a remote ip and port to receive local cpu trapped packets\n\t"
+    "  trap_receive <sender_ip:port> - Set a local port to receive remote sender_ip messages \n\t"
+    "\n\t"
+    "When called with no parameters, initialize the BAL BCM Api and enter the bal sub-shell.\n";
+
+cmd_result_t cmd_bal(int unit, args_t *args);
+
+#endif    
diff -Naur /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/include/bcm/rx.h sdk-all-6.5.7/include/bcm/rx.h
--- /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/include/bcm/rx.h	2016-12-01 05:15:05.000000000 +0200
+++ sdk-all-6.5.7/include/bcm/rx.h	2017-01-26 11:30:12.960122166 +0200
@@ -1789,5 +1789,18 @@
     bcm_rx_cosq_mapping_t *rx_cosq_mapping);
 
 #endif /* BCM_HIDE_DISPATCHABLE */
+ 
+/*
+ * BAL patch to allow RPC register packet receive callback
+ */
+typedef void (*dpp_rx_cb_f) (
+        int unit,
+        int port,
+        int reason,
+        unsigned char *pkt,
+        int pkt_len);
+
+extern
+void dpp_dft_tx_cb(int unit, int port, int reason, unsigned char *payload, int payload_len);
 
 #endif /* __BCM_RX_H__ */
diff -Naur /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/make/Make.config sdk-all-6.5.7/make/Make.config
--- /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/make/Make.config	2016-12-01 05:16:16.000000000 +0200
+++ sdk-all-6.5.7/make/Make.config	2017-01-26 11:34:39.553494599 +0200
@@ -32,6 +32,13 @@
 # }
 endif
 
+ifeq (${BUILD_ING_AS_LIB},1)
+CFGFLAGS += -DBUILD_ING_AS_LIB -DNO_CTRL_C
+endif
+ifeq (${CONFIG_SWITCH_RPC},y)
+CFGFLAGS += -DCONFIG_SWITCH_RPC
+endif
+
 #
 # Set a default target if one is not set. If override-target is set,
 # then the target will become override-target and a warning is printed
diff -Naur /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/make/Make.local.bal sdk-all-6.5.7/make/Make.local.bal
--- /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/make/Make.local.bal	1970-01-01 02:00:00.000000000 +0200
+++ sdk-all-6.5.7/make/Make.local.bal	2017-01-26 11:36:43.722735752 +0200
@@ -0,0 +1,30 @@
+#FEATURE_LIST := CINT L3 I2C MEM_SCAN EDITLINE TEST BCM_SAL_PROFILE CUSTOMER CHASSIS RCPU ATPTRANS_SOCKET DUNE_UI INTR APIMODE PTP KBP
+FEATURE_LIST := CINT L3 I2C MEM_SCAN EDITLINE TEST BCM_SAL_PROFILE CHASSIS RCPU ATPTRANS_SOCKET DUNE_UI INTR APIMODE PTP 
+
+DEBUG_CFLAGS=-Wdeclaration-after-statement
+
+BCM_PTL_SPT=1
+
+ALL_DPP_CHIPS = 1
+ALL_DFE_CHIPS = 1
+
+# Includes XML library and enables use of "diag pp dump" utility for PP import/export facilities 
+DATAIO_SUPPORT = 1
+KERN_VER=3.7.10
+
+CFGFLAGS += -DSTATIC=static
+CFGFLAGS += -DBCM_WARM_BOOT_SUPPORT
+CFGFLAGS += -DBCM_WARM_BOOT_SUPPORT_SW_DUMP
+CFGFLAGS += -DBCM_EASY_RELOAD_WB_COMPAT_SUPPORT
+CFGFLAGS += -DBCM_CONTROL_API_TRACKING
+CFGFLAGS += -D__DUNE_LINUX_BCM_CPU_PCIE__
+CFGFLAGS += -DPHYS_ADDRS_ARE_64BITS -DSAL_BDE_32BIT_USER_64BIT_KERNEL
+CFGFLAGS += -D_SIMPLE_MEMORY_ALLOCATION_=0 -DUSE_LINUX_BDE_MMAP=1
+CFGFLAGS += -DSCACHE_CRC_CHECK
+
+CFGFLAGS += -DBROADCOM_SVK
+
+#KBP_DEVICE := KBP_ALG
+
+VENDOR_LIST=CUSTOMER78 BROADCOM DNX
+
diff -Naur /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/make/Makefile.unix-linux sdk-all-6.5.7/make/Makefile.unix-linux
--- /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/make/Makefile.unix-linux	2016-12-01 05:16:17.000000000 +0200
+++ sdk-all-6.5.7/make/Makefile.unix-linux	2017-01-26 13:16:35.035828648 +0200
@@ -47,7 +47,7 @@
 
 
 # Linux
-LIBS= -lnsl -lpthread -lm -lrt
+LIBS= -lnsl -pthread -lm -lrt
 CFGFLAGS += -DBCM_PLATFORM_STRING=\"unix-linux\"
 
 # For GCC 4.2.x, add -Wno-address
diff -Naur /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/make/Makefile.unix-linux-64 sdk-all-6.5.7/make/Makefile.unix-linux-64
--- /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/make/Makefile.unix-linux-64	2016-12-01 05:16:17.000000000 +0200
+++ sdk-all-6.5.7/make/Makefile.unix-linux-64	2017-01-26 13:17:35.959446054 +0200
@@ -48,7 +48,7 @@
 FEATURE_EXCLUDE_LIST = $(sort $(_FEATURE_EXCLUDE_LIST))
 
 # Linux
-LIBS= -lnsl -lpthread -lm -lrt
+LIBS= -lnsl -pthread -lm -lrt
 
 CFGFLAGS += -DBCM_PLATFORM_STRING=\"unix-linux-64\"
 
diff -Naur /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/make/Makefile.unix-linux~ sdk-all-6.5.7/make/Makefile.unix-linux~
--- /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/make/Makefile.unix-linux~	1970-01-01 02:00:00.000000000 +0200
+++ sdk-all-6.5.7/make/Makefile.unix-linux~	2017-01-26 13:16:34.973829038 +0200
@@ -0,0 +1,60 @@
+# $Id: Makefile.unix-linux,v 1.11 Broadcom SDK $
+# $Copyright: (c) 2016 Broadcom.
+# Broadcom Proprietary and Confidential. All rights reserved.$
+#
+# Build rules for Linux/x86 (Little Endian) with PLI support
+
+include ${SDK}/make/Makefile.unix-common
+
+# When using GDB on Linux, you may want to use "setenv GDB 1" to disable
+# editline.  For best results put "set environment GDB 1" in your .gdbinit.
+
+# Linux-specific Configuration Flags
+
+ENDIAN_DEF = -DLE_HOST=1
+
+# Notes on AMD Athlon 64-bit
+#
+# Compiles on x86_64 default to 32-bit emulation unless 64-bit mode
+# is specifically requested in Make.local by uncommenting the two defines
+# for PTRS_ARE_64BITS and LONGS_ARE_64BITS.
+#
+# Note that the code base will compile in 64-bit mode, but will not run
+# correctly because malloc() can return values >32 bits and the PLISIM
+# protocol only supports 32-bit addresses.
+
+ifeq ($(shell uname -m),x86_64)
+ ifeq (,$(findstring -DPTRS_ARE_64BITS,$(CFGFLAGS)))
+  CC = ${HCC} -m32
+  CXX = g++ -m32
+ else
+  CC = ${HCC}
+  CXX = g++
+ endif
+endif
+
+LD	= ld
+AR	= ar
+ARFLAGS	= -rc
+STRIP	= strip
+RANLIB  = ranlib
+
+# Filter out features that cannot or should not be supported in Linux
+ifdef ESW_CHIPS
+_FEATURE_EXCLUDE_LIST += OOB_RCPU
+endif
+FEATURE_EXCLUDE_LIST = $(sort $(_FEATURE_EXCLUDE_LIST))
+
+
+# Linux
+LIBS= -lnsl -lpthread -lm -lrt
+CFGFLAGS += -DBCM_PLATFORM_STRING=\"unix-linux\"
+
+# For GCC 4.2.x, add -Wno-address
+GCC_MAJOR_VER  = $(shell echo |$(CC) -dM -E -| grep __GNUC__ | cut -d' ' -f3)
+GCC_MINOR_VER  = $(shell echo |$(CC) -dM -E -| grep __GNUC_MINOR__ | cut -d' ' -f3)
+ifeq (${GCC_MAJOR_VER}, 4)
+ifeq (${GCC_MINOR_VER}, 2)
+BCM_EXTRA_CC_CFLAGS   = -Wno-address
+endif
+endif
diff -Naur /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/make/Makefile.unix-netbsd sdk-all-6.5.7/make/Makefile.unix-netbsd
--- /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/make/Makefile.unix-netbsd	2016-12-01 05:16:17.000000000 +0200
+++ sdk-all-6.5.7/make/Makefile.unix-netbsd	2017-01-26 13:13:03.884156251 +0200
@@ -27,7 +27,7 @@
 FEATURE_EXCLUDE_LIST = $(sort $(_FEATURE_EXCLUDE_LIST))
 
 # NetBSD
-LIBS= -lpthread -lm -lsem
++LIBS= -pthread -lm -lsem
 
 CFGFLAGS += -DBCM_PLATFORM_STRING=\"unix-netbsd\"
 
diff -Naur /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/make/Makefile.unix-user sdk-all-6.5.7/make/Makefile.unix-user
--- /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/make/Makefile.unix-user	2016-12-01 05:16:17.000000000 +0200
+++ sdk-all-6.5.7/make/Makefile.unix-user	2017-01-26 13:14:29.289618967 +0200
@@ -42,7 +42,7 @@
 OSTYPE = LINUX
 
 # Linux
-LIBS= -lnsl -lpthread -lm -lrt
+LIBS= -lnsl -pthread -lm -lrt
 
 #
 # ORIGIN is used to Optionally select different CFLAGS. It is used to import
diff -Naur /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/src/appl/diag/bal_cmd.c sdk-all-6.5.7/src/appl/diag/bal_cmd.c
--- /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/src/appl/diag/bal_cmd.c	1970-01-01 02:00:00.000000000 +0200
+++ sdk-all-6.5.7/src/appl/diag/bal_cmd.c	2017-01-26 11:38:20.574144410 +0200
@@ -0,0 +1,837 @@
+/******************************************************************************
+ * 
+ * Copyright 2015- Broadcom Corporation
+ * This program is the proprietary software of Broadcom Corporation
+ * and/or its licensors, and may only be used, duplicated, modified or
+ * distributed pursuant to the terms and conditions of a separate,
+ * written license agreement executed between you and Broadcom (an
+ * "Authorized License").  Except as set forth in an Authorized License,
+ * Broadcom grants no license (express or implied), right to use, or
+ * waiver of any kind with respect to the Software, and Broadcom
+ * expressly reserves all rights in and to the Software and all
+ * intellectual property rights therein.  IF YOU HAVE NO AUTHORIZED
+ * LICENSE, THEN YOU HAVE NO RIGHT TO USE THIS SOFTWARE IN ANY WAY, AND
+ * SHOULD IMMEDIATELY NOTIFY BROADCOM AND DISCONTINUE ALL USE OF THE
+ * SOFTWARE.
+ *   
+ * Except as expressly set forth in the Authorized License,
+ *   
+ * 1.  This program, including its structure, sequence and organization,
+ * constitutes the valuable trade secrets of Broadcom, and you shall use
+ * all reasonable efforts to protect the confidentiality thereof, and to
+ * use this information only in connection with your use of Broadcom
+ * integrated circuit products.
+ *    
+ * 2.  TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED
+ * "AS IS" AND WITH ALL FAULTS AND BROADCOM MAKES NO PROMISES,
+ * REPRESENTATIONS OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR
+ * OTHERWISE, WITH RESPECT TO THE SOFTWARE.  BROADCOM SPECIFICALLY
+ * DISCLAIMS ANY AND ALL IMPLIED WARRANTIES OF TITLE, MERCHANTABILITY,
+ * NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF VIRUSES,
+ * ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR
+ * CORRESPONDENCE TO DESCRIPTION. YOU ASSUME THE ENTIRE RISK ARISING OUT
+ * OF USE OR PERFORMANCE OF THE SOFTWARE.
+ *   
+ * 3.  TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT SHALL BROADCOM
+ * OR ITS LICENSORS BE LIABLE FOR (i) CONSEQUENTIAL, INCIDENTAL, SPECIAL,
+ * INDIRECT, OR EXEMPLARY DAMAGES WHATSOEVER ARISING OUT OF OR IN ANY WAY
+ * RELATING TO YOUR USE OF OR INABILITY TO USE THE SOFTWARE EVEN IF
+ * BROADCOM HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES; OR (ii)
+ * ANY AMOUNT IN EXCESS OF THE AMOUNT ACTUALLY PAID FOR THE SOFTWARE
+ * ITSELF OR U.S. $1, WHICHEVER IS GREATER. THESE LIMITATIONS SHALL APPLY
+ * NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF ANY LIMITED
+ * REMEDY.
+ *   
+ ******************************************************************************/
+ 
+/**
+ * @file bal_cmd.c_
+ * @brief BAL ING CLI commands support SDK access that is not supported by regular CLI
+ * The BAL CLI command line interface is implemented by the CLI
+ * module. The CLI module can be used as the configuration and management
+ * interface for the BAL Switch Util. BAL Switch Util configuration can be specified
+ * using a series of BAL CLI commands. The main purpose of the CLI is to provide
+ * ING API access that are not normally available through public API, such as RPC
+ * access to ING features that are deep in SDK stack.
+ * 
+ **/
+
+ /*@{*/
+ 
+/* --- system includes --- */
+
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <appl/diag/shell.h>
+#include <appl/diag/parse.h>
+#include <sal/appl/sal.h>
+#include <sal/appl/editline/editline.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <bcm/rx.h>
+#include <bcm/error.h>
+#include <bcm/stack.h>
+
+#define BAL_CLI_VERSION  "1.0"
+
+/* --- project includes --- */
+extern int start_trap_service(char *ip_port);
+extern int start_host_listener(char *ip_port);
+
+/* --- local static constants ---*/
+#define BAL_SWITCH_CLI_IP_LEN 128
+typedef struct bal_switch_cli_cfg_t
+{
+   char trap_target[BAL_SWITCH_CLI_IP_LEN];           /* remote ip:port address where the trapped packet sent */
+   char trap_receive[BAL_SWITCH_CLI_IP_LEN];          /* remote ip where the local port receive message  */
+}bal_switch_cli_cfg_t;
+
+static bal_switch_cli_cfg_t g_cur_ctx;
+
+static bal_switch_cli_cfg_t *gp_cur_ctx = &g_cur_ctx;
+
+enum
+{
+    BAL_REASON_SEND_TO_NNI = 1,
+    BAL_REASON_SEND_TO_PON
+};
+      
+/**
+ *  * @brief Maximum number of arguments supported by the 'bal' CLI command
+ *   */
+#define MAX_ARGS 10
+
+/**
+ ** @brief BAL CLI help text
+ **/
+#define HELP                                                           \
+"exit          - Exit the BAL sub-shell\n"                             \
+"show          - Show current settings\n"                              \
+"trap_target   - register callback and send CPU trapped packets to remote IP:PORT\n"              \
+"trap_receive  - Start a receiving thread to listen on PORT for messages from remote IP \n"       \
+
+
+/**
+ ** @brief BAL Switch App help text specific to 'show' commands
+ **/
+#define SHOW_HELP                                               \
+"show config   - Display the BAL CLI configuration\n"           \
+"show version  - Display the BAL BCM SDK version\n"             \
+
+
+/**
+ *  @brief CLI prompt string
+ * */
+static char g_bal_cli_prompt[8];
+
+
+/*
+ * @brief BAL Switch App help text
+ *
+ * @return char*  A string containing the prompt to display
+ **/
+static char *bal_set_prompt()
+{
+    sprintf(g_bal_cli_prompt, "bal>");
+    return g_bal_cli_prompt;
+}
+
+/**
+ *  @brief Parse a line of input into a POSIX-like argument list
+ * 
+ ** @param parsed_input  Unparsed line of CLI input
+ ** @param argc         Pointer to the number of arguments in the list
+ ** @param argv         Pointer to the argument list
+ ** @return int         Number of argument that has been successfully parsed
+ **/
+int bal_parse_input (char *parsed_input, int *argc, char **argv)
+{
+    char *s;
+    int largc;
+
+    largc = 0;
+    s = parsed_input;
+    while ((largc < MAX_ARGS) && (s != NULL) && (*s != 0))
+    {
+        /* Skip leading whitespace */
+        s += strspn (s, " \t");
+
+        /* Non-whitespace found */
+        if (*s != 0)
+        { 
+            /* Add the string to the argument list */
+            argv[largc++] = s;
+
+            /* Find the trailing whitespace (if any...) */
+            s = strpbrk (s, " \t");
+            if (s != NULL)
+            { 
+                /* Found some white space, null out the first white
+                   space character. */ 
+                if (largc < MAX_ARGS)
+                {
+                    *s++ = 0;
+                }
+
+                /* Otherwise, don't null the last param, to pass it on
+                 * command to parse themselves 
+                 */
+            }
+        }
+    }
+
+    *argc = largc;
+
+    return largc;
+}
+
+ /* BAL packet_in function and definitions */
+ typedef struct
+  {
+      int socket;
+      struct sockaddr_in addr;
+  }trap_target_t;
+  static trap_target_t s_target_device;
+  static int target_init = 0;
+  #define DEFAULT_SOP_ADJ    2 
+  #define DEFAULT_REASON_ADJ 4 
+
+  bcm_rx_t trap_service_cb(int unit, bcm_pkt_t *pkt, void *cookie)
+  {
+
+    uint8 *p_payload;
+    int dpp_hdr_len, payload_len, n_sent;
+    trap_target_t *p_target_device = (trap_target_t *)cookie;
+    uint16 *p_src_port, def_sop;
+    uint32 *p_reason, def_reason;
+    /* skip the dpp header - 19 bytes */
+    p_payload = pkt->_pkt_data.data;
+    dpp_hdr_len = pkt->tot_len - pkt->pkt_len + 0;
+    payload_len = pkt->tot_len - dpp_hdr_len;
+    p_payload += dpp_hdr_len;
+
+    /*
+     * replace SOP_ADJ bytes with source port info before send
+     * assuming DEFAULT_SOP_ADJ is always 2 bytes
+     * replace SOP_REASON bytes with trap reason - TBD
+     */
+     p_src_port = (uint16 *)(p_payload - DEFAULT_SOP_ADJ);
+     /* save the original info */
+     def_sop = *(p_src_port);
+     /* replace 2 bytes with ingress port info */
+     *p_src_port = htons(pkt->src_port & 0xff); /* pkt->src_port is 1 byte long */
+
+     p_reason = (uint32 *)(p_payload - DEFAULT_SOP_ADJ - DEFAULT_REASON_ADJ);
+     /* save the original info */
+     def_reason = *(p_reason);
+     /* replace 4 bytes with reason code */
+     *p_reason = htonl(pkt->rx_trap_data);
+
+     n_sent = sendto(p_target_device->socket,
+                     p_payload-DEFAULT_SOP_ADJ-DEFAULT_REASON_ADJ,
+                     payload_len+DEFAULT_SOP_ADJ+DEFAULT_REASON_ADJ, 0,
+                     (struct sockaddr *) &(p_target_device->addr),
+                     sizeof(struct sockaddr_in));
+
+     /* put back the original values */
+     *p_src_port = def_sop;
+     *p_reason   = def_reason;
+
+     if (n_sent > 0)
+         return BCM_RX_HANDLED;
+     else
+         return BCM_RX_NOT_HANDLED;
+  }
+
+ int start_trap_service( char *ip_port) 
+  {
+      int ret, port;
+      char ip[80], *col;
+
+      if(target_init == 0)
+      {
+          if((s_target_device.socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
+          {
+              return -1;
+          }
+          target_init = 1;
+      }
+      /* fill in traget device info - ip_port has the format of ip:port, so look for ":" for separation */
+      col = strstr(ip_port, ":");
+      port = atoi(col+1);
+      /* terminate the string at the end of IP address */
+      *col = 0;
+      strcpy(ip, ip_port);
+
+      s_target_device.addr.sin_family = AF_INET;
+      s_target_device.addr.sin_port = htons(port);
+      s_target_device.addr.sin_addr.s_addr = inet_addr(ip);
+
+      ret = bcm_rx_register(0, "Cpu Traps", trap_service_cb, 50, (void *)&s_target_device, BCM_RCO_F_ALL_COS);
+      return ret;
+  }
+
+/**
+ ** @brief CLI parser and handler for 'trap_target' commands
+ **
+ ** This routine handles the 'bal trap_target [args]' CLI app configuration
+ ** commands.
+ **
+ ** @param argc  Pointer to the number of arguments in the list
+ ** @param argv  Pointer to the argument list
+ * */
+void bal_bcm_cli_trap_target(int argc, char **argv)
+{
+
+    if (argc != 1)
+    {
+        printf("Invalid arguments\n");
+        return;
+    }
+
+    {
+        strcpy(gp_cur_ctx->trap_target, argv[0]);
+        /* Configure the trap target with the specified setting. */
+        if (start_trap_service(argv[0]) != 0)
+        {
+            printf("Error, failed to start trap service on '%s'\n", 
+                   argv[0]);
+        }
+    }
+}
+
+typedef struct
+{
+      int udp_port;
+      sal_thread_t threadid;
+      dpp_rx_cb_f callback;
+}trap_context_t;
+
+  static trap_context_t trap_ctx = {0};
+  static int listener_init = 0;
+
+#define MAX_RX_PACKET_SIZE (2000)
+
+static void host_receive(void *p_user_data)
+{
+    int rc;
+    int sUDPSocket;
+    unsigned char cBuffer[MAX_RX_PACKET_SIZE];
+    int nBytesRecv = 0;
+    int nBufSize = MAX_RX_PACKET_SIZE;
+    socklen_t nReceiveAddrSize = 0;
+    int maxfd;
+    fd_set read_fds;
+    struct timeval tv;
+    uint16 *p_dst_port, dst_port;
+    trap_context_t *p_trap_ctx = (trap_context_t *)p_user_data;
+    uint32 *p_reason, reason;
+    struct sockaddr_in sReceiveFromAddr;
+
+    /* Create a connectionless socket */
+    sUDPSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+    /* Check to see if we have a valid socket */
+    if(sUDPSocket < 0)
+    {
+        printf(" host_receive:create socket failed\n");
+        return;
+    }
+
+    /* Setup a bind on the socket, telling us what port and
+     * adapter to receive datagrams on.
+     * NOTE: we accept UDP packets from any sender as long
+     * as they arrive on the specified port.
+     */
+     memset(&sReceiveFromAddr, 0, sizeof(struct sockaddr_in));
+
+     sReceiveFromAddr.sin_family = AF_INET;
+     sReceiveFromAddr.sin_port = htons(p_trap_ctx->udp_port);
+     sReceiveFromAddr.sin_addr.s_addr = htonl(INADDR_ANY);
+
+     rc = bind(sUDPSocket, (struct sockaddr *)&sReceiveFromAddr,
+                            sizeof(struct sockaddr_in));
+     if (rc < 0)
+     {
+          printf("host_receive:bind failed\n");
+          return;
+     }
+
+     // Receive a datagram from another device
+     while(1)
+     {
+         FD_ZERO(&read_fds);
+         FD_SET(sUDPSocket, &read_fds);
+         maxfd = sUDPSocket;
+         /* Set the timeout */
+         tv.tv_sec  = 1;
+         tv.tv_usec = 0;  /*  1 seconds */
+         rc = select(maxfd + 1, &read_fds, NULL, NULL, &tv);
+
+         if (rc < 0)
+         {
+             printf(" host_receive:select failed err = %d\n", rc);
+             break;
+         }
+         if (rc == 0)
+         {
+             fflush(stdout);
+             continue;
+         }
+         // Get the datagram
+                                                                                                                                          nBytesRecv = recvfrom(sUDPSocket, cBuffer, nBufSize, 0,
+                               (struct sockaddr *) &sReceiveFromAddr,
+                               &nReceiveAddrSize);
+                                                                                                                                          printf("Got %d bytes message \n", nBytesRecv);
+                                                                                                                                          /* the first 4 bytes are reason */
+         p_reason = (uint32 *)(cBuffer);
+         reason = ntohl(*p_reason);
+
+         /* the next 2 bytes are destination port */
+         p_dst_port = (uint16 *)(cBuffer + DEFAULT_REASON_ADJ);
+         dst_port = ntohs(*p_dst_port);
+
+         /* call the register callback here - set unit to 0 as it is don't care */
+         if(p_trap_ctx->callback)
+         {
+             p_trap_ctx->callback(0,
+                                  dst_port,
+                                  reason,
+                                  cBuffer+DEFAULT_SOP_ADJ+DEFAULT_REASON_ADJ,
+                                  nBytesRecv-DEFAULT_SOP_ADJ-DEFAULT_REASON_ADJ);
+         }
+       }
+       close(sUDPSocket);
+
+       return;
+}
+
+
+void dpp_dft_tx_cb(int unit, int dst_port, int reason, unsigned char *payload, int payload_len)
+{
+
+    int i;
+    bcm_pkt_t *tx_pkt;
+    uint8_t tx_pkt_dune_header[6];
+    uint32_t tx_pkt_offset = 0;
+    bcm_gport_t sys_gport;
+    bcm_gport_t local_gport;
+    bcm_port_t sysport = 0;
+    bcm_gport_t local_cpu_port = 0;
+    int sdk_rc;
+
+    printf("Msg from core:\n");
+    printf(" dst port:%d, rcv reason: 0x%x, ", dst_port, reason);
+
+    /* dump out first  32 bytes */
+    printf("payload (first 12 bytes): ");
+    for(i=0; i<12; i++)
+    {
+      if(i%6 == 0 && i) printf(" ");
+      printf("%02x", payload[i]);
+    }
+    printf("\n");
+
+
+    /* Map the local port number to a CPU "system" port. */
+    local_gport = dst_port;
+    sdk_rc = bcm_stk_gport_sysport_get(unit, local_gport, &sys_gport);
+    if (sdk_rc != BCM_E_NONE)
+    {
+      /* Error */
+      printf("%s(): [PacketOut] bcm_stk_gport_sysport_get returned with failure code '%s'\n",
+             __FUNCTION__, bcm_errmsg(sdk_rc));
+      return;
+    }
+
+    sysport = sys_gport & 0xff;
+
+       /* Get the local CPU port */
+    sdk_rc = bcm_port_local_get(unit, BCM_GPORT_LOCAL_CPU, &local_cpu_port);
+    if (sdk_rc != BCM_E_NONE)
+    {
+      /* Error */
+      printf("%s(): [PacketOut] bcm_port_local_get returned with failure code '%s'\n",
+             __FUNCTION__, bcm_errmsg(sdk_rc));
+      return;
+    }
+
+    /* Allocate a packet structure */
+    sdk_rc = bcm_pkt_alloc(unit, payload_len+sizeof(tx_pkt_dune_header), 0, &tx_pkt);
+
+    if (sdk_rc != BCM_E_NONE)
+    {
+      /* Error */
+      printf("%s(): [PacketOut] bcm_pkt_alloc returned with failure code '%s'\n",
+             __FUNCTION__, bcm_errmsg(sdk_rc));
+      return;
+    }
+
+    /* Set up the packet for a single block */
+    tx_pkt->call_back = 0;
+    tx_pkt->blk_count = 1;
+    tx_pkt->unit = unit;
+
+    /* Dune TM header */
+    tx_pkt->_dpp_hdr[3] = 0x00; /* channel num */
+    tx_pkt->_dpp_hdr[2] = 0x00;
+    tx_pkt->_dpp_hdr[1] = 0x00;
+    tx_pkt->_dpp_hdr[0] = 0x00;
+
+    tx_pkt->_dpp_hdr_type = 1;  /* DPP_HDR_itmh_base */
+
+    /* PTCH */
+    tx_pkt_dune_header[0] = 0x50;
+    tx_pkt_dune_header[1] = local_cpu_port;
+
+    /* ITMH */
+    tx_pkt_dune_header[2] = 0x01;
+    tx_pkt_dune_header[3] = 0x00;
+    tx_pkt_dune_header[4] = (sysport & 0xff); /* Destination port */
+    tx_pkt_dune_header[5] = 0x00;
+
+   /* Insert the DUNE header into the packet */
+    bcm_pkt_memcpy (tx_pkt, tx_pkt_offset, tx_pkt_dune_header, sizeof(tx_pkt_dune_header));
+    tx_pkt_offset += sizeof(tx_pkt_dune_header);
+
+    /* Insert the payload into the packet */
+    bcm_pkt_memcpy (tx_pkt, tx_pkt_offset, payload, payload_len);
+    tx_pkt_offset += payload_len;
+
+    printf("%s(): [PacketOut] transmitting a %d length packet, "
+           "sys_gport:0x%X, sysport: %d\n",
+           __FUNCTION__,
+           payload_len,
+           sys_gport,
+           sysport);
+
+    /* Transmit the packet */
+    sdk_rc = bcm_tx(unit, tx_pkt, NULL);
+    if (sdk_rc != BCM_E_NONE)
+    {
+      /* Error */
+      printf( "%s():  bcm_tx returned with failure code '%s'\n",
+              __FUNCTION__, bcm_errmsg(sdk_rc));
+    }
+
+    /* Cleanup */
+    bcm_pkt_free(unit, tx_pkt);
+
+    return;
+}
+
+void dpp_dft_msg_cb(int unit, int dst_port, int reason, unsigned char *payload, int payload_len)
+{
+
+    int i, len;  
+
+    printf("Msg from core:\n");
+    printf(" dst port:%d, rcv reason: 0x%x, ", dst_port, reason);
+
+    len = (payload_len > 32)? 32: payload_len;
+    
+    /* dump out first  32 bytes */
+    printf("payload (first %d bytes): ", len);
+    for(i=0; i<len; i++)
+    {
+      if(i%8 == 0 && i) printf(" ");
+      printf("%02x", payload[i]);
+    }
+    printf("\n");
+    
+    return;
+}
+
+void dpp_dft_host_cb(int unit, int dst_port, int reason, unsigned char *payload, int payload_len)
+{
+    switch(reason)
+    {
+        case BAL_REASON_SEND_TO_NNI:
+        case BAL_REASON_SEND_TO_PON:
+            dpp_dft_tx_cb(unit, dst_port, reason, payload, payload_len);
+        break;
+        default:
+            dpp_dft_msg_cb(unit, dst_port, reason, payload, payload_len);
+        break;
+    }
+    return;
+}
+
+
+
+
+
+
+
+
+
+
+/*
+ * This is the function that is called to start a thread to listen for
+ * packets sent from BAL to bcm.user for injection into the switch.
+ *  
+ * This happens when the user includes the trap_receive identifier in 
+ * the rpc.soc file that is co-resident with the bcm.user executable.
+ * 
+ ** An example line in the rpc.soc file might be:
+ *
+ *  dune "sand trap_receive 10.3.2.2:50003"
+ * 
+ *  This line specifies to listen on port 50003 and that messages will
+ *  arrive from IP 10.3.2.2 (although the IP address is not respected
+ *  in this code).
+ * 
+ *  */
+int start_host_listener(char *ip_port)
+  {
+
+    char *col;
+
+    if(listener_init != 0)
+      {
+          return 0;
+      }
+
+      /* fill in host listener info - ip_port has the format of ip:port, so look for ":" for separation */
+      col = strstr(ip_port, ":");
+      trap_ctx.udp_port = atoi(col+1);
+
+      /* register a default handler */
+      trap_ctx.callback = dpp_dft_host_cb;
+
+      /* spawn a thread to listen to socket */
+      trap_ctx.threadid = sal_thread_create("trap_rx", 8192, 50, host_receive, &trap_ctx);
+
+      if (trap_ctx.threadid == SAL_THREAD_ERROR)
+      {
+          return -2;
+      }
+
+      listener_init = 1;
+      return 0;
+  }
+                       
+/**
+ ** @brief CLI parser and handler for 'trap_receive' commands
+ **
+ ** This routine handles the 'bal trap_receive [args]' CLI app configuration
+ ** commands.
+ **
+ ** @param argc  Pointer to the number of arguments in the list
+ ** @param argv  Pointer to the argument list
+ * */
+void bal_bcm_cli_trap_receive(int argc, char **argv)
+{
+
+    if (argc != 1)
+    {
+        printf("Invalid arguments\n");
+        return;
+    }
+
+    {
+        strcpy(gp_cur_ctx->trap_receive, argv[0]);
+        /* Configure the msg receiver  with the specified setting. */
+        if (start_host_listener(argv[0]) != 0)
+        {
+            printf("Error, failed to start trap listener on '%s'\n", 
+                   argv[0]);
+        }
+    }
+}
+
+/**
+ ** @brief Handler for the 'bal show version' command
+ **
+ ** This routine handles the 'bal show version' CLI command 
+ ** and show version information on the console.
+ **
+ **/
+void bal_bcm_show_version(void)
+{
+
+    /* Print out the software revision information */
+    printf("Broadcom Software, Broadband Abstraction Layer, CLI Version %s \n", 
+           BAL_CLI_VERSION); 
+}
+
+
+/**
+ ** @brief CLI parser and handler for 'show' commands
+ **
+ ** This routine handles the 'bal show [args]' CLI app commands.
+ **
+ ** @param argc  Pointer to the number of arguments in the list
+ ** @param argv  Pointer to the argument list
+ **/
+void bal_bcm_cli_show(int argc, char **argv)
+{
+    char *show_cmd;
+       
+    show_cmd = argv[0];
+
+    if (argc == 0)
+    {
+        printf("Error: missing show sub-command.\n");
+        printf("%s", SHOW_HELP);
+        return;
+    }
+    
+    show_cmd = argv[0];
+
+    if (sal_strcasecmp(show_cmd, "config") == 0)
+    {
+        printf("BAL BCM App Configuration:\n");
+        printf("--------------------------------\n");
+        printf("trap_target ip_port  = %s\n",   gp_cur_ctx->trap_target);
+        printf("trap_receive ip_port = %s\n",   gp_cur_ctx->trap_receive);
+    }
+    else if (sal_strcasecmp(show_cmd, "version") == 0)
+    {
+        bal_bcm_show_version();
+    }
+    else if (sal_strcasecmp(show_cmd, "help") == 0 ||
+             sal_strcasecmp(show_cmd, "?") == 0)
+    {
+        printf("%s", SHOW_HELP);
+    }
+    else
+    {
+        printf("Error: unknown show command '%s'.\n", show_cmd);
+    }
+}
+
+/**
+ ** @brief Executes a command as specified by a single line of CLI input
+ **
+ ** @param argc  Pointer to the number of arguments in the list
+ ** @param argv  Pointer to the argument list
+ **/
+void DoCmd(int argc, char **argv)
+{
+    char *cmd;
+
+    if (argc == 0 || argv[0] == NULL)
+    {
+        return;
+    }
+
+    cmd = argv[0];
+
+    printf("CLI executing command '%s'\n", cmd);
+
+    if (sal_strcasecmp(cmd, "trap_target") == 0)
+    {
+       bal_bcm_cli_trap_target(argc-1, &argv[1]);
+    }
+    else if (sal_strcasecmp(cmd, "trap_receive") == 0)
+    {
+       bal_bcm_cli_trap_receive(argc-1, &argv[1]);
+    }   
+    else if (sal_strcasecmp(cmd, "show") == 0)
+    {
+        bal_bcm_cli_show(argc-1, &argv[1]);
+    }
+    else if (sal_strcasecmp(cmd, "help") == 0 ||
+             sal_strcasecmp(cmd, "?") == 0)
+    {
+        /* Display help */
+        printf("%s", HELP);
+    }
+    else if (sal_strcasecmp(cmd, "exit") == 0)
+    {
+        return;
+    }
+    else
+    {
+        printf("Unknown command '%s'\n", cmd);
+    }
+}
+
+/**
+ *  * @brief Main processing loop for the CLI
+ *   *
+ *    * @param args  Pointer to an BCM SDK formatted argument list
+ *     */
+void bal_cli_shell(args_t *args)
+{
+    char *cmd;
+    int argc = 0;
+    char *argv[MAX_ARGS];
+    static int initialized = 0;
+ 
+    if (initialized == 0)
+    {
+        bal_set_prompt();
+        initialized = 1;
+    }
+
+    if (args->a_argc > 1)
+    {
+
+        DoCmd(args->a_argc-1, &args->a_argv[1]);
+    }
+    else
+    {
+
+        printf("CLI running in interactive mode\n");
+
+        for (;;)
+        {
+            /* use ING editline library, DONT free pointer "cmd" as Linux man readline
+               suggested, it will cause a crash */            
+            cmd = readline(g_bal_cli_prompt);
+            if (*cmd != '\0')
+            {
+                add_history(cmd);
+            }
+            else
+            {
+                continue;
+            }
+            
+            if ((sal_strcasecmp(cmd, "exit") == 0) || (sal_strcasecmp(cmd, "quit") == 0))
+            {
+                printf ("exiting bal shell.\n");
+                break;
+            }
+            
+            bal_parse_input(cmd, &argc, argv);
+            
+            DoCmd(argc, argv);
+            
+        }
+    }
+
+    /* "Consume" all of the command line arguments so the bcm.user shell
+     * does not complain.
+     */
+    args->a_arg = args->a_argc;
+}
+
+/**
+ *   @brief The cmdlist hook for the BAL BCM App CLI command
+ *   
+ *   This file contains the function to "hook" into the main bcm.user
+ *   CLI.
+ *  
+ *  @param unit  SDK unit number
+ *  @param args  Pointer to an BCM SDK formatted argument list
+ *   
+ *  @return cmd_result_t
+ *  
+ * */
+cmd_result_t cmd_bal(int unit, args_t *args)
+{
+   /*  char *subcmd = ARG_GET(args); */
+
+    bal_cli_shell(args);
+
+    return CMD_OK;
+}
+/*@}*/
diff -Naur /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/src/appl/diag/cmdlist.c sdk-all-6.5.7/src/appl/diag/cmdlist.c
--- /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/src/appl/diag/cmdlist.c	2016-12-01 05:16:25.000000000 +0200
+++ sdk-all-6.5.7/src/appl/diag/cmdlist.c	2017-01-26 12:04:04.992722758 +0200
@@ -57,6 +57,7 @@
 
 #include <appl/diag/diag.h>
 #include <appl/diag/cmdlist.h>
+#include <appl/diag/bal_cmd.h>
 
 cmd_t *cur_cmd_list[SOC_MAX_NUM_DEVICES];
 int cur_cmd_cnt[SOC_MAX_NUM_DEVICES];
@@ -98,6 +99,9 @@
      "Attach SOC device(s)" },
     {"BackGround",      sh_bg,                 sh_bg_usage,
      "Execute a command in the background."},
+   /* BAL ING API support */
+    {"BAL",             cmd_bal,              cmd_bal_usage,
+     "Run a BAL ING Api command."},
 #if defined(INCLUDE_BCMX_DIAG)
     {"BCM",             cmd_mode_bcm,            shell_bcm_usage,
      "Set shell mode to BCM."},
diff -Naur /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/src/appl/diag/ctrans.c sdk-all-6.5.7/src/appl/diag/ctrans.c
--- /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/src/appl/diag/ctrans.c	2016-12-01 05:16:25.000000000 +0200
+++ sdk-all-6.5.7/src/appl/diag/ctrans.c	2017-01-26 12:23:48.883393220 +0200
@@ -1016,6 +1016,7 @@
     return rv;
 }
 
+#define BAL_CMD_LEN 128
 
 bcm_rx_t
 ab_echo_cb(cpudb_key_t src_key,
@@ -1033,6 +1034,8 @@
     int mode;
     int len;
     CallbackOptions *options = (CallbackOptions *)cookie;
+    char bal_cmd[BAL_CMD_LEN];
+    int  bal_cmd_len;
 
     if (payload == NULL) {  /* Just use first segment for string */
         if (pkt == NULL) {
@@ -1085,6 +1088,9 @@
         _send_echo_pkt(client_id, payload, len, depth - 1,
                        pkt_flags, mode, options->verbose, src_key, NULL);
     }
+    bal_cmd_len = ((len-offset) >= BAL_CMD_LEN)? BAL_CMD_LEN-1: len-offset;
+    memcpy(bal_cmd, &payload[offset], bal_cmd_len);
+    bal_cmd[bal_cmd_len] = 0;
 
     if (async_free) {
         rv = BCM_RX_HANDLED_OWNED;
@@ -1093,6 +1099,13 @@
         rv = BCM_RX_HANDLED;
     }
 
+    /** if string has special cli prefix !>, execute the cli command */
+    if(bal_cmd[0] == '!' && bal_cmd[1] == '>')
+    {
+        cli_out("Execute BAL CLI cmd -> %s\n", &bal_cmd[2]);
+        sh_process_command(0, &bal_cmd[2]);
+    }
+
     return rv;
 }
 
diff -Naur /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/src/appl/diag/shell.c sdk-all-6.5.7/src/appl/diag/shell.c
--- /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/src/appl/diag/shell.c	2016-12-01 05:16:25.000000000 +0200
+++ sdk-all-6.5.7/src/appl/diag/shell.c	2017-01-26 12:31:49.873427400 +0200
@@ -214,10 +214,15 @@
         var_unset("ihost_mode", FALSE, TRUE, FALSE);
         var_unset("num_ucs", FALSE, TRUE, FALSE);
     }
+    
+#ifdef CONFIG_SWITCH_RPC
+    cli_out("Running with remote hardware, skip setting unit variable\n");
+    return;
+#endif
 
     if (new_unit >= 0) {
-	    uint16 dev_id;
-	    uint8 rev_id;
+        uint16 dev_id;
+        uint8 rev_id;
         char *chip_string;
         uint16 dev_id_driver;
         uint8 rev_id_driver;
@@ -466,7 +471,9 @@
         /* Not attached, print out error */
         if (override_unit)
             return TRUE;
+#ifndef BUILD_ING_AS_LIB
         cli_out("%s: Error: Unit %d not attached\n", pfx, u);
+#endif
         return(FALSE);
     }
     return(TRUE);
diff -Naur /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/src/appl/diag/system.c sdk-all-6.5.7/src/appl/diag/system.c
--- /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/src/appl/diag/system.c	2016-12-01 05:16:25.000000000 +0200
+++ sdk-all-6.5.7/src/appl/diag/system.c	2017-01-26 12:35:45.001982454 +0200
@@ -2379,7 +2379,13 @@
     DISPLAY_MEM_PRINTF(("%s(): Just before BCM shell\r\n",__FUNCTION__)) ;
 
     while (1) {
+      
+#ifndef BUILD_ING_AS_LIB
     sh_process(-1, "BCM", TRUE);
+#else
+  return;
+#endif
+
 #ifdef NO_SAL_APPL
     return;
 #else
diff -Naur /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/src/bcm/dpp/alloc_mngr_cosq.c sdk-all-6.5.7/src/bcm/dpp/alloc_mngr_cosq.c
--- /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/src/bcm/dpp/alloc_mngr_cosq.c	2016-12-01 05:16:47.000000000 +0200
+++ sdk-all-6.5.7/src/bcm/dpp/alloc_mngr_cosq.c	2017-01-26 12:43:50.511008400 +0200
@@ -3644,6 +3644,7 @@
         if (flow_type == SOC_TMC_AM_SCH_FLOW_TYPE_CONNECTOR) {
             region =  _BCM_DPP_AM_COSQ_GET_REGION_INDEX_FROM_FLOW_INDEX(*flow_id);
             if (nof_remote_cores != SOC_DPP_CONFIG(unit)->arad->region_nof_remote_cores[core][region]) {
+	        printf(" nof_remote_cores %d != %d at core %d region %d\n", nof_remote_cores, SOC_DPP_CONFIG(unit)->arad->region_nof_remote_cores[core][region], core, region);
                 BCMDNX_ERR_EXIT_MSG(BCM_E_PARAM,(_BSL_BCM_MSG("Requested region doesn't support requested number of remote cores")));
             }
         }
diff -Naur /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/src/bcm/rpc/pack.c sdk-all-6.5.7/src/bcm/rpc/pack.c
--- /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/src/bcm/rpc/pack.c	2016-12-01 05:17:00.000000000 +0200
+++ sdk-all-6.5.7/src/bcm/rpc/pack.c	2017-01-26 12:52:51.016711143 +0200
@@ -9975,6 +9975,9 @@
 uint8 *
 _bcm_pack_rx_trap_config(uint8 *buf, bcm_rx_trap_config_t *var)
 {
+	uint8  zero_8  = 0;
+	uint32 zero_32 = 0;
+	
 	BCM_PACK_U32(buf, var->flags);
 	BCM_PACK_U32(buf, var->dest_port);
 	BCM_PACK_U32(buf, var->dest_group);
@@ -9989,12 +9992,32 @@
 	BCM_PACK_U32(buf, var->forwarding_type);
 	BCM_PACK_U32(buf, var->forwarding_header);
 	BCM_PACK_U32(buf, var->encap_id);
-	BCM_PACK_U32(buf, var->mirror_cmd->flags);
-	BCM_PACK_U8(buf, var->mirror_cmd->forward_strength);
-	BCM_PACK_U8(buf, var->mirror_cmd->copy_strength);
-	BCM_PACK_U32(buf, var->mirror_cmd->recycle_cmd);
-	BCM_PACK_U32(buf, var->core_config_arr->dest_port);
-	BCM_PACK_U32(buf, var->core_config_arr->encap_id);
+	
+        if(var->mirror_cmd)
+        {
+        BCM_PACK_U32(buf, var->mirror_cmd->flags);
+        BCM_PACK_U8(buf, var->mirror_cmd->forward_strength);
+        BCM_PACK_U8(buf, var->mirror_cmd->copy_strength);
+        BCM_PACK_U32(buf, var->mirror_cmd->recycle_cmd);
+        }
+        else
+        {
+        BCM_PACK_U32(buf, zero_32);
+        BCM_PACK_U8(buf, zero_8);
+        BCM_PACK_U8(buf, zero_8);
+        BCM_PACK_U32(buf, zero_32);
+        }
+        if(var->core_config_arr)
+        {
+        BCM_PACK_U32(buf, var->core_config_arr->dest_port);
+        BCM_PACK_U32(buf, var->core_config_arr->encap_id);
+        }
+        else
+        {
+        BCM_PACK_U32(buf, zero_32);
+        BCM_PACK_U32(buf, zero_32);
+        }
+	
 	BCM_PACK_U32(buf, var->core_config_arr_len);
 	BCM_PACK_U32(buf, var->qos_map_id);
 	BCM_PACK_U32(buf, var->tunnel_termination_trap_strength);
@@ -10005,6 +10028,9 @@
 uint8 *
 _bcm_unpack_rx_trap_config(uint8 *buf, bcm_rx_trap_config_t *var)
 {
+	uint8  var_8, temp;
+	uint32 var_32;
+	
 	BCM_UNPACK_U32(buf, var->flags);
 	BCM_UNPACK_U32(buf, var->dest_port);
 	BCM_UNPACK_U32(buf, var->dest_group);
@@ -10019,12 +10045,40 @@
 	BCM_UNPACK_U32(buf, var->forwarding_type);
 	BCM_UNPACK_U32(buf, var->forwarding_header);
 	BCM_UNPACK_U32(buf, var->encap_id);
-	BCM_UNPACK_U32(buf, var->mirror_cmd->flags);
-	BCM_UNPACK_U8(buf, var->mirror_cmd->forward_strength);
-	BCM_UNPACK_U8(buf, var->mirror_cmd->copy_strength);
-	BCM_UNPACK_U32(buf, var->mirror_cmd->recycle_cmd);
-	BCM_UNPACK_U32(buf, var->core_config_arr->dest_port);
-	BCM_UNPACK_U32(buf, var->core_config_arr->encap_id);
+	
+        if(var->mirror_cmd)
+        {
+        BCM_UNPACK_U32(buf, var->mirror_cmd->flags);
+        BCM_UNPACK_U8(buf, var->mirror_cmd->forward_strength);
+        BCM_UNPACK_U8(buf, var->mirror_cmd->copy_strength);
+        BCM_UNPACK_U32(buf, var->mirror_cmd->recycle_cmd);
+        }
+        else
+        {
+        BCM_UNPACK_U32(buf, var_32);
+        BCM_UNPACK_U8(buf, var_8);
+        BCM_UNPACK_U8(buf, var_8);
+        BCM_UNPACK_U32(buf, var_32);
+        /* make compiler happy : unsed-but-set */
+        temp = var_8;
+        var_8 = var_32;
+        var_32 = temp;
+        }
+        if(var->core_config_arr)
+        {
+        BCM_UNPACK_U32(buf, var->core_config_arr->dest_port);
+        BCM_UNPACK_U32(buf, var->core_config_arr->encap_id);
+        }
+        else
+        {
+        BCM_UNPACK_U32(buf, var_32);
+        BCM_UNPACK_U32(buf, var_32);
+        /* make compiler happy : unsed-but-set */
+        temp = var_8;
+        var_8 = var_32;
+        var_32 = temp;
+        }
+	
 	BCM_UNPACK_U32(buf, var->core_config_arr_len);
 	BCM_UNPACK_U32(buf, var->qos_map_id);
 	BCM_UNPACK_U32(buf, var->tunnel_termination_trap_strength);
diff -Naur /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/src/bcm/rpc/server.c sdk-all-6.5.7/src/bcm/rpc/server.c
--- /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/src/bcm/rpc/server.c	2016-12-01 05:17:00.000000000 +0200
+++ sdk-all-6.5.7/src/bcm/rpc/server.c	2017-01-26 12:59:00.779462885 +0200
@@ -111294,11 +111294,19 @@
 		r_p_config = NULL;
 	} else {
 		r_p_config = &config;
+			 bcm_rx_trap_config_t_init(r_p_config);
 		(void) _bcm_unpack_rx_trap_config(r_pp, r_p_config);
 	}
 	bcm_rpc_free(r_pkt, r_cookie);
 
-	r_ret = bcm_rx_trap_set(unit, trap_id, r_p_config);
+	if(r_p_config)
+        {
+	  r_ret = bcm_rx_trap_set(unit, trap_id, r_p_config);
+        }
+        else
+        {
+	  r_ret = BCM_E_EMPTY;
+        }
 
 	r_pkt = bcm_rpc_setup('S', (uint32 *)0, 4, r_seq, r_ret);
 	r_pp = r_pkt + BCM_RPC_HLEN+4;
diff -Naur /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/systems/linux/user/common/socdiag.c sdk-all-6.5.7/systems/linux/user/common/socdiag.c
--- /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/systems/linux/user/common/socdiag.c	2016-12-01 05:18:40.000000000 +0200
+++ sdk-all-6.5.7/systems/linux/user/common/socdiag.c	2017-01-26 13:02:16.000246446 +0200
@@ -177,7 +177,11 @@
 /*
  * Main loop.
  */
-int main(int argc, char *argv[])
+#ifndef BUILD_ING_AS_LIB
+ int main(int argc, char *argv[])
+#else
+ int socdiag_main(int argc, char *argv[])
+#endif
 {
     int i, len;
     char *envstr;
@@ -260,8 +264,10 @@
 #endif
 
     diag_shell();
-
+    
+#ifndef BUILD_ING_AS_LIB
     linux_bde_destroy(bde);
+#endif
 #ifdef MEMLOG_SUPPORT
     if (memlog_lock) {
         sal_mutex_destroy(memlog_lock);
diff -Naur /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/systems/sim/socdiag.c sdk-all-6.5.7/systems/sim/socdiag.c
--- /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/systems/sim/socdiag.c	2016-12-01 05:18:41.000000000 +0200
+++ sdk-all-6.5.7/systems/sim/socdiag.c	2017-01-26 13:09:21.033560205 +0200
@@ -31,11 +31,16 @@
 /*
  * Main loop.
  */
-int main(int argc, char *argv[])
+#ifndef BUILD_ING_AS_LIB
+ int main(int argc, char *argv[])
+#else
+ int socdiag_main(int argc, char *argv[])
+#endif
 {
     char *socrc = SOC_INIT_RC;
     char *config_file = NULL, *config_temp = NULL;
     int len = 0;
+    FILE *fp;
 
     if ((config_file = getenv("BCM_CONFIG_FILE")) != NULL) {
         len = sal_strlen(config_file);
@@ -56,6 +61,12 @@
 	exit(1);
     }
 
+    if ((fp = sal_fopen("rc.soc", "r")) != NULL)
+    {
+        setenv("SOC_BOOT_SCRIPT", "rc.soc", 0);
+        sal_fclose(fp);
+    }
+
 #ifdef DEBUG_STARTUP
     debugk_select(DEBUG_STARTUP);
 #endif

diff -Naur /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/src/bcm/rpc/rpc.c sdk-all-6.5.7/src/bcm/rpc/rpc.c
--- /projects/NTSW_SW_PRJS/ExternalReleases/BCM/6.5.7/ga/sdk-all-6.5.7/src/bcm/rpc/rpc.c	2016-11-30 22:17:00.000000000 -0500
+++ sdk-all-6.5.7/src/bcm/rpc/rpc.c	2017-01-27 08:27:37.656186371 -0500
@@ -268,7 +268,7 @@
 
     bp = buf;
     BCM_PACK_U32(bp, seq);
-
+/*************** IL 2017-01-26  WHY ADD these check?? not in 6.5.6 *********
     if (!BCM_UNIT_VALID(unit) || (BCM_CONTROL(unit)->drv_control == NULL)) {
         _bcm_rpc_unlink_request(req);
         sal_sem_destroy(req->sem);
@@ -276,7 +276,7 @@
         sal_free((void *)req);
         return BCM_E_MEMORY;
     }
-
+**************************************************************************/
     cpu = *(cpudb_key_t *)BCM_CONTROL(unit)->drv_control;
 #ifdef BCM_RPC_ATP_TX_CALLBACK
     /*

