diff --git a/source/DHCPClientUtils/DHCPv4Client/include/dhcp_client_common_utils.h b/source/DHCPClientUtils/DHCPv4Client/include/dhcp_client_common_utils.h index f89573b..0b103b7 100644 --- a/source/DHCPClientUtils/DHCPv4Client/include/dhcp_client_common_utils.h +++ b/source/DHCPClientUtils/DHCPv4Client/include/dhcp_client_common_utils.h @@ -94,6 +94,7 @@ typedef unsigned long ULONG; #define DHCPV6_OPT_82 82 // OPTION_SOL_MAX_RT: Solicite Maximum Retry Time #define DHCPV6_OPT_23 23 // OPTION_SOL_MAX_RT: Solicite Maximum Retry Time #define DHCPV6_OPT_95 95 // OPTION_SOL_MAX_RT: Solicite Maximum Retry Time +#define DHCPV6_OPT_94 94 #define DHCPV6_OPT_24 24 // OPTION_DOMAIN_LIST #define DHCPV6_OPT_83 83 // OPTION_INF_MAX_RT #define DHCPV6_OPT_17 17 // OPTION_VENDOR_OPTS diff --git a/source/DHCPClientUtils/DHCPv6Client/dhcpmgr_dibbler_plugin/dhcpmgr_dibbler_plugin.c b/source/DHCPClientUtils/DHCPv6Client/dhcpmgr_dibbler_plugin/dhcpmgr_dibbler_plugin.c index 5d16b19..6a49c0f 100644 --- a/source/DHCPClientUtils/DHCPv6Client/dhcpmgr_dibbler_plugin/dhcpmgr_dibbler_plugin.c +++ b/source/DHCPClientUtils/DHCPv6Client/dhcpmgr_dibbler_plugin/dhcpmgr_dibbler_plugin.c @@ -46,6 +46,7 @@ #define DHCPv6_OPTION_NTP "SRV_OPTION31" #define DHCPv6_OPTION_DSLITE "SRV_OPTION64" #define DHCPv6_OPTION_MAPT "SRV_OPTION95" +#define DHCPv6_OPTION_MAPE "SRV_OPTION94" #if 0 // Uncomment the following code to enable plugin logs @@ -238,6 +239,18 @@ static int get_and_fill_env_data_dhcp6(DHCPv6_PLUGIN_MSG *dhcpv6_data, char *inp DHCPMGR_LOG_INFO("[%s-%d] MAP-T configuration is missing\n", __FUNCTION__, __LINE__); } + /** MAP-E Configuration */ + if ((env = getenv(DHCPv6_OPTION_MAPE)) != NULL) + { + strncpy((char *) dhcpv6_data->mape.Container, env, sizeof(dhcpv6_data->mape.Container)); + DHCPMGR_LOG_INFO("[%s-%d] MAP-E configuration is updated\n", __FUNCTION__, __LINE__); + dhcpv6_data->mape.Assigned = true; + } + else + { + DHCPMGR_LOG_INFO("[%s-%d] MAP-E configuration is missing\n", __FUNCTION__, __LINE__); + } + /** Vendor Specific Information */ if ((env = getenv(DHCPv6_VENDOR_SPEC)) != NULL) { diff --git a/source/DHCPClientUtils/DHCPv6Client/dhcpv6_interface.h b/source/DHCPClientUtils/DHCPv6Client/dhcpv6_interface.h index 180480c..525a1bd 100644 --- a/source/DHCPClientUtils/DHCPv6Client/dhcpv6_interface.h +++ b/source/DHCPClientUtils/DHCPv6Client/dhcpv6_interface.h @@ -68,13 +68,11 @@ typedef struct _DHCPv6_PLUGIN_MSG unsigned char Container[BUFLEN_256]; /* MAP-T option 95 in hex format*/ }mapt; - #if 0 - //TODO: MAPE support not added yet + //MAPE struct { bool Assigned; /**< Have we been assigned mape config ? */ unsigned char Container[BUFLEN_256]; /* MAP-E option 94 in hex format*/ }mape; - #endif //Vendor Specific Options struct { diff --git a/source/DHCPClientUtils/DHCPv6Client/dhcpv6_interface_dibbler.c b/source/DHCPClientUtils/DHCPv6Client/dhcpv6_interface_dibbler.c index cca9c69..a403a46 100644 --- a/source/DHCPClientUtils/DHCPv6Client/dhcpv6_interface_dibbler.c +++ b/source/DHCPClientUtils/DHCPv6Client/dhcpv6_interface_dibbler.c @@ -147,6 +147,11 @@ static int dibbler_get_req_options(FILE * fout, dhcp_opt_list * req_opt_list) fputs(args, fout); break; + case DHCPV6_OPT_94: + snprintf(args, sizeof(args), "\n\toption 00%d hex \n", opt_list->dhcp_opt); + fputs(args, fout); + break; + case DHCPV6_OPT_64: fputs("\n\toption aftr\n", fout); break; diff --git a/source/DHCPMgrUtils/Makefile.am b/source/DHCPMgrUtils/Makefile.am index 29a0e49..6335298 100644 --- a/source/DHCPMgrUtils/Makefile.am +++ b/source/DHCPMgrUtils/Makefile.am @@ -38,11 +38,7 @@ libCcspDhcpMgrUtils_la_CPPFLAGS = -I$(top_srcdir)/source/DHCPMgrUtils/include \ -I$(top_srcdir)/source/DHCPMgrInterface/include \ -I$(top_srcdir)/source/DHCPServerUtils/utils/include -libCcspDhcpMgrUtils_la_SOURCES = cosa_common_util.c helpers.c dhcpmgr_recovery_handler.c dhcpmgr_controller.c dhcp_lease_monitor_thrd.c dhcpmgr_v4_lease_handler.c dhcpmgr_v6_lease_handler.c - -if FEATURE_SUPPORT_MAPT_NAT46 -libCcspDhcpMgrUtils_la_SOURCES += dhcpmgr_map_apis.c -endif +libCcspDhcpMgrUtils_la_SOURCES = cosa_common_util.c helpers.c dhcpmgr_recovery_handler.c dhcpmgr_controller.c dhcp_lease_monitor_thrd.c dhcpmgr_v4_lease_handler.c dhcpmgr_map_apis.c dhcpmgr_v6_lease_handler.c libCcspDhcpMgrUtils_la_LIBADD = -lccsp_common -ltelemetry_msgsender -lulog -lsyscfg -lsysevent -ltime_conversion -lprint_uptime \ ${top_builddir}/source/DHCPClientUtils/DHCPv4Client/libCcspDhcpMgr_Dhcpv4Client.la \ diff --git a/source/DHCPMgrUtils/dhcpmgr_map_apis.c b/source/DHCPMgrUtils/dhcpmgr_map_apis.c index eb39e1b..368f56d 100644 --- a/source/DHCPMgrUtils/dhcpmgr_map_apis.c +++ b/source/DHCPMgrUtils/dhcpmgr_map_apis.c @@ -63,29 +63,29 @@ extern token_t sysevent_token; /* * Static function prototypes */ -static RETURN_STATUS CosaDmlMaptParseResponse (PUCHAR pOptionBuf, UINT16 uiOptionBufLen); -static RETURN_STATUS CosaDmlMaptGetIPv6StringFromHex (PUCHAR pIPv6AddrH, PCHAR pIPv6AddrS); -static RETURN_STATUS CosaDmlMaptConvertStringToHexStream (PUCHAR pOptionBuf, PUINT16 uiOptionBufLen); +static RETURN_STATUS CosaDmlMapParseResponse (PUCHAR pOptionBuf, UINT16 uiOptionBufLen); +static RETURN_STATUS CosaDmlMapGetIPv6StringFromHex (PUCHAR pIPv6AddrH, PCHAR pIPv6AddrS); +static RETURN_STATUS CosaDmlMapConvertStringToHexStream (PUCHAR pOptionBuf, PUINT16 uiOptionBufLen); /* * Global definitions */ -static COSA_DML_MAPT_DATA g_stMaptData; +static COSA_DML_MAP_DATA g_stMapData; /* * Static function definitions */ static RETURN_STATUS -CosaDmlMaptGetIPv6StringFromHex +CosaDmlMapGetIPv6StringFromHex ( PUCHAR pIPv6AddrH, PCHAR pIPv6AddrS ) { - MAPT_LOG_INFO("Entry"); + MAP_LOG_INFO("Entry"); if ( !(pIPv6AddrH && pIPv6AddrS) ) { - MAPT_LOG_ERROR("NULL inputs(%s - %s) for IPv6 hex to string conversion!", + MAP_LOG_ERROR("NULL inputs(%s - %s) for IPv6 hex to string conversion!", pIPv6AddrH, pIPv6AddrS); return STATUS_FAILURE; } @@ -95,7 +95,7 @@ CosaDmlMaptGetIPv6StringFromHex if ( !inet_ntop(AF_INET6, pIPv6AddrH, pIPv6AddrS, BUFLEN_40) ) { - MAPT_LOG_ERROR("Invalid IPv6 hex address"); + MAP_LOG_ERROR("Invalid IPv6 hex address"); return STATUS_FAILURE; } @@ -103,70 +103,70 @@ CosaDmlMaptGetIPv6StringFromHex } static RETURN_STATUS -CosaDmlMaptParseResponse +CosaDmlMapParseResponse ( PUCHAR pOptionBuf, UINT16 uiOptionBufLen ) { RETURN_STATUS retStatus = STATUS_SUCCESS; - PCOSA_DML_MAPT_OPTION pStartBuf = NULL; - PCOSA_DML_MAPT_OPTION pNxtOption = NULL; - PCOSA_DML_MAPT_OPTION pEndBuf = NULL; + PCOSA_DML_MAP_OPTION pStartBuf = NULL; + PCOSA_DML_MAP_OPTION pNxtOption = NULL; + PCOSA_DML_MAP_OPTION pEndBuf = NULL; UINT16 uiOptionLen = 0; UINT16 uiOption = 0; PUCHAR pCurOption = 0; - MAPT_LOG_INFO("Entry"); + MAP_LOG_INFO("Entry"); if ( !(pOptionBuf && *(pOptionBuf+1)) ) { - MAPT_LOG_ERROR("MAPT Option-95 Response is NULL !!"); + MAP_LOG_ERROR("MAP Option Response is NULL !!"); return STATUS_FAILURE; } - pStartBuf = (PCOSA_DML_MAPT_OPTION)pOptionBuf; - pEndBuf = (PCOSA_DML_MAPT_OPTION)((PCHAR)pOptionBuf + uiOptionBufLen); - MAPT_LOG_INFO("<<>> Start : %p | End : %p", pStartBuf,pEndBuf); + pStartBuf = (PCOSA_DML_MAP_OPTION)pOptionBuf; + pEndBuf = (PCOSA_DML_MAP_OPTION)((PCHAR)pOptionBuf + uiOptionBufLen); + MAP_LOG_INFO("<<>> Start : %p | End : %p", pStartBuf,pEndBuf); for ( ;pStartBuf + 1 <= pEndBuf; pStartBuf = pNxtOption ) { uiOptionLen = ntohs(pStartBuf->OptLen); uiOption = ntohs(pStartBuf->OptType); pCurOption = (PUCHAR)(pStartBuf + 1); - pNxtOption = (PCOSA_DML_MAPT_OPTION)(pCurOption + uiOptionLen); - MAPT_LOG_INFO("<<>> Cur : %p | Nxt : %p", pCurOption,pNxtOption); - MAPT_LOG_INFO("<<>> Opt : %u | OpLen : %u", uiOption,uiOptionLen); + pNxtOption = (PCOSA_DML_MAP_OPTION)(pCurOption + uiOptionLen); + MAP_LOG_INFO("<<>> Cur : %p | Nxt : %p", pCurOption,pNxtOption); + MAP_LOG_INFO("<<>> Opt : %u | OpLen : %u", uiOption,uiOptionLen); /* option length field overrun */ if ( pNxtOption > pEndBuf ) { - MAPT_LOG_ERROR("Malformed MAP options!"); + MAP_LOG_ERROR("Malformed MAP options!"); retStatus = STATUS_FAILURE; //STATUS_BAD_PAYLOAD break; } switch ( uiOption ) { - case MAPT_OPTION_S46_RULE: + case MAP_OPTION_S46_RULE: { UINT8 bytesLeftOut = 0; UINT8 v6ByteLen = 0; UINT8 v6BitLen = 0; UCHAR v6Addr[BUFLEN_24]; - g_stMaptData.bFMR = (*pCurOption & 0x01)? TRUE : FALSE; - g_stMaptData.EaLen = *++pCurOption; - g_stMaptData.RuleIPv4PrefixLen = *++pCurOption; + g_stMapData.bFMR = (*pCurOption & 0x01)? TRUE : FALSE; + g_stMapData.EaLen = *++pCurOption; + g_stMapData.RuleIPv4PrefixLen = *++pCurOption; pCurOption++; - snprintf (g_stMaptData.RuleIPv4Prefix, sizeof(g_stMaptData.RuleIPv4Prefix), + snprintf (g_stMapData.RuleIPv4Prefix, sizeof(g_stMapData.RuleIPv4Prefix), "%d.%d.%d.%d", pCurOption[0], pCurOption[1], pCurOption[2], pCurOption[3]); - g_stMaptData.RuleIPv6PrefixLen = *(pCurOption += 4); - v6ByteLen = g_stMaptData.RuleIPv6PrefixLen / 8; - v6BitLen = g_stMaptData.RuleIPv6PrefixLen % 8; + g_stMapData.RuleIPv6PrefixLen = *(pCurOption += 4); + v6ByteLen = g_stMapData.RuleIPv6PrefixLen / 8; + v6BitLen = g_stMapData.RuleIPv6PrefixLen % 8; pCurOption++; memset (&v6Addr, 0, sizeof(v6Addr)); @@ -177,17 +177,17 @@ CosaDmlMaptParseResponse *((PCHAR)&v6Addr + v6ByteLen) &= 0xFF << (8 - v6BitLen); } - memcpy (&g_stMaptData.RuleIPv6PrefixH, v6Addr, + memcpy (&g_stMapData.RuleIPv6PrefixH, v6Addr, (v6ByteLen+(v6BitLen?1:0))*sizeof(CHAR)); - CosaDmlMaptGetIPv6StringFromHex (g_stMaptData.RuleIPv6PrefixH, - g_stMaptData.RuleIPv6Prefix); - MAPT_LOG_INFO("<<>> g_stMaptData.bFMR : %d", g_stMaptData.bFMR); - MAPT_LOG_INFO("<<>> g_stMaptData.EaLen : %u", g_stMaptData.EaLen); - MAPT_LOG_INFO("<<>> g_stMaptData.RuleIPv4PrefixLen : %u", g_stMaptData.RuleIPv4PrefixLen); - MAPT_LOG_INFO("<<>> g_stMaptData.RuleIPv4Prefix : %s", g_stMaptData.RuleIPv4Prefix); - MAPT_LOG_INFO("<<>> g_stMaptData.RuleIPv6PrefixLen : %u", g_stMaptData.RuleIPv6PrefixLen); - MAPT_LOG_INFO("<<>> g_stMaptData.RuleIPv6Prefix : %s", g_stMaptData.RuleIPv6Prefix); - MAPT_LOG_INFO("Parsing OPTION_S46_RULE Successful."); + CosaDmlMapGetIPv6StringFromHex (g_stMapData.RuleIPv6PrefixH, + g_stMapData.RuleIPv6Prefix); + MAP_LOG_INFO("<<>> g_stMapData.bFMR : %d", g_stMapData.bFMR); + MAP_LOG_INFO("<<>> g_stMapData.EaLen : %u", g_stMapData.EaLen); + MAP_LOG_INFO("<<>> g_stMapData.RuleIPv4PrefixLen : %u", g_stMapData.RuleIPv4PrefixLen); + MAP_LOG_INFO("<<>> g_stMapData.RuleIPv4Prefix : %s", g_stMapData.RuleIPv4Prefix); + MAP_LOG_INFO("<<>> g_stMapData.RuleIPv6PrefixLen : %u", g_stMapData.RuleIPv6PrefixLen); + MAP_LOG_INFO("<<>> g_stMapData.RuleIPv6Prefix : %s", g_stMapData.RuleIPv6Prefix); + MAP_LOG_INFO("Parsing OPTION_S46_RULE Successful."); /* * check port parameter option: @@ -197,12 +197,12 @@ CosaDmlMaptParseResponse */ bytesLeftOut = uiOptionLen - 8 - v6ByteLen - (v6BitLen?1:0); - g_stMaptData.Ratio = 1 << (g_stMaptData.EaLen - - (BUFLEN_32 - g_stMaptData.RuleIPv4PrefixLen)); + g_stMapData.Ratio = 1 << (g_stMapData.EaLen - + (BUFLEN_32 - g_stMapData.RuleIPv4PrefixLen)); /* RFC default */ - g_stMaptData.PsidOffset = 6; - MAPT_LOG_INFO("<<>> g_stMaptData.Ratio : %u", g_stMaptData.Ratio); - MAPT_LOG_INFO("<<>> bytesLeftOut : %u", bytesLeftOut); + g_stMapData.PsidOffset = 6; + MAP_LOG_INFO("<<>> g_stMapData.Ratio : %u", g_stMapData.Ratio); + MAP_LOG_INFO("<<>> bytesLeftOut : %u", bytesLeftOut); if ( bytesLeftOut > 0 ) { /* this rule option includes port param option */ @@ -212,104 +212,113 @@ CosaDmlMaptParseResponse UINT16 uiSubOption = 0; pCurOption += v6ByteLen + (v6BitLen?1:0); - uiSubOptionLen = ntohs(((PCOSA_DML_MAPT_OPTION)pCurOption)->OptLen); - uiSubOption = ntohs(((PCOSA_DML_MAPT_OPTION)pCurOption)->OptType); + uiSubOptionLen = ntohs(((PCOSA_DML_MAP_OPTION)pCurOption)->OptLen); + uiSubOption = ntohs(((PCOSA_DML_MAP_OPTION)pCurOption)->OptType); - if ( uiSubOption == MAPT_OPTION_S46_PORT_PARAMS && + if ( uiSubOption == MAP_OPTION_S46_PORT_PARAMS && uiSubOptionLen == 4 ) { - g_stMaptData.PsidOffset = (*(pCurOption += uiSubOptionLen))? + g_stMapData.PsidOffset = (*(pCurOption += uiSubOptionLen))? *pCurOption:6; - g_stMaptData.PsidLen = *++pCurOption; + g_stMapData.PsidLen = *++pCurOption; - if ( !g_stMaptData.EaLen ) + if ( !g_stMapData.EaLen ) { - g_stMaptData.Ratio = 1 << g_stMaptData.PsidLen; + g_stMapData.Ratio = 1 << g_stMapData.PsidLen; } /* * RFC 7598: 4.5: 16 bits long. The first k bits on the left of * this field contain the PSID binary value. The remaining (16 - k) * bits on the right are padding zeros. */ - g_stMaptData.Psid = ntohs(*((PUINT16)++pCurOption)) >> - (16 - g_stMaptData.PsidLen); - MAPT_LOG_INFO("<<>> g_stMaptData.Psid : %u", g_stMaptData.Psid); - MAPT_LOG_INFO("<<>> g_stMaptData.PsidLen : %u", g_stMaptData.PsidLen); - MAPT_LOG_INFO("<<>> g_stMaptData.PsidOffset : %u", g_stMaptData.PsidOffset); - MAPT_LOG_INFO("<<>> g_stMaptData.Ratio : %u", g_stMaptData.Ratio); - MAPT_LOG_INFO("Parsing OPTION_S46_PORT_PARAM Successful."); + g_stMapData.Psid = ntohs(*((PUINT16)++pCurOption)) >> + (16 - g_stMapData.PsidLen); + MAP_LOG_INFO("<<>> g_stMapData.Psid : %u", g_stMapData.Psid); + MAP_LOG_INFO("<<>> g_stMapData.PsidLen : %u", g_stMapData.PsidLen); + MAP_LOG_INFO("<<>> g_stMapData.PsidOffset : %u", g_stMapData.PsidOffset); + MAP_LOG_INFO("<<>> g_stMapData.Ratio : %u", g_stMapData.Ratio); + MAP_LOG_INFO("Parsing OPTION_S46_PORT_PARAM Successful."); } else { - MAPT_LOG_WARNING("OPTION_S46_PORT_PARAM option length(%d) varies!" + MAP_LOG_WARNING("OPTION_S46_PORT_PARAM option length(%d) varies!" , uiSubOptionLen); } } else { - MAPT_LOG_WARNING("Port param option length(%d) not equal to 8" + MAP_LOG_WARNING("Port param option length(%d) not equal to 8" , bytesLeftOut); } } break; } - case MAPT_OPTION_S46_BR: + case MAP_OPTION_S46_BR: { - MAPT_LOG_WARNING("Parsing OPTION_S46_BR is not supported !"); - //retStatus = STATUS_NOT_SUPPORTED; + UCHAR br_ipv6Addr[BUFLEN_24]; // Buffer to hold the BR IPv6 address + + //Directly copy the 16-byte IPv6 address from the current option buffer + memset(&br_ipv6Addr, 0, sizeof(br_ipv6Addr)); + memcpy(&br_ipv6Addr, pCurOption, 16); + + CosaDmlMapGetIPv6StringFromHex(br_ipv6Addr, g_stMapData.BrIPv6Prefix); + MAP_LOG_INFO("<<>> g_stMapData.BrIPv6Address : %s", g_stMapData.BrIPv6Prefix); + MAP_LOG_INFO("Parsing MAP_OPTION_S46_BR Successful."); break; } - case MAPT_OPTION_S46_DMR: + case MAP_OPTION_S46_DMR: { UCHAR ipv6Addr[BUFLEN_24]; - g_stMaptData.BrIPv6PrefixLen = *pCurOption++; + g_stMapData.BrIPv6PrefixLen = *pCurOption++; - /* RFC 6052: 2.2: g_stMaptData.BrIPv6PrefixLen%8 must be 0! */ + /* RFC 6052: 2.2: g_stMapData.BrIPv6PrefixLen%8 must be 0! */ memset (&ipv6Addr, 0, sizeof(ipv6Addr)); - memcpy (&ipv6Addr, pCurOption, g_stMaptData.BrIPv6PrefixLen/8); + memcpy (&ipv6Addr, pCurOption, g_stMapData.BrIPv6PrefixLen/8); - CosaDmlMaptGetIPv6StringFromHex (ipv6Addr, g_stMaptData.BrIPv6Prefix); - MAPT_LOG_INFO("<<>> g_stMaptData.BrIPv6PrefixLen : %u", g_stMaptData.BrIPv6PrefixLen); - MAPT_LOG_INFO("<<>> g_stMaptData.BrIPv6Prefix : %s", g_stMaptData.BrIPv6Prefix); - MAPT_LOG_INFO("Parsing OPTION_S46_DMR Successful."); + CosaDmlMapGetIPv6StringFromHex (ipv6Addr, g_stMapData.BrIPv6Prefix); + MAP_LOG_INFO("<<>> g_stMapData.BrIPv6PrefixLen : %u", g_stMapData.BrIPv6PrefixLen); + MAP_LOG_INFO("<<>> g_stMapData.BrIPv6Prefix : %s", g_stMapData.BrIPv6Prefix); + MAP_LOG_INFO("Parsing OPTION_S46_DMR Successful."); break; } default: - MAPT_LOG_ERROR("Unknown or unexpected MAP option : %d | option len : %d" + MAP_LOG_ERROR("Unknown or unexpected MAP option : %d | option len : %d" , uiOption, uiOptionLen); //retStatus = STATUS_NOT_SUPPORTED; break; } } +#if defined(FEATURE_MAPT) || defined(FEATURE_SUPPORT_MAPT_NAT46) /* Check a parameter from each mandatory options */ - if ( !g_stMaptData.RuleIPv6PrefixLen || !g_stMaptData.BrIPv6PrefixLen) + if ( !g_stMapData.RuleIPv6PrefixLen || !g_stMapData.BrIPv6PrefixLen) { - MAPT_LOG_ERROR("Mandatory mapt options are missing !"); + MAP_LOG_ERROR("Mandatory mapt options are missing !"); retStatus = STATUS_FAILURE; } +#endif return retStatus; } static RETURN_STATUS -CosaDmlMaptConvertStringToHexStream +CosaDmlMapConvertStringToHexStream ( PUCHAR pWriteBf, PUINT16 uiOptionBufLen ) { PUCHAR pReadBf = pWriteBf; - MAPT_LOG_INFO("Entry"); + MAP_LOG_INFO("Entry"); if ( !pWriteBf ) { - MAPT_LOG_ERROR("MAPT string buffer is empty !!"); + MAP_LOG_ERROR("MAP string buffer is empty !!"); return STATUS_FAILURE; } @@ -320,7 +329,7 @@ CosaDmlMaptConvertStringToHexStream pReadBf[strlen((PCHAR)pReadBf)-1] = '\0'; } - MAPT_LOG_INFO("<<>> pOptionBuf is %p : %s",pReadBf, pReadBf); + MAP_LOG_INFO("<<>> pOptionBuf is %p : %s",pReadBf, pReadBf); while ( *pReadBf && *(pReadBf+1) ) { if ( *pReadBf == ':' && pReadBf++ ) {} @@ -333,13 +342,13 @@ CosaDmlMaptConvertStringToHexStream ++*uiOptionBufLen; } *pWriteBf = '\0'; - MAPT_LOG_INFO("<<>> BufLen : %d", *uiOptionBufLen); + MAP_LOG_INFO("<<>> BufLen : %d", *uiOptionBufLen); return STATUS_SUCCESS; } static RETURN_STATUS -CosaDmlMaptValidate +CosaDmlMapValidate ( PCHAR pPdIPv6Prefix, UINT16 ui16PdPrefixLen, @@ -351,7 +360,7 @@ CosaDmlMaptValidate UINT8 ui8EaLen = 0 ; struct in6_addr ipv6Addr; - MAPT_LOG_INFO("Entry"); + MAP_LOG_INFO("Entry"); // V4 suffix bits length ui8v4BitIdxLen = BUFLEN_32 - ui16v4PrefixLen; @@ -362,121 +371,118 @@ CosaDmlMaptValidate // PSID length ui8PsidBitIdxLen = ui8EaLen - ui8v4BitIdxLen; - MAPT_LOG_INFO("<<>> ui8v4BitIdxLen(IPV4 Suffix Bits): %u", ui8v4BitIdxLen); - MAPT_LOG_INFO("<<>> ui8EaLen (EA bits) : %u", ui8EaLen); - MAPT_LOG_INFO("<<>> ui8PsidBitIdxLen(PSID length) : %u", ui8PsidBitIdxLen); + MAP_LOG_INFO("<<>> ui8v4BitIdxLen(IPV4 Suffix Bits): %u", ui8v4BitIdxLen); + MAP_LOG_INFO("<<>> ui8EaLen (EA bits) : %u", ui8EaLen); + MAP_LOG_INFO("<<>> ui8PsidBitIdxLen(PSID length) : %u", ui8PsidBitIdxLen); - if (ui8EaLen != g_stMaptData.EaLen) + if (ui8EaLen != g_stMapData.EaLen) { - MAPT_LOG_INFO("Calculated EA-bits and received MAP EA-bits does not match!"); + MAP_LOG_INFO("Calculated EA-bits and received MAP EA-bits does not match!"); return STATUS_FAILURE; } if ( ui16PdPrefixLen < ui16v6PrefixLen ) { - MAPT_LOG_ERROR("Invalid MAPT option, ui16PdPrefixLen(%d) < ui16v6PrefixLen(%d)", + MAP_LOG_ERROR("Invalid MAP option, ui16PdPrefixLen(%d) < ui16v6PrefixLen(%d)", ui16PdPrefixLen, ui16v6PrefixLen); return STATUS_FAILURE; } if ( inet_pton(AF_INET6, pPdIPv6Prefix, &ipv6Addr) <= 0 ) { - MAPT_LOG_ERROR("Invalid IPv6 address = %s", pPdIPv6Prefix); + MAP_LOG_ERROR("Invalid IPv6 address = %s", pPdIPv6Prefix); return STATUS_FAILURE; } - MAPT_LOG_INFO("MAPT validation successful."); + MAP_LOG_INFO("MAP validation successful."); return STATUS_SUCCESS; } /** - * @brief Parses the MAPT option 95 response. + * @brief Parses the MAPE/MAPT options 94 & 95 response respectively. * - * This function processes the MAPT option 95 response, extracts the relevant information and updates ipc_dhcpv6_data_t struct with mapt details + * This function processes the MAPE/MAPT options response, extracts the relevant information and updates ipc_map_data_t struct with map details * * @param[in] pPdIPv6Prefix Pointer to the IPv6 prefix. - * @param[in] pOptionBuf Pointer to the buffer containing the option 95 data. - * @param[out] mapt Pointer to the structure where the parsed MAP-T data will be stored. + * @param[in] pOptionBuf Pointer to the buffer containing the option 94/95 data. + * @param[out] map Pointer to the structure where the parsed MAP data will be stored. * * @return ANSC_STATUS indicating the success or failure of the operation. */ -ANSC_STATUS DhcpMgr_MaptParseOpt95Response +ANSC_STATUS DhcpMgr_MapParseOptResponse ( const PCHAR pPdIPv6Prefix, - PUCHAR pOptionBuf, - ipc_mapt_data_t *mapt + PUCHAR pOptionBuf, + ipc_map_data_t *map ) { RETURN_STATUS ret = STATUS_SUCCESS; UINT16 uiOptionBufLen = 0; - MAPT_LOG_INFO("Entry"); + MAP_LOG_INFO("Entry"); /* Convert the received string buffer into hex stream */ - memset (&g_stMaptData, 0, sizeof(g_stMaptData)); - if ( CosaDmlMaptConvertStringToHexStream (pOptionBuf, &uiOptionBufLen) != STATUS_SUCCESS ) + memset (&g_stMapData, 0, sizeof(g_stMapData)); + if ( CosaDmlMapConvertStringToHexStream (pOptionBuf, &uiOptionBufLen) != STATUS_SUCCESS ) { - MAPT_LOG_ERROR("MAPT string buffer to HexStream conversion Failed !!"); + MAP_LOG_ERROR("MAP string buffer to HexStream conversion Failed !!"); ret = STATUS_FAILURE; } /* Store IPv6 prefix and length */ - memcpy (&g_stMaptData.PdIPv6Prefix, pPdIPv6Prefix, + memcpy (&g_stMapData.PdIPv6Prefix, pPdIPv6Prefix, (strchr(pPdIPv6Prefix, '/') - pPdIPv6Prefix)); - g_stMaptData.PdIPv6PrefixLen = strtol((strchr(pPdIPv6Prefix, '/') + 1), NULL, 10); - MAPT_LOG_INFO("<<>> Received PdIPv6Prefix : %s/%u", g_stMaptData.PdIPv6Prefix - , g_stMaptData.PdIPv6PrefixLen); - if ( !ret && !g_stMaptData.PdIPv6Prefix[0] ) + g_stMapData.PdIPv6PrefixLen = strtol((strchr(pPdIPv6Prefix, '/') + 1), NULL, 10); + MAP_LOG_INFO("<<>> Received PdIPv6Prefix : %s/%u", g_stMapData.PdIPv6Prefix + , g_stMapData.PdIPv6PrefixLen); + if ( !ret && !g_stMapData.PdIPv6Prefix[0] ) { - MAPT_LOG_ERROR("PdIPv6Prefix is NULL !!"); + MAP_LOG_ERROR("PdIPv6Prefix is NULL !!"); ret = STATUS_FAILURE; } /* Parse the hex buffer for mapt options */ - if ( !ret && CosaDmlMaptParseResponse (pOptionBuf, uiOptionBufLen) != STATUS_SUCCESS ) + if ( !ret && CosaDmlMapParseResponse (pOptionBuf, uiOptionBufLen) != STATUS_SUCCESS ) { - MAPT_LOG_ERROR("MAPT Parsing Response Failed !!"); + MAP_LOG_ERROR("MAP Parsing Response Failed !!"); ret = STATUS_FAILURE; } - /* validate MAPT responce */ - if ( !ret && CosaDmlMaptValidate ( g_stMaptData.PdIPv6Prefix - , g_stMaptData.PdIPv6PrefixLen - , g_stMaptData.RuleIPv6PrefixLen - , g_stMaptData.RuleIPv4PrefixLen + /* validate MAPT/MAPE responce */ + if ( !ret && CosaDmlMapValidate ( g_stMapData.PdIPv6Prefix + , g_stMapData.PdIPv6PrefixLen + , g_stMapData.RuleIPv6PrefixLen + , g_stMapData.RuleIPv4PrefixLen ) != STATUS_SUCCESS ) { - MAPT_LOG_ERROR("MAPT Psid and IPv4 Suffix Validation Failed !!"); - memset (&g_stMaptData, 0, sizeof(g_stMaptData)); + MAP_LOG_ERROR("MAP Psid and IPv4 Suffix Validation Failed !!"); + memset (&g_stMapData, 0, sizeof(g_stMapData)); } if( ret == STATUS_SUCCESS ) { - //Fill Required MAP-T information - mapt->v6Len = g_stMaptData.RuleIPv6PrefixLen; - mapt->isFMR = g_stMaptData.bFMR ? TRUE : FALSE; - mapt->eaLen = g_stMaptData.EaLen; - mapt->v4Len = g_stMaptData.RuleIPv4PrefixLen; - mapt->psidOffset = g_stMaptData.PsidOffset; - mapt->psidLen = g_stMaptData.PsidLen; - mapt->psid = g_stMaptData.Psid; - mapt->iapdPrefixLen = g_stMaptData.PdIPv6PrefixLen; - mapt->ratio = g_stMaptData.Ratio; - - snprintf (mapt->pdIPv6Prefix, BUFLEN_40, "%s", g_stMaptData.PdIPv6Prefix); - snprintf (mapt->ruleIPv4Prefix, BUFLEN_40, "%s", g_stMaptData.RuleIPv4Prefix); - snprintf (mapt->ruleIPv6Prefix, BUFLEN_40, "%s/%u", g_stMaptData.RuleIPv6Prefix - , g_stMaptData.RuleIPv6PrefixLen); - snprintf (mapt->brIPv6Prefix, BUFLEN_40, "%s/%u", g_stMaptData.BrIPv6Prefix - , g_stMaptData.BrIPv6PrefixLen); + //Fill Required MAP information + map->v6Len = g_stMapData.RuleIPv6PrefixLen; + map->isFMR = g_stMapData.bFMR ? TRUE : FALSE; + map->eaLen = g_stMapData.EaLen; + map->v4Len = g_stMapData.RuleIPv4PrefixLen; + map->psidOffset = g_stMapData.PsidOffset; + map->psidLen = g_stMapData.PsidLen; + map->psid = g_stMapData.Psid; + map->iapdPrefixLen = g_stMapData.PdIPv6PrefixLen; + map->ratio = g_stMapData.Ratio; + + snprintf (map->pdIPv6Prefix, BUFLEN_40, "%s", g_stMapData.PdIPv6Prefix); + snprintf (map->ruleIPv4Prefix, BUFLEN_40, "%s", g_stMapData.RuleIPv4Prefix); + snprintf (map->ruleIPv6Prefix, BUFLEN_40, "%s/%u", g_stMapData.RuleIPv6Prefix + , g_stMapData.RuleIPv6PrefixLen); + snprintf (map->brIPv6Prefix, BUFLEN_40, "%s/%u", g_stMapData.BrIPv6Prefix + , g_stMapData.BrIPv6PrefixLen); - MAPT_LOG_INFO("MAPT configuration complete.\n"); + MAP_LOG_INFO("MAP configuration complete.\n"); } return ((ret) ? ANSC_STATUS_FAILURE : ANSC_STATUS_SUCCESS); } - - - diff --git a/source/DHCPMgrUtils/dhcpmgr_map_apis.h b/source/DHCPMgrUtils/dhcpmgr_map_apis.h index 8db4c07..0798b0c 100644 --- a/source/DHCPMgrUtils/dhcpmgr_map_apis.h +++ b/source/DHCPMgrUtils/dhcpmgr_map_apis.h @@ -40,13 +40,13 @@ #include "ipc_msg.h" #include "cosa_apis.h" /* - * DHCP MAPT options macro definitions + * DHCP MAP options macro definitions */ -#define MAPT_OPTION_S46_RULE 89 -#define MAPT_OPTION_S46_BR 90 -#define MAPT_OPTION_S46_DMR 91 -#define MAPT_OPTION_S46_PORT_PARAMS 93 -#define MAPT_OPTION_S46_CONT_MAPT 95 +#define MAP_OPTION_S46_RULE 89 +#define MAP_OPTION_S46_BR 90 +#define MAP_OPTION_S46_DMR 91 +#define MAP_OPTION_S46_PORT_PARAMS 93 +#define MAP_OPTION_S46_CONT_MAPT 95 #define BUFLEN_4 4 #define BUFLEN_8 8 @@ -143,13 +143,13 @@ #define BOOLEAN unsigned char #endif -#define MAPT_LOG_INFO(format, ...) \ +#define MAP_LOG_INFO(format, ...) \ CcspTraceInfo (("%s - "format"\n", __FUNCTION__, ##__VA_ARGS__)) -#define MAPT_LOG_ERROR(format, ...) \ +#define MAP_LOG_ERROR(format, ...) \ CcspTraceError (("%s - "format"\n", __FUNCTION__, ##__VA_ARGS__)) -#define MAPT_LOG_NOTICE(format, ...) \ +#define MAP_LOG_NOTICE(format, ...) \ CcspTraceNotice (("%s - "format"\n", __FUNCTION__, ##__VA_ARGS__)) -#define MAPT_LOG_WARNING(format, ...) \ +#define MAP_LOG_WARNING(format, ...) \ CcspTraceWarning(("%s - "format"\n", __FUNCTION__, ##__VA_ARGS__)) @@ -165,7 +165,7 @@ _RETURN_STATUS } RETURN_STATUS; typedef struct -_COSA_DML_MAPT_DATA +_COSA_DML_MAP_DATA { CHAR RuleIPv4Prefix[BUFLEN_16]; CHAR RuleIPv6Prefix[BUFLEN_40]; @@ -187,32 +187,32 @@ _COSA_DML_MAPT_DATA UINT16 IPv4PsidLen; UINT32 Ratio; BOOLEAN bFMR; -} COSA_DML_MAPT_DATA, *PCOSA_DML_MAPT_DATA; +} COSA_DML_MAP_DATA, *PCOSA_DML_MAP_DATA; typedef struct -_COSA_DML_MAPT_OPTION +_COSA_DML_MAP_OPTION { UINT16 OptType; UINT16 OptLen; -} __attribute__ ((__packed__)) COSA_DML_MAPT_OPTION, *PCOSA_DML_MAPT_OPTION; +} __attribute__ ((__packed__)) COSA_DML_MAP_OPTION, *PCOSA_DML_MAP_OPTION; /** - * @brief Parses the MAPT option 95 response. + * @brief Parses the MAPE/MAPT options 94 & 95 response respectively. * - * This function processes the MAPT option 95 response, extracts the relevant information and updates ipc_dhcpv6_data_t struct with mapt details + * This function processes the MAPE/MAPT options response, extracts the relevant information and updates ipc_map_data_t struct with map details * * @param[in] pPdIPv6Prefix Pointer to the IPv6 prefix. - * @param[in] pOptionBuf Pointer to the buffer containing the option 95 data. - * @param[out] mapt Pointer to the structure where the parsed MAP-T data will be stored. + * @param[in] pOptionBuf Pointer to the buffer containing the option 94/95 data. + * @param[out] map Pointer to the structure where the parsed MAP data will be stored. * * @return ANSC_STATUS indicating the success or failure of the operation. */ -ANSC_STATUS DhcpMgr_MaptParseOpt95Response +ANSC_STATUS DhcpMgr_MapParseOptResponse ( const PCHAR pPdIPv6Prefix, - PUCHAR pOptionBuf, - ipc_mapt_data_t *mapt + PUCHAR pOptionBuf, + ipc_map_data_t *map ); #endif diff --git a/source/DHCPMgrUtils/dhcpmgr_v6_lease_handler.c b/source/DHCPMgrUtils/dhcpmgr_v6_lease_handler.c index 4c103ed..b9a12ef 100644 --- a/source/DHCPMgrUtils/dhcpmgr_v6_lease_handler.c +++ b/source/DHCPMgrUtils/dhcpmgr_v6_lease_handler.c @@ -93,6 +93,7 @@ static bool compare_dhcpv6_plugin_msg(const DHCPv6_PLUGIN_MSG *currentLease, con memcmp(¤tLease->ia_pd, &newLease->ia_pd, sizeof(currentLease->ia_pd)) != 0 || memcmp(¤tLease->dns, &newLease->dns, sizeof(currentLease->dns)) != 0 || memcmp(¤tLease->mapt, &newLease->mapt, sizeof(currentLease->mapt)) != 0 || + memcmp(¤tLease->mape, &newLease->mape, sizeof(currentLease->mape)) != 0 || strcmp(currentLease->domainName, newLease->domainName) != 0 || strcmp(currentLease->ntpserver, newLease->ntpserver) != 0 || strcmp(currentLease->aftr, newLease->aftr) != 0) @@ -151,6 +152,7 @@ void DhcpMgr_ProcessV6Lease(PCOSA_DML_DHCPCV6_FULL pDhcp6c) memcpy(&newLease->ia_pd, ¤t->ia_pd, sizeof(current->ia_pd)); //mapt is part of IAPD. If IAPD is renewed, mapt is also renewed. memcpy(&newLease->mapt, ¤t->mapt, sizeof(current->mapt)); + memcpy(&newLease->mape, ¤t->mape, sizeof(current->mape)); } if(compare_dhcpv6_plugin_msg(current, newLease) == FALSE) diff --git a/source/TR-181/middle_layer_src/dhcpmgr_rbus_apis.c b/source/TR-181/middle_layer_src/dhcpmgr_rbus_apis.c index b704d6f..a7bbf2c 100644 --- a/source/TR-181/middle_layer_src/dhcpmgr_rbus_apis.c +++ b/source/TR-181/middle_layer_src/dhcpmgr_rbus_apis.c @@ -26,7 +26,7 @@ #include "util.h" #include "dhcpv4_interface.h" #include "dhcpv6_interface.h" -#if defined(FEATURE_MAPT) || defined(FEATURE_SUPPORT_MAPT_NAT46) +#if defined(FEATURE_MAPT) || defined(FEATURE_SUPPORT_MAPT_NAT46) || defined(FEATURE_MAPE) #include "dhcpmgr_map_apis.h" #endif @@ -195,7 +195,7 @@ static void DhcpMgr_UpdateDhcpv6MapInfo(PCOSA_DML_DHCPCV6_FULL pDhcpv6c, DHCP_MG return; PDML_DHCPCV6_MAP_INFO mapInfo = &pDhcpv6c->Info.MapInfo; - ipc_mapt_data_t *mapt = &src->mapt; + ipc_map_data_t *mapt = &src->map; mapInfo->MaptAssigned = src->maptAssigned ? TRUE : FALSE; mapInfo->IsFMR = mapt->isFMR ? TRUE : FALSE; @@ -237,6 +237,11 @@ static void DhcpMgr_createDhcpv6LeaseInfoMsg(DHCPv6_PLUGIN_MSG *src, DHCP_MGR_IP dest->prefixAssigned = src->ia_pd.assigned; dest->domainNameAssigned = (strlen(src->domainName) > 0); + // Default to UNKNOWN + dest->map.mapType = MAP_TYPE_UNKNOWN; + dest->maptAssigned = FALSE; + dest->mapeAssigned = FALSE; + if(src->ipv6_TimeOffset) { dest->ipv6_TimeOffset = src->ipv6_TimeOffset; @@ -245,16 +250,28 @@ static void DhcpMgr_createDhcpv6LeaseInfoMsg(DHCPv6_PLUGIN_MSG *src, DHCP_MGR_IP { dest->ipv6_TimeOffset = 0; // Default value if not assigned } -#if defined(FEATURE_MAPT) || defined(FEATURE_SUPPORT_MAPT_NAT46) if(src->mapt.Assigned == TRUE) { +#if defined(FEATURE_MAPT) || defined(FEATURE_SUPPORT_MAPT_NAT46) unsigned char maptContainer[BUFLEN_256]; /* MAP-T option 95 in hex format*/ memset(maptContainer, 0, sizeof(maptContainer)); memcpy(maptContainer, src->mapt.Container, sizeof(src->mapt.Container)); - DhcpMgr_MaptParseOpt95Response(dest->sitePrefix, maptContainer, &dest->mapt); + DhcpMgr_MapParseOptResponse(dest->sitePrefix, maptContainer, &dest->map); dest->maptAssigned = TRUE; - } + dest->map.mapType = MAP_TYPE_MAPT; #endif // FEATURE_MAPT || FEATURE_SUPPORT_MAPT_NAT46 + } + else if (src->mape.Assigned == TRUE) + { +#ifdef FEATURE_MAPE + unsigned char mapeContainer[BUFLEN_256]; /* MAP-E option 94 in hex format*/ + memset(mapeContainer, 0, sizeof(mapeContainer)); + memcpy(mapeContainer, src->mape.Container, sizeof(src->mape.Container)); + DhcpMgr_MapParseOptResponse(dest->sitePrefix, mapeContainer, &dest->map); + dest->mapeAssigned = TRUE; + dest->map.mapType = MAP_TYPE_MAPE; +#endif + } } /**