--- ./source/private_module/omadapter/om_adapter_ip.c	2018-02-09 07:36:26.000000000 +0000
+++ ./source/private_module/omadapter/om_adapter_ip.c.hotpatch	2019-09-21 07:45:47.000000000 +0000
@@ -35,7 +35,7 @@
 static GET_INTERNAL_IP_BY_NID_FUNC s_getInternalIPByNid = NULL;
 
 /* add by c00281451, 2014.09.24, begin*/
-
+#define OM_IPV4_MASK_LEN_MAX    32
 /*****************************************************************************
    : ûȡָڵڲIPӿ
    : func   ӿں
@@ -148,7 +148,7 @@
 
     return B_TRUE;
 }
-
+int32_t OM_Adapter_GetLocalMntIp(uint32_t *ipAddr, uint32_t *netMask);
 /*****************************************************************************
    : ȡָڵڲIPб
    :
@@ -187,7 +187,7 @@
     DBG_LogDebug(OMADAPTER_LOG_ID0063, "OM_ADAPTER: Get {%u} internal ip by node id success.", nid);
     return RETURN_OK;
 }
-
+extern int32_t initOmMgtMntPortName(void);
 /*****************************************************************************
      : getMaintainIpInfo
    : ȡάڵipַ
@@ -200,73 +200,73 @@
 *****************************************************************************/
 int32_t getMaintainIpInfo(IP_INFO_STRU* pIPList)
 {
-    int32_t    iRet       = RETURN_ERROR;
-    uint32_t   localIp    = 0;
-    uint32_t   uiMask     = 0;
-    uint32_t   uiLoop     = 0;
-    uint8_t*    pIpStr    = NULL;
-    uint32_t   ipCount    = 0;
-    char  szMgntName[MAX_BOARD_IPADDR_NUM][MAX_MGNT_NAME_LEN] = {"eth2", "eth3"};
-    char  szIpAddr[MAX_BOARD_IPADDR_NUM][MAX_IP_STR_LEN];
-    uint32_t   index     = 0;
+    int32_t ret = RETURN_ERROR;
+    uint32_t localIp = 0;
+    uint32_t mask  = 0;
+    uint8_t *ip = NULL;
 
     if (NULL == pIPList)
     {
-        DBG_LogWarning(OMADAPTER_LOG_ID0064, "OM_ADAPTER: Input external ip list is null");
+        DBG_LogWarning(OMADAPTER_LOG_ID0064, "OM_ADAPTER: Input maintainece ip list is empty.");
         return RETURN_ERROR;
     }
 
-    memset(szIpAddr, 0, sizeof(szIpAddr));
-    pIpStr = (OSP_U8*)&localIp;
+    ret = initOmMgtMntPortName();
+    if (RETURN_OK != ret)
+    {
+        DBG_LogWarning(OMADAPTER_LOG_ID0064, "OM_ADAPTER: init global omm port name failed.");
+        return RETURN_ERROR;
+    }
+
+
+
+
 
-    getMgtEthName((char*)szMgntName, MAINTAIN_IP);
 
-    for (uiLoop = 0; uiLoop < MAX_BOARD_IPADDR_NUM; uiLoop++)
-    {
-        if (0 == strlen(szMgntName[uiLoop]))
-        {
-            continue;
-        }
 
-        /* жϹǷ */
-        if (RETURN_OK != IsMgmtNameExist(szMgntName[uiLoop]))
-        {
-            continue;
-        }
 
-        iRet = LVOS_GetEthIPAddr(szMgntName[uiLoop], &localIp, &uiMask);
-        if (RETURN_OK != iRet)
-        {
-            DBG_LogError(OMADAPTER_LOG_ID0006, "OM_ADAPTER: Get local (%s) IP failed.", szMgntName[uiLoop]);
-            continue;
-        }
 
-        snprintf(szIpAddr[uiLoop], MAX_IP_STR_LEN, "%u.%u.%u.%u",
-                 pIpStr[0], pIpStr[1], pIpStr[2], pIpStr[3]);
 
-        if (0 != strlen(szIpAddr[uiLoop]))
-        {
-            for (index = 0; index < MAX_BOARD_IPADDR_NUM; index++)
-            {
-                if (0 == strlen(pIPList->strIPList[index]))
-                {
-                    strncpy(pIPList->strIPList[index], (char*)szIpAddr[uiLoop], sizeof(pIPList->strIPList[index]) - 1);
-                    ipCount++;
-                    break;
-                }
 
-            }
 
 
-        }
 
-    }
 
-    pIPList->uiNum = ipCount;
-    if (0 == ipCount)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    
+    ip = (uint8_t *)&localIp;
+
+    ret = OM_Adapter_GetLocalMntIp(&localIp, &mask);
+    if (RETURN_OK != ret)
     {
+        DBG_LogWarning(OMADAPTER_LOG_ID0064, "OM_ADAPTER: Get local mnt ip failed(0x%x).", ret);
         return RETURN_ERROR;
     }
+    snprintf(pIPList->strIPList[0], MAX_IP_STR_LEN, "%u.%u.%u.%u",
+            ip[0], ip[1], ip[2], ip[3]);
+    pIPList->uiNum = 1;
 
     return RETURN_OK;
 }
@@ -814,5 +814,127 @@
     return RETURN_OK;
 }
 
+typedef enum tagOM_IP_INDEX_IN_IFCFG_E
+{
+    OM_FIRST_IP_IN_IFCFG = 0,
+    OM_SECOND_IP_IN_IFCFG = 1
+} OM_IP_INDEX_IN_IFCFG_E;
+
+/*****************************************************************************
+   : ǰ׺תΪ
+*****************************************************************************/
+void OmPrefixLenToNetMask(uint32_t prefixLen, uint32_t *netMask)
+{
+    if (0 == prefixLen)
+    {
+        *netMask = 0;
+        return;
+    }
+
+    if (prefixLen > OM_IPV4_MASK_LEN_MAX)
+    {
+        prefixLen = OM_IPV4_MASK_LEN_MAX;
+    }
+
+    /* Convert prefix to a 32-bit number in TCP/IP network byte order */
+    *netMask = (uint32_t)(~((1 << (OM_IPV4_MASK_LEN_MAX - prefixLen)) - 1));
+    *netMask = (uint32_t)htonl((uint64_t)*netMask);
+
+    return;
+}
+
+/*****************************************************************************
+   : Żȡip
+*****************************************************************************/
+int32_t OmGetIpFromCfgByIndex(char *portName, OM_IP_INDEX_IN_IFCFG_E ipIndex, uint32_t *ipAddr, uint32_t *netMask)
+{
+    int32_t ret = RETURN_OK;
+    uint32_t ipNum = 0;
+    uint32_t ipCount = 0;
+    LVOS_ip_s *ipList = NULL;
+
+    ret = LVOS_ip_addr_count_cfg(portName, &ipNum);
+    if ((RETURN_OK != ret) || (ipNum <= ipIndex))
+    {
+        return RETURN_ERROR;
+    }
+
+    ipList = (LVOS_ip_s *)LVOS_Malloc(ipNum * sizeof(LVOS_ip_s));
+    if (NULL == ipList)
+    {
+        DBG_LogWarning(OMADAPTER_LOG_ID0063, "OM_ADAPTER: Get %s ip from cfg, malloc failed.", portName);
+        return RETURN_ERROR;
+    }
+    memset(ipList, 0, ipNum * sizeof(LVOS_ip_s));
+    
+    ret = LVOS_ip_addr_show_cfg(portName, ipList, ipNum, &ipCount);
+    if ((RETURN_OK != ret) || (ipCount <= ipIndex))
+    {
+        LVOS_Free(ipList);
+        DBG_LogWarning(OMADAPTER_LOG_ID0063, "OM_ADAPTER: Get %s(count %u) ip from cfg failed(0x%x).", portName, ipCount, ret);
+        return RETURN_ERROR;
+    }
+    
+    ret = LVOS_inet_pton(AF_INET, ipList[ipIndex].ip_addr, ipAddr);
+    if ((ret <= 0) || (0 == *ipAddr))
+    {
+        DBG_LogWarning(OMADAPTER_LOG_ID0063, "OM_ADAPTER: Get %s ip from cfg failed(0x%x), invalid ipAddr(%s).",
+               portName, ret, ipList[ipIndex].ip_addr);
+        LVOS_Free(ipList);
+        return RETURN_ERROR;
+    }
+    
+    if (NULL != netMask)
+    {
+        OmPrefixLenToNetMask(ipList[ipIndex].prefix, netMask);
+        if (0 == *netMask)
+        {
+            DBG_LogWarning(OMADAPTER_LOG_ID0063, "OM_ADAPTER: Get %s ip from cfg failed becase of invalid prefix length(%u)\n",
+                   portName, ipList[ipIndex].prefix);
+            LVOS_Free(ipList);
+            return RETURN_ERROR;
+        }
+    }
+    
+    LVOS_Free(ipList);
+
+    return RETURN_OK;
+}
+
+extern uint32_t isMntSeprate(void);
+extern char *getOmMgt0PortName(void);
+extern char *getOmMgt1PortName(void);
+extern char *getOmMntPortName(void);
+
+int32_t OM_Adapter_GetLocalMntIp(uint32_t *ipAddr, uint32_t *netMask)
+{
+    uint32_t isMntSep = isMntSeprate();
+    char *portName = NULL;
+
+    if ((NULL == ipAddr) || (NULL == netMask))
+    {
+        DBG_LogWarning(OMADAPTER_LOG_ID0063, "OM_ADAPTER: Invalid param.\n");
+        return RETURN_ERROR;
+    }
+    
+    if (isMntSep)
+    {
+        portName = getOmMntPortName();
+        return OmGetIpFromCfgByIndex(portName, OM_FIRST_IP_IN_IFCFG, ipAddr, netMask);
+    }
+    else
+    {
+        portName = getOmMgt0PortName();
+        if (RETURN_OK == OmGetIpFromCfgByIndex(portName, OM_SECOND_IP_IN_IFCFG, ipAddr, netMask))
+        {
+            return RETURN_OK;
+        }
+        
+        portName = getOmMgt1PortName();
+        return OmGetIpFromCfgByIndex(portName, OM_SECOND_IP_IN_IFCFG, ipAddr, netMask);
+    }
+}
+
+
 #endif
 
--- ./source/private_module/omadapter/om_adapter_product_info.c	2018-02-09 07:36:26.000000000 +0000
+++ ./source/private_module/omadapter/om_adapter_product_info.c.hotpatch	2019-09-21 07:45:47.000000000 +0000
@@ -354,5 +354,92 @@
     return RETURN_OK;
 }
 
+#define OM_PORT_NAME_MAX_LEN    32
+
+#define OM_FILE_INITRD_CONF "/OSM/conf/initrd.conf"
+#define OM_CONF_INITRD_MGNT_PCI_ADDR "CONF_INITRD_MGNT_PCI_ADDR"
+#define OM_CONF_INITRD_MGNT_PCI_ADDR1 "CONF_INITRD_MGNT_PCI_ADDR1"
+#define OM_CONF_INITRD_MAINTAIN_PCI_ADDR "CONF_INITRD_MAINTAIN_PCI_ADDR"
+static char g_OMmgt0PortName[OM_PORT_NAME_MAX_LEN + 1] = {0};
+static char g_OMmgt1PortName[OM_PORT_NAME_MAX_LEN + 1] = {0};
+static char g_OMmntPortName[OM_PORT_NAME_MAX_LEN + 1] = {0};
+static uint32_t g_isMntSepratePort = B_TRUE;
+static uint32_t g_isMntNameInited = B_FALSE;
+
+uint32_t isMntSeprate(void)
+{
+    return g_isMntSepratePort;
+}
+
+char *getOmMgt0PortName(void)
+{
+    return g_OMmgt0PortName;
+}
+
+char *getOmMgt1PortName(void)
+{
+    return g_OMmgt1PortName;
+}
+
+char *getOmMntPortName(void)
+{
+    return g_OMmntPortName;
+}
+
+int32_t getInitrdFileItem(const char *itemName, char *value, uint32_t valueLen)
+{
+    CST_ITEM_T stItem;
+
+    memset(&stItem, 0, sizeof(stItem));
+
+    if (!CST_GetItemFromFile(OM_FILE_INITRD_CONF, "NULL", itemName, &stItem))
+    {
+        DBG_LogWarning(OMADAPTER_LOG_ID0073, "OM_ADAPTER: Failed to get (%s) value from initrd file.",
+            itemName);
+        return RETURN_ERROR;
+    }
+    else if ((0 == strlen(stItem.acValue)) || 
+            (strlen(stItem.acValue) > valueLen))
+    {
+        DBG_LogWarning(OMADAPTER_LOG_ID0074, "OM_ADAPTER: Failed to get (%s) value, the length(%d) is invalid.",
+            itemName, strlen(stItem.acValue));
+        return RETURN_ERROR;
+    }
+
+    LVOS_strncpy(value, stItem.acValue, valueLen);
+    return RETURN_OK;
+}
+
+int32_t initOmMgtMntPortName(void)
+{
+    if (g_isMntNameInited)
+    {
+        return RETURN_OK;
+    }
+    
+    (void)getInitrdFileItem(OM_CONF_INITRD_MGNT_PCI_ADDR, g_OMmgt0PortName, OM_PORT_NAME_MAX_LEN);
+    (void)getInitrdFileItem(OM_CONF_INITRD_MGNT_PCI_ADDR1, g_OMmgt1PortName, OM_PORT_NAME_MAX_LEN);
+    (void)getInitrdFileItem(OM_CONF_INITRD_MAINTAIN_PCI_ADDR, g_OMmntPortName, OM_PORT_NAME_MAX_LEN);
+
+    /* йȡҪش */
+    if ((0 == strlen(g_OMmgt0PortName)) && (0 == strlen(g_OMmgt1PortName)))
+    {
+        DBG_LogWarning(OMADAPTER_LOG_ID0073, "OM_ADAPTER: All mgt port name empty.");
+        return RETURN_ERROR;
+    }
+
+    /* άΪգ˵άip䵽ϵģάڡڷǷĳ */
+    if (0 == strlen(g_OMmntPortName))
+    {
+        g_isMntSepratePort = B_FALSE;
+    }
+    
+    DBG_LogInfo(OMADAPTER_LOG_ID0073, "OM_ADAPTER: Mgt0(%s), Mgt1(%s), Mnt0(%s)",
+           g_OMmgt0PortName, g_OMmgt1PortName, g_OMmntPortName);
+    
+    g_isMntNameInited = B_TRUE;
+    return RETURN_OK;
+}
+
 #endif
 
