BAL and Maple Release 2.2
Signed-off-by: Shad Ansari <developer@Carbon.local>
diff --git a/bal_release/3rdparty/bcm-sdk/sdk-bal-6.5.7.patch b/bal_release/3rdparty/bcm-sdk/sdk-bal-6.5.7.patch
new file mode 100644
index 0000000..43f8f01
--- /dev/null
+++ b/bal_release/3rdparty/bcm-sdk/sdk-bal-6.5.7.patch
@@ -0,0 +1,1394 @@
+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
+ /*
+