Release A code commit
[o-du/l2.git] / src / cm / cm_tpt.c
diff --git a/src/cm/cm_tpt.c b/src/cm/cm_tpt.c
new file mode 100755 (executable)
index 0000000..7bd9d87
--- /dev/null
@@ -0,0 +1,2112 @@
+/*******************************************************************************
+################################################################################
+#   Copyright (c) [2017-2019] [Radisys]                                        #
+#                                                                              #
+#   Licensed under the Apache License, Version 2.0 (the "License");            #
+#   you may not use this file except in compliance with the License.           #
+#   You may obtain a copy of the License at                                    #
+#                                                                              #
+#       http://www.apache.org/licenses/LICENSE-2.0                             #
+#                                                                              #
+#   Unless required by applicable law or agreed to in writing, software        #
+#   distributed under the License is distributed on an "AS IS" BASIS,          #
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   #
+#   See the License for the specific language governing permissions and        #
+#   limitations under the License.                                             #
+################################################################################
+*******************************************************************************/
+\f
+/********************************************************************20**
+  
+     Name:     HCT Interface
+  
+     Type:     C file
+  
+     Desc:     This file contains the packing/unpacking functions
+               for the H.225 primitives on hct interface
+
+     File:     cm_tpt.c
+
+*********************************************************************21*/
+\f
+/* header include files (.h) */
+
+#include "envopt.h"        /* environment options */  
+#include "envdep.h"        /* environment dependent */
+#include "envind.h"        /* environment independent */
+
+#include "gen.h"           /* general layer */
+#include "ssi.h"           /* system service interface */
+
+#include "cm_tpt.h"
+
+/* header/extern include files (.x) */
+
+#include "gen.x"           /* general layer */
+#include "ssi.x"           /* system service interface */
+
+/*#include "cm_tkns.x"*/
+#include "cm_tpt.x"
+
+\f
+/* local defines */
+
+/* local typedefs */
+
+/* local externs */
+  
+/* forward references */
+
+/* local function definition */
+
+/* functions in other modules */
+
+/* public variable declarations */
+
+/* control variables for testing */
+
+/* private variable declarations */
+
+/*
+ * support functions
+ */
+
+/*  cm_tpt_c_001.main_17 - Guarded under LCEGT and LCLEG */
+/*  cm_tpt_c_001.main_18 - Guarded under LWLCEGT */
+\f
+#if    (   defined(LCHCT) || defined (LWLCHCT) || defined(LCHIT) \
+        || defined(LCLHC) || defined(TRIL_HZ) \
+        || defined(LCHRT) || defined(LCLHR)   \
+        || defined(LCLMG) || defined(LCMGT)   \
+        || defined(LCLHG) || defined(LCHGT)   \
+        || defined(LCSCT) || defined(LCLSB)   \
+        || defined(LCLNT) || defined(LCLLN)   \
+        || defined(LCLSO) || defined(LCSOT)   \
+        || defined(LCEGT) || defined(LCLEG)   || defined(LWLCEGT) \
+        || defined(CM_COMPRESS)   \
+       )
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+   /* Add prototypes here  (MB) */
+
+#ifdef __cplusplus
+}
+#endif
+
+\f  
+
+/*
+ *      PACKING FUNCTIONS
+ */
+/* Moving IPv4 address packing functions from cm_inet.c */
+/*
+*
+*       Fun:   cmPkCmIpv4TptAddr
+*
+*       Desc:  This function packs the IPv4 address 
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmPkCmIpv4TptAddr
+(
+CmIpv4TptAddr            *pkParam,  /* IPv4 Address structure */
+Buffer                   *mBuf      /* message buffer */
+)
+#else
+PUBLIC S16 cmPkCmIpv4TptAddr (pkParam, mBuf)
+CmIpv4TptAddr            *pkParam;  /* IPv4 Address structure */
+Buffer                   *mBuf;     /* message buffer */
+#endif
+{
+   TRC2(cmPkCmIpv4TptAddr)
+
+   CMCHKPK(cmPkCmIpv4NetAddr, pkParam->address, mBuf);
+   CMCHKPK(SPkU16, pkParam->port, mBuf);
+
+   RETVALUE(ROK);
+} /* cmPkCmIpv4TptAddr */
+
+/*
+*
+*       Fun:   cmPkCmIpv6NetAddr
+*
+*       Desc:  This function packs the 16 bytes of IPv6 address 
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PRIVATE S16 cmPkCmIpv6NetAddr
+(
+CmIpv6NetAddr            *pkParam,     
+Buffer                   *mBuf         /* message buffer */
+)
+#else
+PRIVATE S16 cmPkCmIpv6NetAddr (pkParam, mBuf)
+CmIpv6NetAddr            *pkParam;     
+Buffer                   *mBuf;        /* message buffer */
+#endif
+{
+   U8 num;
+   U8 *ptr = (U8*)pkParam;
+
+   TRC3(cmPkCmIpv6NetAddr)
+
+   for(num = 0; num < CM_IPV6ADDR_SIZE; num++)
+   {
+      CMCHKPK(SPkU8, *(ptr+num), mBuf);
+   }
+
+   RETVALUE(ROK);
+} /* end of cmPkCmIpv6NetAddr */
+
+\f
+/*
+*
+*       Fun:   cmPkCmIpv6TptAddr
+*
+*       Desc:  This function packs the IPv6 transport address
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PRIVATE S16 cmPkCmIpv6TptAddr
+(
+CmIpv6TptAddr            *pkParam,     /* IPv6 transport address */
+Buffer                   *mBuf         /* message buffer */
+)
+#else
+PRIVATE S16 cmPkCmIpv6TptAddr (pkParam, mBuf)
+CmIpv6TptAddr            *pkParam;     /* IPv6 transport address */
+Buffer                   *mBuf;        /* message buffer */
+#endif
+{
+   TRC3(cmPkCmIpv6TptAddr)
+
+   CMCHKPK(cmPkCmIpv6NetAddr, &pkParam->ipv6NetAddr, mBuf);
+   CMCHKPK(SPkU16, pkParam->port, mBuf);
+
+   RETVALUE(ROK);
+}   /* cmPkCmIpv6TptAddr */
+
+\f
+/*
+*
+*       Fun:   cmPkCmNetAddrTbl
+*
+*       Desc:  This function packs the 
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmPkCmNetAddrTbl
+(
+CmNetAddrTbl            *pkParam,      /* Network Address Table */
+Buffer                  *mBuf          /* message buffer */
+)
+#else
+PUBLIC S16 cmPkCmNetAddrTbl (pkParam, mBuf)
+CmNetAddrTbl            *pkParam;      /* Network Address Table */
+Buffer                  *mBuf;         /* message buffer */
+#endif
+{
+   U16                  idx;           /* Loop Index */
+   CmNetAddr            *netAddr;      /* Network Address */
+
+   TRC2(cmPkCmNetAddrTbl)
+
+   if (pkParam->count > CM_MAX_NET_ADDR)
+      RETVALUE(RFAILED);
+
+   /* Pack All the addresses */
+   for (idx = pkParam->count; idx; idx--)
+   {
+      netAddr = &(pkParam->netAddr[idx - 1]);
+
+      if ((cmPkCmNetAddr(netAddr, mBuf)) != ROK)
+         RETVALUE(RFAILED);
+   }
+
+   /* Pack the total number of addresses present in the table */
+   CMCHKPK(SPkU16, pkParam->count, mBuf);
+
+   RETVALUE(ROK);
+
+} /* end of cmPkCmNetAddrTbl() */
+
+/*
+*
+*       Fun:   cmPkCmNetAddr
+*
+*       Desc:  This function packs the 
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmPkCmNetAddr
+(
+CmNetAddr                *pkParam,     
+Buffer                   *mBuf         /* message buffer */
+)
+#else
+PUBLIC S16 cmPkCmNetAddr (pkParam, mBuf)
+CmNetAddr                *pkParam;     
+Buffer                   *mBuf;        /* message buffer */
+#endif
+{
+   TRC3(cmPkCmNetAddr)
+
+   switch (pkParam->type)
+   {
+      case CM_NETADDR_NOTPRSNT:
+         break;
+
+      case CM_NETADDR_IPV4:
+         CMCHKPK(cmPkCmIpv4NetAddr, pkParam->u.ipv4NetAddr, mBuf);
+         break;
+
+      case CM_NETADDR_IPV6:
+         CMCHKPK(cmPkCmIpv6NetAddr, &pkParam->u.ipv6NetAddr, mBuf);
+         break;
+
+      default:
+         RETVALUE(RFAILED);
+   }
+   CMCHKPK(SPkU8, pkParam->type, mBuf);
+
+   RETVALUE(ROK);
+}   /* cmPkCmNetAddr */
+
+\f
+/*
+*
+*       Fun:   cmPkCmTptAddr
+*
+*       Desc:  This function packs the 
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmPkCmTptAddr
+(
+CmTptAddr                *pkParam,     
+Buffer                   *mBuf         /* message buffer */
+)
+#else
+PUBLIC S16 cmPkCmTptAddr (pkParam, mBuf)
+CmTptAddr                *pkParam;     
+Buffer                   *mBuf;        /* message buffer */
+#endif
+{
+   TRC3(cmPkCmTptAddr)
+
+   switch (pkParam->type)
+   {
+      case CM_TPTADDR_NOTPRSNT:
+         break;
+
+      case CM_TPTADDR_IPV4:
+         CMCHKPK(cmPkCmIpv4TptAddr, &pkParam->u.ipv4TptAddr, mBuf);
+         break;
+
+      case CM_TPTADDR_IPV6:
+         CMCHKPK(cmPkCmIpv6TptAddr, &pkParam->u.ipv6TptAddr, mBuf);
+         break;
+   
+      default:
+         RETVALUE(RFAILED);
+   }
+   CMCHKPK(SPkU8, pkParam->type, mBuf);
+
+   RETVALUE(ROK);
+}   /* cmPkCmTptAddr */
+
+/* added new packing functions */
+#ifdef LOCAL_INTF
+/*
+*
+*       Fun:   cmPkCmTptLocalInf
+*
+*       Desc:  This function packs the local interface info on which IPV4/IPV6
+*              packet was received on.
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmPkCmTptLocalInf
+(
+CmTptLocalInf           *pkParam,   /* local interface info */
+Buffer                  *mBuf       /* message buffer */
+)
+#else
+PUBLIC S16 cmPkCmTptLocalInf (pkParam, mBuf)
+CmTptLocalInf           *pkParam;   /* local interface info */
+Buffer                  *mBuf;      /* message buffer */
+#endif
+{
+   TRC3(cmPkCmTptLocalInf)
+
+   if (pkParam->intfPrsnt == TRUE)
+   {  
+      /* pack the actual interface address */ 
+      CMCHKPK(cmPkCmNetAddr, &pkParam->localIfAddr, mBuf); 
+      /* pack the interface index value */
+      CMCHKPK(SPkU32, pkParam->localIf, mBuf);
+   }
+   /* pack the boll which indicates if valid local intf is present or not */
+   CMCHKPK(SPkU8, pkParam->intfPrsnt, mBuf);
+   RETVALUE(ROK);
+}   /* cmPkCmTptLocalInf */
+#endif /* LOCAL_INTF */
+
+/* Moving IPv6 multicast information packing functions from cm_inet.c */
+#ifdef IPV6_SUPPORTED
+/*
+*
+*       Fun:   cmPkCmNetMCastInf6
+*
+*       Desc:  This function packs the IPv6 multicast information 
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmPkCmNetMCastInf6
+(
+CmNetMCastInf6            *pkParam,     /* IPv6 multicast information */
+Buffer                    *mBuf         /* message buffer */
+)
+#else
+PUBLIC S16 cmPkCmNetMCastInf6(pkParam, mBuf)
+CmNetMCastInf6            *pkParam;     /* IPv6 multicast information */
+Buffer                    *mBuf;        /* message buffer */
+#endif
+{
+   TRC3(cmPkCmNetMCastInf6)
+
+   CMCHKPK(cmPkCmIpv6NetAddr, &pkParam->mCastAddr, mBuf);
+   CMCHKPK(SPkU32, pkParam->localInf, mBuf);
+
+   RETVALUE(ROK);
+}   /* cmPkCmNetMCastInf6 */
+#endif /* IPV6_SUPPORTED */
+
+\f
+/*
+*
+*       Fun:   cmPkCmSockOpts
+*
+*       Desc:  This function packs the 
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PRIVATE S16 cmPkCmSockOpts
+(
+CmSockOpts               *pkParam,     
+Buffer                   *mBuf         /* message buffer */
+)
+#else
+PRIVATE S16 cmPkCmSockOpts (pkParam, mBuf)
+CmSockOpts               *pkParam;     
+Buffer                   *mBuf;        /* message buffer */
+#endif
+{
+   TRC3(cmPkCmSockOpts)
+
+   switch (pkParam->option)
+   {
+      case CM_SOCKOPT_OPT_ADD_MCAST_MBR:
+      case CM_SOCKOPT_OPT_DRP_MCAST_MBR:
+#ifdef CM_INET2
+         CMCHKPK(cmPkCmNetAddr, &pkParam->optVal.mCastInfo.mCastAddr, mBuf);
+         CMCHKPK(cmPkCmNetAddr, &pkParam->optVal.mCastInfo.localAddr, mBuf);
+#else
+         CMCHKPK(cmPkCmNetAddr, &pkParam->optVal.mCastAddr, mBuf);
+#endif /* CM_INET2 */
+         break;
+
+      case CM_SOCKOPT_OPT_MCAST_IF:
+         CMCHKPK(cmPkCmNetAddr, &pkParam->optVal.lclAddr, mBuf);
+         break;
+
+#ifdef IPV6_SUPPORTED
+      case CM_SOCKOPT_OPT_ADD_MCAST6_MBR:
+      case CM_SOCKOPT_OPT_DRP_MCAST6_MBR:
+         CMCHKPK(cmPkCmNetMCastInf6, &pkParam->optVal.mCastInfo6, mBuf);
+         break;
+
+      case CM_SOCKOPT_OPT_MCAST6_IF:
+         CMCHKPK(SPkU32, pkParam->optVal.infId, mBuf);
+         break;
+
+#endif /* IPV6_SUPPORTED */
+
+      default:
+         CMCHKPK(SPkU32, pkParam->optVal.value, mBuf);
+         break;
+   }
+   CMCHKPK(SPkU32, pkParam->option, mBuf);
+   CMCHKPK(SPkU32, pkParam->level, mBuf);
+
+   RETVALUE(ROK);
+}   /* cmPkCmSockOpts */
+
+\f
+/*
+*
+*       Fun:   cmPkCmSockParam
+*
+*       Desc:  This function packs the 
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PRIVATE S16 cmPkCmSockParam
+(
+CmSockParam              *pkParam,     
+Buffer                   *mBuf         /* message buffer */
+)
+#else
+PRIVATE S16 cmPkCmSockParam (pkParam, mBuf)
+CmSockParam              *pkParam;     
+Buffer                   *mBuf;        /* message buffer */
+#endif
+{
+   U32 num;
+
+   TRC3(cmPkCmSockParam)
+
+   if( pkParam->numOpts > CM_MAX_SOCK_OPTS)
+   {
+      RETVALUE(RFAILED);
+   }
+   for(num = 0; num < pkParam->numOpts; num++)
+   {
+      CMCHKPK(cmPkCmSockOpts, &pkParam->sockOpts[num], mBuf);
+   }
+   CMCHKPK(SPkU8, pkParam->numOpts, mBuf);
+   CMCHKPK(SPkU8, pkParam->listenQSize, mBuf);
+
+   RETVALUE(ROK);
+}   /* cmPkCmSockParam */
+
+\f
+#ifdef CM_TLS
+/*
+*
+*       Fun:   cmPkTlsTptParam
+*
+*       Desc:  This function packs the 
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PRIVATE S16 cmPkTlsTptParam
+(
+TlsTptParam              *pkParam,     /**/
+Buffer                   *mBuf         /* message buffer */
+)
+#else
+PRIVATE S16 cmPkTlsTptParam(pkParam, mBuf)
+TlsTptParam              *pkParam;     /**/
+Buffer                   *mBuf;        /* message buffer */
+#endif
+{
+   U32 num;
+
+   TRC3(cmPkTlsTptParam)
+
+   if( pkParam->numOpts > CM_MAX_SOCK_OPTS)
+   {
+      RETVALUE(RFAILED);
+   }
+   for(num = 0; num < pkParam->numOpts; num++)
+   {
+      CMCHKPK(cmPkCmSockOpts, &pkParam->sockOpts[num], mBuf);
+   }
+   CMCHKPK(SPkU8, pkParam->numOpts, mBuf);
+   CMCHKPK(SPkU8, pkParam->listenQSize, mBuf);
+   CMCHKPK(SPkS16, pkParam->ctxId, mBuf);
+
+   RETVALUE(ROK);
+}  /* cmPkTlsTptParam */
+
+#endif  /* CM_TLS */
+
+\f
+/*
+*
+*       Fun:   cmPkCmTptParam
+*
+*       Desc:  This function packs the 
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmPkCmTptParam
+(
+CmTptParam               *pkParam,     
+Buffer                   *mBuf         /* message buffer */
+)
+#else
+PUBLIC S16 cmPkCmTptParam (pkParam, mBuf)
+CmTptParam               *pkParam;     
+Buffer                   *mBuf;        /* message buffer */
+#endif
+{
+   TRC3(cmPkCmTptParam)
+
+   switch (pkParam->type)
+   {
+      case CM_TPTPARAM_NOTPRSNT:
+         break;
+
+      case CM_TPTPARAM_SOCK:
+         CMCHKPK(cmPkCmSockParam, &pkParam->u.sockParam, mBuf);
+         break;
+
+#ifdef CM_AAL
+      case CM_TPTPARAM_AAL:
+         CMCHKPK(cmPkAalConParam, &pkParam->u.aalParam, mBuf);
+         break;
+#endif
+
+#ifdef CM_TLS
+      case CM_TPTPARAM_TLS:
+         CMCHKPK(cmPkTlsTptParam, &pkParam->u.tlsParam, mBuf);
+         break;
+#endif
+
+      default:
+         RETVALUE(RFAILED);
+   }
+
+   CMCHKPK(SPkU8, pkParam->type, mBuf);
+
+   RETVALUE(ROK);
+}   /* cmPkCmTptParam */
+
+\f  
+/*
+ *      UNPACKING FUNCTIONS
+ */
+
+/* Moving IPv4 address un-packing functions from cm_inet.c file */
+
+/*
+*
+*       Fun:   cmUnpkCmIpv4TptAddr
+*
+*       Desc:  This function unpacks the IPv4 address
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmUnpkCmIpv4TptAddr 
+(
+CmIpv4TptAddr            *unpkParam,     /* IPv4 Address */
+Buffer                   *mBuf           /* message buffer */
+)
+#else
+PUBLIC S16 cmUnpkCmIpv4TptAddr (unpkParam, mBuf)
+CmIpv4TptAddr            *unpkParam;     /* IPv4 Address */
+Buffer                   *mBuf;          /* message buffer */
+#endif
+{
+   TRC2(cmUnpkCmIpv4TptAddr)
+
+   CMCHKUNPK(SUnpkU16, &unpkParam->port, mBuf);
+   CMCHKUNPK(cmUnpkCmIpv4NetAddr, &unpkParam->address, mBuf);
+
+   RETVALUE(ROK);
+}   /* cmUnpkCmIpv4TptAddr */
+
+\f
+/*
+*
+*       Fun:   cmUnpkCmIpv6NetAddr
+*
+*       Desc:  This function unpacks the 16 bytes of IPv6 address 
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PRIVATE S16 cmUnpkCmIpv6NetAddr
+(
+CmIpv6NetAddr            *unpkParam,   /* IPv6 address */
+Buffer                   *mBuf         /* message buffer */
+)
+#else
+PRIVATE S16 cmUnpkCmIpv6NetAddr (unpkParam, mBuf)
+CmIpv6NetAddr            *unpkParam;   /* IPv6 address */
+Buffer                   *mBuf;        /* message buffer */
+#endif
+{
+   U32 num;
+   U8 *ptr = (U8*)unpkParam;
+
+   TRC3(cmUnpkCmIpv6NetAddr)
+
+   ptr += (CM_INET_IPV6ADDR_SIZE - 1);
+
+   for(num = 0; num < CM_IPV6ADDR_SIZE; num++)
+   {
+      CMCHKUNPK(SUnpkU8, (ptr-num), mBuf);
+   }
+
+   RETVALUE(ROK);
+} /* end of cmUnpkCmIpv6NetAddr */
+
+\f
+/*
+*
+*       Fun:   cmUnpkCmIpv6TptAddr
+*
+*       Desc:  This function unpacks the IPv6 transport address
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PRIVATE S16 cmUnpkCmIpv6TptAddr
+(
+CmIpv6TptAddr            *unpkParam,   /* IPv6 transport address */
+Buffer                   *mBuf         /* message buffer */
+)
+#else
+PRIVATE S16 cmUnpkCmIpv6TptAddr (unpkParam, mBuf)
+CmIpv6TptAddr            *unpkParam;   /* IPv6 transport address */
+Buffer                   *mBuf;        /* message buffer */
+#endif
+{
+   TRC3(cmUnpkCmIpv6TptAddr)
+
+   CMCHKUNPK(SUnpkU16, &unpkParam->port, mBuf);
+   CMCHKUNPK(cmUnpkCmIpv6NetAddr, &unpkParam->ipv6NetAddr, mBuf);
+
+   RETVALUE(ROK);
+}   /* cmUnpkCmIpv6TptAddr */
+
+\f
+/*
+*
+*       Fun:   cmUnpkCmNetAddrTbl
+*
+*       Desc:  This function unpacks the 
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmUnpkCmNetAddrTbl
+(
+CmNetAddrTbl            *unpkParam,    /* Network Address Table */
+Buffer                  *mBuf          /* message buffer */
+)
+#else
+PUBLIC S16 cmUnpkCmNetAddrTbl (unpkParam, mBuf )
+CmNetAddrTbl            *unpkParam;    /* Network Address Table */
+Buffer                  *mBuf;         /* message buffer */
+#endif
+{
+   U16                  idx;           /* Loop Index */
+   CmNetAddr            *netAddr;      /* Network Address */
+   
+   TRC2(cmUnpkCmNetAddrTbl)
+
+   /* Unpack the count */
+   CMCHKUNPK(SUnpkU16, &(unpkParam->count), mBuf);
+
+   /* Unpack the addresses */
+   for (idx = 0; idx < unpkParam->count; idx++)
+   {
+      netAddr = &(unpkParam->netAddr[idx]);
+
+      if ((cmUnpkCmNetAddr(netAddr, mBuf)) != ROK)
+         RETVALUE(RFAILED);
+   }
+
+   RETVALUE(ROK);
+
+} /* end of cmUnpkCmNetAddrTbl() */
+
+\f
+/*
+*
+*       Fun:   cmUnpkCmNetAddr
+*
+*       Desc:  This function unpacks the network address
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmUnpkCmNetAddr
+(
+CmNetAddr                *unpkParam,   
+Buffer                   *mBuf         /* message buffer */
+)
+#else
+PUBLIC S16 cmUnpkCmNetAddr (unpkParam, mBuf )
+CmNetAddr                *unpkParam;   
+Buffer                   *mBuf;        /* message buffer */
+#endif
+{
+   TRC3(cmUnpkCmNetAddr)
+
+   CMCHKUNPK(SUnpkU8, &unpkParam->type, mBuf);
+
+   switch (unpkParam->type)
+   {
+      case CM_NETADDR_NOTPRSNT:
+         break;
+
+      case CM_NETADDR_IPV4:
+         CMCHKUNPK(cmUnpkCmIpv4NetAddr, &unpkParam->u.ipv4NetAddr, mBuf);
+         break;
+
+      case CM_NETADDR_IPV6:
+         CMCHKUNPK(cmUnpkCmIpv6NetAddr, &unpkParam->u.ipv6NetAddr, mBuf);
+         break;
+
+      default:
+         RETVALUE(RFAILED);
+   }
+
+   RETVALUE(ROK);
+}   /* cmUnpkCmNetAddr */
+
+\f
+/*
+*
+*       Fun:   cmUnpkCmTptAddr
+*
+*       Desc:  This function unpacks the 
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmUnpkCmTptAddr
+(
+CmTptAddr                *unpkParam,   
+Buffer                   *mBuf         /* message buffer */
+)
+#else
+PUBLIC S16 cmUnpkCmTptAddr (unpkParam, mBuf)
+CmTptAddr                *unpkParam;   
+Buffer                   *mBuf;        /* message buffer */
+#endif
+{
+   TRC3(cmUnpkCmTptAddr)
+
+   CMCHKUNPK(SUnpkU8, &unpkParam->type, mBuf);
+
+   switch (unpkParam->type)
+   {
+      case CM_TPTADDR_NOTPRSNT:
+         break;
+
+      case CM_TPTADDR_IPV4:
+         CMCHKUNPK(cmUnpkCmIpv4TptAddr, &unpkParam->u.ipv4TptAddr, mBuf);
+         break;
+
+      case CM_TPTADDR_IPV6:
+         CMCHKUNPK(cmUnpkCmIpv6TptAddr, &unpkParam->u.ipv6TptAddr, mBuf);
+         break;
+
+      default:
+         RETVALUE(RFAILED);
+   }
+
+   RETVALUE(ROK);
+}   /* cmUnpkCmTptAddr */
+
+/* Moving IPv6 multicast information unpacking functions from cm_inet.c */
+#ifdef IPV6_SUPPORTED
+\f
+/*
+*
+*       Fun:   cmUnpkCmNetMCastInf6
+*
+*       Desc:  This function unpacks the IPv6 multicast information 
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmUnpkCmNetMCastInf6
+(
+CmNetMCastInf6            *unpkParam,   /* IPv6 multicast information */
+Buffer                    *mBuf         /* message buffer */
+)
+#else
+PUBLIC S16 cmUnpkCmNetMCastInf6(unpkParam, mBuf)
+CmNetMCastInf6            *unpkParam;   /* IPv6 multicast information */
+Buffer                    *mBuf;        /* message buffer */
+#endif
+{
+   TRC3(cmUnpkCmNetMCastInf6)
+
+    CMCHKUNPK(SUnpkU32, &unpkParam->localInf, mBuf);
+    CMCHKUNPK(cmUnpkCmIpv6NetAddr, &unpkParam->mCastAddr, mBuf);
+
+   RETVALUE(ROK);
+}   /* cmUnpkCmNetMCastInf6 */
+#endif /* IPV6_SUPPORTED */
+
+\f
+/*
+*
+*       Fun:   cmUnpkCmSockOpts
+*
+*       Desc:  This function unpacks the socket options
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PRIVATE S16 cmUnpkCmSockOpts
+(
+CmSockOpts               *unpkParam,   /* socket options */
+Buffer                   *mBuf         /* message buffer */
+)
+#else
+PRIVATE S16 cmUnpkCmSockOpts (unpkParam, mBuf)
+CmSockOpts               *unpkParam;   /* socket options */
+Buffer                   *mBuf;        /* message buffer */
+#endif
+{
+   TRC3(cmUnpkCmSockOpts)
+
+   CMCHKUNPK(SUnpkU32, &unpkParam->level, mBuf);
+   CMCHKUNPK(SUnpkU32, &unpkParam->option, mBuf);
+
+   switch (unpkParam->option)
+   {
+      case CM_SOCKOPT_OPT_ADD_MCAST_MBR:
+      case CM_SOCKOPT_OPT_DRP_MCAST_MBR:
+#ifdef CM_INET2
+         CMCHKUNPK(cmUnpkCmNetAddr, &unpkParam->optVal.mCastInfo.localAddr, 
+                   mBuf);
+         CMCHKUNPK(cmUnpkCmNetAddr, &unpkParam->optVal.mCastInfo.mCastAddr, 
+                   mBuf);
+#else
+         CMCHKUNPK(cmUnpkCmNetAddr, &unpkParam->optVal.mCastAddr, mBuf);
+#endif /* CM_INET2 */
+         break;
+
+      case CM_SOCKOPT_OPT_MCAST_IF:
+         CMCHKUNPK(cmUnpkCmNetAddr, &unpkParam->optVal.lclAddr, mBuf);
+         break;
+
+#ifdef IPV6_SUPPORTED
+      case CM_SOCKOPT_OPT_ADD_MCAST6_MBR:
+      case CM_SOCKOPT_OPT_DRP_MCAST6_MBR:
+         CMCHKUNPK(cmUnpkCmNetMCastInf6, &unpkParam->optVal.mCastInfo6, mBuf);
+         break;
+
+      case CM_SOCKOPT_OPT_MCAST6_IF:
+         CMCHKUNPK(SUnpkU32, &unpkParam->optVal.infId, mBuf);
+         break;
+#endif /* IPV6_SUPPORTED */
+
+      default:
+         CMCHKUNPK(SUnpkU32, &unpkParam->optVal.value, mBuf);
+         break;
+   }
+
+   RETVALUE(ROK);
+}   /* cmUnpkCmSockOpts */
+
+\f
+/*
+*
+*       Fun:   cmUnpkCmSockParam
+*
+*       Desc:  This function unpacks the socket parameters
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PRIVATE S16 cmUnpkCmSockParam
+(
+CmSockParam              *unpkParam,   /* socket parameters */
+Buffer                   *mBuf         /* message buffer */
+)
+#else
+PRIVATE S16 cmUnpkCmSockParam (unpkParam, mBuf)
+CmSockParam              *unpkParam;   /* socket parameters */
+Buffer                   *mBuf;        /* message buffer */
+#endif
+{
+   U32 num;
+
+   TRC3(cmUnpkCmSockParam)
+
+   CMCHKUNPK(SUnpkU8, &unpkParam->listenQSize, mBuf);
+   CMCHKUNPK(SUnpkU8, &unpkParam->numOpts, mBuf);
+
+   if( unpkParam->numOpts > CM_MAX_SOCK_OPTS)
+   {
+      RETVALUE(RFAILED);
+   }
+
+   for(num = 0; num < unpkParam->numOpts; num++)
+   {
+      CMCHKUNPK(cmUnpkCmSockOpts, &unpkParam->sockOpts[num], mBuf);
+   }
+
+   RETVALUE(ROK);
+}   /* cmUnpkCmSockParam */
+
+\f
+#ifdef CM_TLS
+/*
+*
+*       Fun:   cmUnpkTlsTptParam
+*
+*       Desc:  This function unpacks the socket parameters
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PRIVATE S16 cmUnpkTlsTptParam
+(
+TlsTptParam              *unpkParam,   /* TLS parameters */
+Buffer                   *mBuf         /* message buffer */
+)
+#else
+PRIVATE S16 cmUnpkTlsTptParam (unpkParam, mBuf)
+TlsTptParam              *unpkParam;   /* TLS parameters */
+Buffer                   *mBuf;        /* message buffer */
+#endif
+{
+   U32 num;
+
+   TRC3(cmUnpkTlsTptParam)
+
+   CMCHKUNPK(SUnpkS16, &unpkParam->ctxId, mBuf);
+   CMCHKUNPK(SUnpkU8, &unpkParam->listenQSize, mBuf);
+   CMCHKUNPK(SUnpkU8, &unpkParam->numOpts, mBuf);
+
+   if( unpkParam->numOpts > CM_MAX_SOCK_OPTS)
+   {
+      RETVALUE(RFAILED);
+   }
+
+   for(num = 0; num < unpkParam->numOpts; num++)
+   {
+      CMCHKUNPK(cmUnpkCmSockOpts, &unpkParam->sockOpts[num], mBuf);
+   }
+
+   RETVALUE(ROK);
+}  /* cmUnpkTlsTptParam */
+
+#endif  /* CM_TLS */
+
+\f
+/*
+*
+*       Fun:   cmUnpkCmTptParam
+*
+*       Desc:  This function unpacks the transport parameters 
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmUnpkCmTptParam
+(
+CmTptParam               *unpkParam,   /* transport parameters */
+Buffer                   *mBuf         /* message buffer */
+)
+#else
+PUBLIC S16 cmUnpkCmTptParam (unpkParam, mBuf)
+CmTptParam               *unpkParam;   /* transport parameters */
+Buffer                   *mBuf;        /* message buffer */
+#endif
+{
+   TRC3(cmUnpkCmTptParam)
+
+   CMCHKUNPK(SUnpkU8, &unpkParam->type, mBuf);
+
+   switch (unpkParam->type)
+   {
+      case CM_TPTPARAM_NOTPRSNT:
+         break;
+
+      case CM_TPTPARAM_SOCK:
+         CMCHKUNPK(cmUnpkCmSockParam, &unpkParam->u.sockParam, mBuf);
+         break;
+
+#ifdef CM_AAL
+      case CM_TPTPARAM_AAL:
+         CMCHKUNPK(cmUnpkAalConParam, &unpkParam->u.aalParam, mBuf);
+         break;
+#endif
+
+#ifdef CM_TLS
+      case CM_TPTPARAM_TLS:
+         CMCHKUNPK(cmUnpkTlsTptParam, &unpkParam->u.tlsParam, mBuf);
+         break;
+#endif
+
+      default:
+         RETVALUE(RFAILED);
+   }
+
+   RETVALUE(ROK);
+}   /* cmUnpkCmTptParam */
+
+
+#ifdef CM_INET2  
+\f
+/*
+*
+*       Fun:   cmPkCmIpHdrParm
+*
+*       Desc:  This function packs the the IP hedear parameters for both 
+*              IPV4 and IPV6. 
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmPkCmIpHdrParm
+(
+CmIpHdrParm             *pkParam,   /* IP hdr parameters */ 
+Buffer                  *mBuf       /* message buffer */
+)
+#else
+PUBLIC S16 cmPkCmIpHdrParm (pkParam, mBuf)
+CmIpHdrParm             *pkParam;   /* IP hdr parameters */
+Buffer                  *mBuf;      /* message buffer */
+#endif
+{
+   TRC3(cmPkCmIpHdrParm)
+
+   switch (pkParam->type)
+   {
+      case CM_HDRPARM_NOTPRSNT:
+      case CM_HDRPARM_ICMP6:
+         break;
+
+      case CM_HDRPARM_IPV4:
+
+         /* call to pack ipv4 options */
+#ifdef IPV4_OPTS_SUPPORTED
+         /* ipv4 IP options */
+         CMCHKPK(cmPkTknStr64, &pkParam->u.hdrParmIpv4.ipv4HdrOpt, mBuf);
+#endif /* IPV4_OPTS_SUPPORTED */
+         
+         CMCHKPK(cmPkTknU8, &pkParam->u.hdrParmIpv4.ttl, mBuf);
+         CMCHKPK(cmPkTknU8, &pkParam->u.hdrParmIpv4.tos, mBuf);
+         CMCHKPK(cmPkTknU8, &pkParam->u.hdrParmIpv4.dfBit, mBuf); 
+         CMCHKPK(cmPkTknU8, &pkParam->u.hdrParmIpv4.proto, mBuf);
+         break;
+
+      case CM_HDRPARM_IPV6:
+#ifdef IPV6_SUPPORTED    
+         /* call to pack ipv6 extn hdrs */
+#ifdef IPV6_OPTS_SUPPORTED 
+         /* pack IPV6 extension headers */
+         CMCHKPK(cmPkCmIpv6ExtHdr, &pkParam->u.hdrParmIpv6.ipv6ExtHdr, mBuf);
+#endif /* IPV6_OPTS_SUPPORTED */
+         CMCHKPK(cmPkCmNetAddr, &pkParam->u.hdrParmIpv6.srcAddr6, mBuf); 
+         CMCHKPK(cmPkTknU8, &pkParam->u.hdrParmIpv6.ttl, mBuf);          
+#endif /* IPV6_SUPPORTED */ 
+         break;
+   
+      default:
+         RETVALUE(RFAILED);
+   }
+   CMCHKPK(SPkU8, pkParam->type, mBuf);
+
+   RETVALUE(ROK);
+}   /* End of cmPkCmIpHdrParm */
+
+\f
+/* added new unpack function for local interface */
+#ifdef LOCAL_INTF
+/*
+*
+*       Fun:   cmUnpkCmTptLocalInf
+*
+*       Desc:  This function unpacks the local interface info on which 
+*              IPV4/IPV6 packet was received on.
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmUnpkCmTptLocalInf
+(
+CmTptLocalInf           *unpkParam, /* local interface info */
+Buffer                  *mBuf       /* message buffer */
+)
+#else
+PUBLIC S16 cmUnpkCmTptLocalInf (unpkParam, mBuf)
+CmTptLocalInf           *unpkParam; /* local interface info */
+Buffer                  *mBuf;      /* message buffer */
+#endif
+{
+   TRC3(cmUnpkCmTptLocalInf)
+
+   /* first unpack the bool intfPrsnt value which is always packed */
+   CMCHKUNPK(cmUnpkBool, &unpkParam->intfPrsnt, mBuf);
+   
+   /* if the above unpacked bool is TRUE then we have to unpack further
+    * to get the local intf index and intf address */   
+   if (unpkParam->intfPrsnt == TRUE)
+   {   
+      CMCHKUNPK(SUnpkU32, &unpkParam->localIf, mBuf);
+      CMCHKUNPK(cmUnpkCmNetAddr, &unpkParam->localIfAddr, mBuf); 
+   }
+   RETVALUE(ROK);
+}   /* cmUnpkCmTptLocalInf */
+#endif /* LOCAL_INTF */
+
+\f
+/* added new functions */
+#ifdef IPV6_OPTS_SUPPORTED 
+/*
+*       Fun:   cmPkCmIpv6ExtHdr
+*
+*       Desc:  This function packs the IPV6 extension headers
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmPkCmIpv6ExtHdr
+(
+CmIpv6ExtHdr             *pkParam,   /* IPV6 extension hdrs */
+Buffer                   *mBuf       /* message buffer */
+)
+#else
+PUBLIC S16 cmPkCmIpv6ExtHdr (pkParam, mBuf)
+CmIpv6ExtHdr             *pkParam;   /*IPV6 extension hdrs */
+Buffer                   *mBuf;      /* message buffer */
+#endif
+{
+   TRC3(cmPkCmIpv6ExtHdr)
+
+   /* pack first Route hdr */   
+   if (pkParam->rtOptsPrsnt)
+      CMCHKPK(cmPkCmIpv6RtHdr, &pkParam->rtOpts, mBuf);  
+   CMCHKPK(cmPkBool, pkParam->rtOptsPrsnt, mBuf);  
+
+   /* pack Dest Opt hdr */
+   if (pkParam->destOptsPrsnt)
+      CMCHKPK(cmPkCmIpv6DestOptsArr, &pkParam->destOptsArr, mBuf);  
+   CMCHKPK(cmPkBool, pkParam->destOptsPrsnt, mBuf);  
+
+   /* pack HBH hdr */
+   if (pkParam->hbhHdrPrsnt)
+      CMCHKPK(cmPkCmIpv6HBHHdrArr, &pkParam->hbhOptsArr, mBuf);  
+   CMCHKPK(cmPkBool, pkParam->hbhHdrPrsnt, mBuf);  
+
+   RETVALUE(ROK);
+} /* end of cmPkCmIpv6ExtHdr */
+
+\f
+/*
+*
+*       Fun:   cmPkCmIpv6RtHdr
+*
+*       Desc:  This function packs the IPV6 route header
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmPkCmIpv6RtHdr
+(
+CmIpv6RtHdr             *pkParam,   /* IPV6 Route hdr */
+Buffer                   *mBuf      /* message buffer */
+)
+#else
+PUBLIC S16 cmPkCmIpv6RtHdr (pkParam, mBuf)
+CmIpv6RtHdr             *pkParam;   /* IPV6 Route hdr */
+Buffer                   *mBuf;     /* message buffer */
+#endif
+{
+   U8 idx;
+   
+   TRC3(cmPkCmIpv6RtHdr);
+
+   /* pack all IPV6 addrs in the route hdr */
+   for(idx = 0; idx < pkParam->numAddrs; idx++)
+   {
+      CMCHKPK(cmPkCmIpv6NetAddr, &pkParam->ipv6Addrs[idx], mBuf);
+   }
+   /* pack reserve byte & strict/loose bit map */
+   CMCHKPK(SPkU32, pkParam->slMap, mBuf);
+   CMCHKPK(SPkU8, pkParam->numAddrs, mBuf);  
+
+   RETVALUE(ROK);
+} /* end of cmPkCmIpv6RtHdr */
+
+\f
+/*
+*
+*       Fun:   cmUnpkCmIpv6RtHdr
+*
+*       Desc:  This function unpacks the IPV6 route header
+*
+*       Ret:   ROK
+*              ROUTRES - out of resources
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmUnpkCmIpv6RtHdr
+(
+CmIpv6RtHdr             *unpkParam,  /* IPV6 Route hdr */
+Buffer                  *mBuf,       /* message buffer */
+Mem                     *memInfo     /* meminfo to allocate for Route hdr */
+)
+#else
+PUBLIC S16 cmUnpkCmIpv6RtHdr (unpkParam, mBuf, memInfo)
+CmIpv6RtHdr             *unpkParam;  /* IPV6 Route hdr */
+Buffer                  *mBuf;       /* message buffer */
+Mem                     *memInfo;    /* meminfo to allocate for Route hdr */
+#endif
+{
+   U8 idx;  /* array index */
+   S32 retVal; /* temporary return value */
+   
+   TRC3(cmUnpkCmIpv6RtHdr);
+   
+   CMCHKUNPK(SUnpkU8, &unpkParam->numAddrs, mBuf);
+   
+   /* unpack reserve byte & strict/loose bit map */
+   CMCHKUNPK(SUnpkU32, &unpkParam->slMap, mBuf);
+   
+   retVal = SGetSBuf(memInfo->region,    
+                  memInfo->pool,                     
+                 (Data **)&unpkParam->ipv6Addrs, 
+                 (unpkParam->numAddrs * 16));
+      
+   if (retVal != ROK)
+   {
+      RETVALUE(ROUTRES);
+   }
+   
+   /* unpack all IPV6 addrs in the route hdr */
+   for(idx = 0; idx < unpkParam->numAddrs; idx++)
+   {
+      CMCHKUNPK(cmUnpkCmIpv6NetAddr, &unpkParam->ipv6Addrs[idx], mBuf);
+   }
+
+   RETVALUE(ROK);
+} /* end of cmUnpkCmIpv6RtHdr */
+
+\f
+/*
+*
+*       Fun:   cmUnpkCmIpv6ExtHdr
+*
+*       Desc:  This function unpacks the IPv6 extension header
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmUnpkCmIpv6ExtHdr
+(
+CmIpv6ExtHdr             *unpkParam,  /* IPV6 extension hdrs */
+Buffer                   *mBuf,       /* message buffer */
+Mem                      *memInfo     /* meminfo to allocate for IPV6 ext hdr */
+)
+#else
+PUBLIC S16 cmUnpkCmIpv6ExtHdr (unpkParam, mBuf, memInfo)
+CmIpv6ExtHdr             *unpkParam; /* IPV6 extension hdrs */
+Buffer                   *mBuf;      /* message buffer */
+Mem                      *memInfo;   /* meminfo to allocate for IPV6 ext hdr */
+#endif
+{
+   TRC3(cmUnpkCmIpv6ExtHdr)
+      
+   /* unpack HBH hdr first */
+   CMCHKUNPK(cmUnpkBool, &unpkParam->hbhHdrPrsnt, mBuf); 
+   if (unpkParam->hbhHdrPrsnt)
+      cmUnpkCmIpv6HBHHdrArr(&unpkParam->hbhOptsArr, mBuf, memInfo);         
+                                                         
+   /* unpack DEST opt hdr */
+   CMCHKUNPK(cmUnpkBool, &unpkParam->destOptsPrsnt, mBuf);
+   if (unpkParam->destOptsPrsnt)
+      cmUnpkCmIpv6DestOptsArr(&unpkParam->destOptsArr, mBuf, memInfo);   
+
+   /* unpack Route hdr last */
+   CMCHKUNPK(cmUnpkBool, &unpkParam->rtOptsPrsnt, mBuf); 
+   if (unpkParam->rtOptsPrsnt)
+      cmUnpkCmIpv6RtHdr(&unpkParam->rtOpts, mBuf, memInfo);  
+                                                        
+   RETVALUE(ROK);
+} /* end of cmUnpkCmIpv6ExtHdr */
+
+\f
+/*
+*
+*       Fun:   cmPkCmIpv6DestOptsArr
+*
+*       Desc:  This function packs the IPV6 Destination Option array
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmPkCmIpv6DestOptsArr
+(
+CmIpv6DestOptsArr       *pkParam,  /* IPV6 Dest hdr array */
+Buffer                  *mBuf      /* message buffer */
+)
+#else
+PUBLIC S16 cmPkCmIpv6DestOptsArr (pkParam, mBuf)
+CmIpv6DestOptsArr       *pkParam;  /* IPV6 Dest hdr array */
+Buffer                  *mBuf;     /* message buffer */
+#endif
+{
+
+   U8 numOptions;
+
+   TRC3(cmPkCmIpv6DestOptsArr);
+   
+   /* pack all HBH options */
+   for(numOptions = 0; numOptions<pkParam->numDestOpts; numOptions++)  
+      CMCHKPK(cmPkCmIpv6DestOptsHdr, &pkParam->destOpts[numOptions], mBuf);
+   CMCHKPK(SPkU8, pkParam->numDestOpts, mBuf);  
+
+   RETVALUE(ROK);
+} /* end of cmPkCmIpv6DestOptsArr */
+
+\f
+/*
+*
+*       Fun:   cmPkCmIpv6DestOptsHdr
+*
+*       Desc:  This function packs individua IPV6 Destination Option
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmPkCmIpv6DestOptsHdr
+(
+CmIpv6DestOptsHdr       *pkParam,  /* IPV6 Dest opt */
+Buffer                  *mBuf      /* message buffer */
+)
+#else
+PUBLIC S16 cmPkCmIpv6DestOptsHdr (pkParam, mBuf)
+CmIpv6DestOptsHdr       *pkParam;  /* IPV6 Dest opt */
+Buffer                  *mBuf;     /* message buffer */
+#endif
+{
+   U8 optLen;
+   
+   TRC3(cmPkCmIpv6DestOptsHdr);
+
+   for(optLen = 0; optLen < pkParam->length; optLen++)
+   {
+      CMCHKPK(SPkU8, pkParam->value[optLen], mBuf);
+   }
+   CMCHKPK(SPkU8, pkParam->length, mBuf);  
+   CMCHKPK(SPkU8, pkParam->type, mBuf);  
+
+   RETVALUE(ROK);
+} /* end of cmPkCmIpv6DestOptsHdr */
+
+\f
+/*
+*
+*       Fun:   cmUnpkCmIpv6DestOptsHdr
+*
+*       Desc:  This function unpacks individual IPV6 Dest Option
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmUnpkCmIpv6DestOptsHdr
+(
+CmIpv6DestOptsHdr       *unpkParam,/* IPV6 Dest Option */
+Buffer                  *mBuf,     /* message buffer */
+Mem                     *memInfo   /* meminfo to allocate mem for dest opt */
+)
+#else
+PUBLIC S16 cmUnpkCmIpv6DestOptsHdr (unpkParam, mBuf, memInfo)
+CmIpv6DestOptsHdr       *unpkParam;/* IPV6 Dest Option */
+Buffer                  *mBuf;     /* message buffer */
+Mem                     *memInfo;  /* meminfo to allocate mem for dest opt */
+#endif
+{
+   S32 retVal;                        /* temporary return value */
+   U8 optLen;                      /* length of value field */
+
+   TRC3(cmUnpkCmIpv6DestOptsHdr);
+  
+   /* unpack type, length */
+   CMCHKUNPK(SUnpkU8, &unpkParam->type, mBuf);  
+   CMCHKUNPK(SUnpkU8, &unpkParam->length, mBuf);
+
+   /* allocate static memory to hold the unpacked values */
+   retVal = SGetSBuf(memInfo->region,                   
+                  memInfo->pool,                     
+                  (Data **)&unpkParam->value, (Size)unpkParam->length);
+   if (retVal != ROK)
+   {
+      RETVALUE(ROUTRES);
+   }
+      
+   /* unpack value fieldof this option */
+   for(optLen = 0; optLen<unpkParam->length; optLen++)
+   {
+      CMCHKUNPK(SUnpkU8, &unpkParam->value[optLen], mBuf);  
+   }    
+   
+   RETVALUE(ROK);
+} /* end of cmUnpkCmIpv6DestOptsHdr */
+
+\f
+/*
+*
+*       Fun:   cmUnpkCmIpv6DestOptsArr
+*
+*       Desc:  This function unpacks the IPV6 Destination Option array
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmUnpkCmIpv6DestOptsArr
+(
+CmIpv6DestOptsArr       *unpkParam, /* all IPV6 Destination Options */
+Buffer                  *mBuf,      /* message buffer */
+Mem                     *memInfo    /* meminfo to allocate mem for dest opts */
+)
+#else
+PUBLIC S16 cmUnpkCmIpv6DestOptsArr (unpkParam, mBuf, memInfo)
+CmIpv6DestOptsArr       *unpkParam; /* all IPV6 Destination Options */
+Buffer                  *mBuf;      /* message buffer */
+Mem                     *memInfo;   /* meminfo to allocate mem for dest opts */
+#endif
+{
+   U8 numOptions;
+   S16 retVal;
+   
+   TRC3(cmUnpkCmIpv6DestOptsArr);
+
+   CMCHKUNPK(SUnpkU8, &unpkParam->numDestOpts, mBuf); 
+   if (unpkParam->numDestOpts)
+   {
+      /* allocate mem to hold all dest options */
+      retVal = SGetSBuf(memInfo->region,    
+                     memInfo->pool,                     
+                     (Data **)&unpkParam->destOpts, 
+                     (unpkParam->numDestOpts * sizeof(CmIpv6DestOptsHdr)));
+      
+      if (retVal != ROK)
+      {
+         RETVALUE(ROUTRES);
+      }
+   
+      /* unpack all dest options */
+      for(numOptions = 0; numOptions<unpkParam->numDestOpts; numOptions++)
+         if ((retVal = cmUnpkCmIpv6DestOptsHdr(&unpkParam->destOpts[numOptions],
+                                            mBuf, memInfo)) != ROK)
+            RETVALUE(RFAILED);   
+   
+   }                                             
+   RETVALUE(ROK);
+} /* end of cmUnpkCmIpv6DestOptsArr */
+
+\f
+/*
+*
+*       Fun:   cmPkCmIpv6HBHHdrArr
+*
+*       Desc:  This function packs the all IPV6 HopByHop options
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmPkCmIpv6HBHHdrArr
+(
+CmIpv6HBHHdrArr         *pkParam,  /* all IPV6 HopByHop options */
+Buffer                  *mBuf      /* message buffer */
+)
+#else
+PUBLIC S16 cmPkCmIpv6HBHHdrArr (pkParam, mBuf)
+CmIpv6HBHHdrArr         *pkParam;  /* IPV6 HopByHop options */
+Buffer                  *mBuf;     /* message buffer */
+#endif
+{
+   U8 numOptions;
+   
+   TRC3(cmPkCmIpv6HBHHdrArr);
+
+   for(numOptions = 0; numOptions<pkParam->numHBHOpts; numOptions++)
+      CMCHKPK(cmPkCmIpv6HBHHdr, &pkParam->hbhOpts[numOptions], mBuf);
+                          
+   CMCHKPK(SPkU8, pkParam->numHBHOpts, mBuf);  
+
+   RETVALUE(ROK);
+} /* end of cmPkCmIpv6HBHHdrArr */
+
+\f
+/*
+*
+*       Fun:   cmPkCmIpv6HBHHdr
+*
+*       Desc:  This function packs individual IPV6 HBH options
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmPkCmIpv6HBHHdr
+(
+CmIpv6HBHHdr            *pkParam,  /* individual IPV6 HBH options */
+Buffer                  *mBuf      /* message buffer */
+)
+#else
+PUBLIC S16 cmPkCmIpv6HBHHdr (pkParam, mBuf)
+CmIpv6HBHHdr            *pkParam;  /* individual IPV6 HBH options */
+Buffer                  *mBuf;     /* message buffer */
+#endif
+{
+   U8 optLen;
+
+   TRC3(cmPkCmIpv6HBHHdr);
+
+   /* pack value field */
+   for(optLen = 0; optLen<pkParam->length; optLen++)
+   {
+      CMCHKPK(SPkU8, pkParam->value[optLen], mBuf);
+   }
+
+   /* pack type, length fields */
+   CMCHKPK(SPkU8, pkParam->length, mBuf);  
+   CMCHKPK(SPkU8, pkParam->type, mBuf);  
+
+   RETVALUE(ROK);
+} /* end of cmPkCmIpv6HBHHdr */
+
+\f
+/*
+*
+*       Fun:   cmUnpkCmIpv6HBHHdr
+*
+*       Desc:  This function unpacks individual IPV6 HBH Option
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmUnpkCmIpv6HBHHdr
+(
+CmIpv6HBHHdr            *unpkParam,/* individual IPV6 HBH Option */
+Buffer                  *mBuf,     /* message buffer */
+Mem                     *memInfo   /* meminfo to allocate mem for HBH opt */
+)
+#else
+PUBLIC S16 cmUnpkCmIpv6HBHHdr (unpkParam, mBuf, memInfo)
+CmIpv6HBHHdr            *unpkParam;/* individual IPV6 HBH Option */
+Buffer                  *mBuf;     /* message buffer */
+Mem                     *memInfo;  /* meminfo to allocate mem for HBH opt */
+#endif
+{
+   S32 retVal;                     /* temporary return value */
+   U8 optLen;                      /* length of value field */
+  
+   TRC3(cmUnpkCmIpv6HBHHdr)
+   
+   CMCHKUNPK(SUnpkU8, &unpkParam->type, mBuf);   
+   CMCHKUNPK(SUnpkU8, &unpkParam->length, mBuf);
+
+   /* allocate static memory to hold the unpacked values */
+   if (unpkParam->length)
+   {
+      retVal = SGetSBuf(memInfo->region,                   
+                     memInfo->pool,                     
+                     (Data **)&unpkParam->value, (Size)unpkParam->length); 
+      if (retVal != ROK)
+      {
+         RETVALUE(ROUTRES);
+      }
+
+      for(optLen = 0; optLen<unpkParam->length; optLen++)
+         CMCHKUNPK(SUnpkU8, &unpkParam->value[optLen], mBuf);  
+   } 
+      
+   RETVALUE(ROK);
+} /* end of cmUnpkCmIpv6HBHHdr */
+
+\f
+/*
+*
+*       Fun:   cmUnpkCmIpv6HBHHdrArr
+*
+*       Desc:  This function unpacks all IPV6 HopByHop options
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmUnpkCmIpv6HBHHdrArr
+(
+CmIpv6HBHHdrArr       *unpkParam,  /* all HBH options */
+Buffer                *mBuf,       /* message buffer */
+Mem                   *memInfo     /* meminfo to allocate space for HBH opt */
+)
+#else
+PUBLIC S16 cmUnpkCmIpv6HBHHdrArr (unpkParam, mBuf, memInfo)
+CmIpv6HBHHdrArr       *unpkParam;  /*  all HBH options */
+Buffer                *mBuf;       /* message buffer */
+Mem                   *memInfo;    /* meminfo to allocate space for HBH opt */
+#endif
+{
+   U8 numOptions; 
+   S16 retVal;
+
+   TRC3(cmUnpkCmIpv6HBHHdrArr);
+
+   CMCHKUNPK(SUnpkU8, &unpkParam->numHBHOpts, mBuf);   
+   if (unpkParam->numHBHOpts)
+   {
+      /*  allocate space for all HBH options */
+      retVal = SGetSBuf(memInfo->region,    
+                     memInfo->pool,                     
+                     (Data **)&unpkParam->hbhOpts, 
+                     (unpkParam->numHBHOpts * sizeof(CmIpv6HBHHdr)));
+      
+      if (retVal != ROK)
+      {
+         RETVALUE(ROUTRES);
+      }
+
+      for(numOptions = 0; numOptions<unpkParam->numHBHOpts; numOptions++)
+         cmUnpkCmIpv6HBHHdr(&unpkParam->hbhOpts[numOptions], mBuf, memInfo);
+   }                                              
+   RETVALUE(ROK);
+} /* end of cmUnpkCmIpv6HBHHdrArr */
+#endif /* IPV6_OPTS_SUPPORTED */
+
+\f  
+/*
+*
+*       Fun:   cmUnpkCmIPHdrParm
+*
+*       Desc:  This function unpacks the IP header parameters
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+/* added */
+#ifdef IPV6_OPTS_SUPPORTED
+PUBLIC S16 cmUnpkCmIpHdrParm
+(
+CmIpHdrParm              *unpkParam,/* ip hdr parameters */
+Buffer                   *mBuf,     /* message buffer */
+Mem                      *memInfo   /* meminfo to allocate mem for ipHdrParam */
+)
+#else
+PUBLIC S16 cmUnpkCmIpHdrParm
+(
+CmIpHdrParm              *unpkParam,/* ip hdr parameters */
+Buffer                   *mBuf     /* message buffer */
+)
+#endif /* IPV6_OPTS_SUPPORTED */
+#else
+/* added */
+#ifdef IPV6_OPTS_SUPPORTED
+PUBLIC S16 cmUnpkCmIpHdrParm (unpkParam, mBuf, memInfo)
+CmIpHdrParm              *unpkParam;/* ip hdr parameters */
+Buffer                   *mBuf;     /* message buffer */
+Mem                      *memInfo;  /* meminfo to allocate mem for ipHdrParam */
+#else
+PUBLIC S16 cmUnpkCmIpHdrParm (unpkParam, mBuf)
+CmIpHdrParm              *unpkParam;/* ip hdr parameters */
+Buffer                   *mBuf;     /* message buffer */
+#endif /* IPV6_OPTS_SUPPORTED */
+#endif
+{
+   TRC3(cmUnpkCmIpHdrParm)
+
+   CMCHKUNPK(SUnpkU8, &unpkParam->type, mBuf);
+
+   switch (unpkParam->type)
+   {
+      case CM_HDRPARM_NOTPRSNT:
+      case CM_HDRPARM_ICMP6:
+         break;
+
+      case CM_HDRPARM_IPV4:
+         CMCHKUNPK(cmUnpkTknU8, &unpkParam->u.hdrParmIpv4.proto, mBuf);
+         CMCHKUNPK(cmUnpkTknU8, &unpkParam->u.hdrParmIpv4.dfBit, mBuf);
+         CMCHKUNPK(cmUnpkTknU8, &unpkParam->u.hdrParmIpv4.tos, mBuf);
+         CMCHKUNPK(cmUnpkTknU8, &unpkParam->u.hdrParmIpv4.ttl, mBuf);
+#ifdef IPV4_OPTS_SUPPORTED
+         CMCHKUNPK(cmUnpkTknStr64, &unpkParam->u.hdrParmIpv4.ipv4HdrOpt, mBuf);
+#endif /* IPV4_OPTS_SUPPORTED */
+         break;
+
+      case CM_HDRPARM_IPV6:
+#ifdef IPV6_SUPPORTED         
+         CMCHKUNPK(cmUnpkTknU8, &unpkParam->u.hdrParmIpv6.ttl, mBuf);
+   
+         CMCHKUNPK(cmUnpkCmNetAddr, 
+                   &unpkParam->u.hdrParmIpv6.srcAddr6, mBuf);
+#ifdef IPV6_OPTS_SUPPORTED
+         /* memInfo is passed forward to alloc mem to hold unpacked 
+          * IPV6 etx hdr data */
+         cmUnpkCmIpv6ExtHdr(&unpkParam->u.hdrParmIpv6.ipv6ExtHdr, 
+                            mBuf, memInfo);
+#endif /* IPV6_OPTS_SUPPORTED */         
+#endif /* IPV6_SUPPORTED */
+         break;
+   
+      default:
+         RETVALUE(RFAILED);
+   }
+   
+   RETVALUE(ROK);
+}   /* End of cmUnpkCmIpHdrParm */
+
+\f
+/*
+*
+*       Fun:   cmPkCmIcmpFilter
+*
+*       Desc:  This function packs the ICMP filter parameters
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmPkCmIcmpFilter
+(
+CmIcmpFilter             *pkParam,   
+Buffer                   *mBuf       /* message buffer */
+)
+#else
+PUBLIC S16 cmPkCmIcmpFilter (pkParam, mBuf)
+CmIcmpFilter             *pkParam;   
+Buffer                   *mBuf;      /* message buffer */
+#endif
+{
+   /* Variable declaration */
+   S16   idx;
+  
+   TRC3(cmPkCmIcmpFilter)
+
+   switch (pkParam->type)
+   {
+      case CM_ICMP_NO_FILTER:
+         break;
+
+      case CM_ICMPVER4_FILTER:
+         for(idx = (pkParam->u.icmpv4Filter.num-1); idx >= 0; idx--)
+         {
+            CMCHKPK(SPkU32, pkParam->u.icmpv4Filter.icmpError[idx].errCodeMask,
+                    mBuf);
+            CMCHKPK(SPkU8, pkParam->u.icmpv4Filter.icmpError[idx].errType,
+                    mBuf);
+         }
+         CMCHKPK(SPkU8, pkParam->u.icmpv4Filter.num, mBuf);
+         CMCHKPK(SPkU8, pkParam->u.icmpv4Filter.protocol, mBuf);
+         CMCHKPK(SPkU8, pkParam->u.icmpv4Filter.allMsg, mBuf);
+         CMCHKPK(SPkU8, pkParam->u.icmpv4Filter.icmpMsgFlag, mBuf);
+         break;
+
+      case CM_ICMPVER6_FILTER:
+     /* The structure is yet to be decided */
+     /* CMCHKPK(cmPkCmIpv6HdrParm, &pkParam->u.ipv6HdrParm, mBuf); */
+#ifdef IPV6_SUPPORTED
+         for(idx = (pkParam->u.icmpv6Filter.num - 1); idx >= 0; idx--)
+         {
+            CMCHKPK(SPkU32, pkParam->u.icmpv6Filter.icmpError[idx].errCodeMask,
+                    mBuf);
+            CMCHKPK(SPkU8, pkParam->u.icmpv6Filter.icmpError[idx].errType,
+                    mBuf);
+         }
+         CMCHKPK(SPkU8, pkParam->u.icmpv6Filter.num, mBuf);
+         CMCHKPK(SPkU8, pkParam->u.icmpv4Filter.allMsg, mBuf); 
+         CMCHKPK(SPkU8, pkParam->u.icmpv4Filter.icmpMsgFlag, mBuf);
+#endif /* IPV6_SUPPORTED */
+         break;
+   
+      default:
+         RETVALUE(RFAILED);
+   }
+   CMCHKPK(SPkU8, pkParam->type, mBuf);
+
+   RETVALUE(ROK);
+}
+
+\f  
+/*
+*
+*       Fun:   cmUnpkCmIcmpFilter
+*
+*       Desc:  This function unpacks the 
+*
+*       Ret:   ROK
+*
+*       Notes: None
+*
+*       File:  cm_tpt.c
+*
+*/
+#ifdef ANSI
+PUBLIC S16 cmUnpkCmIcmpFilter
+(
+CmIcmpFilter             *unpkParam,   
+Buffer                   *mBuf         /* message buffer */
+)
+#else
+PUBLIC S16 cmUnpkCmIcmpFilter (unpkParam, mBuf)
+CmIcmpFilter             *unpkParam;   
+Buffer                   *mBuf;        /* message buffer */
+#endif
+{
+   /* Variable declaration */ 
+   S16     idx;
+
+   TRC3(cmUnpkCmIcmpFilter)
+
+   CMCHKUNPK(SUnpkU8, &unpkParam->type, mBuf);
+
+   switch (unpkParam->type)
+   {
+      case CM_ICMP_NO_FILTER:
+         break;
+
+      case CM_ICMPVER4_FILTER:
+         CMCHKUNPK(SUnpkU8, &unpkParam->u.icmpv4Filter.icmpMsgFlag, mBuf);
+         CMCHKUNPK(SUnpkU8, &unpkParam->u.icmpv4Filter.allMsg, mBuf);
+         CMCHKUNPK(SUnpkU8, &unpkParam->u.icmpv4Filter.protocol, mBuf);
+         CMCHKUNPK(SUnpkU8, &unpkParam->u.icmpv4Filter.num, mBuf);
+
+         for(idx = 0; idx < (unpkParam->u.icmpv4Filter.num); idx++)
+         {
+            CMCHKUNPK(SUnpkU8, 
+                      &unpkParam->u.icmpv4Filter.icmpError[idx].errType, mBuf);
+            CMCHKUNPK(SUnpkU32, 
+                      &unpkParam->u.icmpv4Filter.icmpError[idx].errCodeMask, 
+                      mBuf);
+         }
+         break;
+
+      case CM_ICMPVER6_FILTER:
+#ifdef IPV6_SUPPORTED
+         CMCHKUNPK(SUnpkU8, &unpkParam->u.icmpv6Filter.icmpMsgFlag, mBuf);
+         CMCHKUNPK(SUnpkU8, &unpkParam->u.icmpv6Filter.allMsg, mBuf); 
+         CMCHKUNPK(SUnpkU8, &unpkParam->u.icmpv6Filter.num, mBuf);
+
+         for(idx = 0; idx < (unpkParam->u.icmpv6Filter.num); idx++)
+         {
+            CMCHKUNPK(SUnpkU8, 
+                      &unpkParam->u.icmpv6Filter.icmpError[idx].errType, mBuf);
+            CMCHKUNPK(SUnpkU32, 
+                      &unpkParam->u.icmpv6Filter.icmpError[idx].errCodeMask, 
+                      mBuf);
+         }
+#endif /* IPV6_SUPPORTED */
+         break;
+   
+      default:
+         RETVALUE(RFAILED);
+
+   }
+   
+   RETVALUE(ROK);
+}   /* End of cmUnpkCmIcmpFilter */
+
+#endif  /* CM_INET2 */ 
+
+\f  
+#endif /* if(LCHCT || LCHIT || LCLHC || LCHRT || LCLHR) */
+
+\f  
+/********************************************************************30**
+         End of file
+*********************************************************************31*/