代码拉取完成,页面将自动刷新
#include "basetype.h"
#include "common.h"
#include "addr_lib.h"
#include "icmp_lib.h"
#include "debug_lib.h"
#include "route_data.h"
ROUTE_DEVICE_S g_stRouteDeviceList;
INT32 RouteData_Init(VOID)
{
memset(&g_stRouteDeviceList, 0, sizeof(ROUTE_DEVICE_S));
return ERROR_SUCCESS;
}
/*
* description: 最佳路由排序 零件函数
* input: IN ROUTE_DATA_S* pstRoute1, IN ROUTE_DATA_S* pstRoute2 设备1 与设备2
* output: 设备1比设备2 更优返回1 否则返回-1 返回0:则表示路由优先级一样
* return: 错误码
* tip: IN是空宏,表示改参数是输入
* author: 丁通
*/
INT32 routedata_compareroute(IN ROUTE_DATA_S *pstRoute1, IN ROUTE_DATA_S *pstRoute2)
{
if (pstRoute1->usPrefixLen > pstRoute2->usPrefixLen)
return 1;
else if (pstRoute1->usPrefixLen < pstRoute2->usPrefixLen)
return -1;
else
{
if (pstRoute1->uiDstNetwork < pstRoute2->uiDstNetwork)
{
return 1;
}
else if (pstRoute1->uiDstNetwork > pstRoute2->uiDstNetwork)
{
return -1;
}
else
{
if (pstRoute1->usProtocol < pstRoute2->usProtocol)
return 1;
else if (pstRoute1->usProtocol > pstRoute2->usProtocol)
return -1;
else
return 0;
}
}
}
INT32 RouteData_AddDevice(IN UINT16 usDeviceId)
{
ROUTE_DEVICE_S *pstRouter;
pstRouter = malloc(sizeof(ROUTE_DEVICE_S)); /*生成新结点*/
if (NULL == pstRouter)
{
return ERROR_NO_MEMORY;
}
memset(pstRouter, 0, sizeof(ROUTE_DEVICE_S));
pstRouter->usDeviceId = usDeviceId;
/*创建单链表*/
pstRouter->pstNextDevice = g_stRouteDeviceList.pstNextDevice;
g_stRouteDeviceList.pstNextDevice = pstRouter;
return ERROR_SUCCESS;
}
INT32 RouteData_DelDevice(IN UINT16 usDeviceId)
{
ROUTE_DEVICE_S *pstRouterPre = NULL;
ROUTE_DEVICE_S *pstRouter = g_stRouteDeviceList.pstNextDevice;
while (1)
{
if (pstRouter == NULL)
{
return ERROR_NO_MEMORY;
}
if (usDeviceId != pstRouter->usDeviceId)
{
pstRouterPre = pstRouter;
pstRouter = pstRouter->pstNextDevice;
}
else
{
if (pstRouterPre == NULL)
{
g_stRouteDeviceList.pstNextDevice = pstRouter->pstNextDevice;
}
else
{
pstRouterPre->pstNextDevice = pstRouter->pstNextDevice;
}
free(pstRouter);
}
}
return ERROR_SUCCESS;
}
ROUTE_DEVICE_S *RouteData_FindDevice(UINT16 usDeviceId)
{
ROUTE_DEVICE_S *pstRouter = g_stRouteDeviceList.pstNextDevice;
while (1)
{
if (NULL == pstRouter)
{
return NULL;
}
if (usDeviceId != pstRouter->usDeviceId)
{
pstRouter = pstRouter->pstNextDevice;
}
else
{
return pstRouter;
}
}
}
INT32 RouteData_AddRoute(IN ROUTE_DEVICE_S *pstRouteDevice,
IN UINT32 uiDstNetwork, IN UINT32 uiMask, IN UINT16 usProtocol,
IN UINT16 usIfNum, IN UINT32 uiNexthop)
{
ROUTE_DATA_S *pstRouteNew;
ROUTE_DATA_S *pstRouterPre = &pstRouteDevice->stRouteList;
ROUTE_DATA_S *pstRoute = pstRouterPre->pstNextRoute;
DebugLib_Printf(MODULE_ROUTE, "RouteData_AddRoute in: uiDstNetwork=0x%x, uiMask=0x%x, usProtocol=%d, usIfNum=%d, uiNexthop=0x%x.\n",
uiDstNetwork, uiMask, usProtocol, usIfNum, uiNexthop);
pstRouteNew = malloc(sizeof(ROUTE_DATA_S));
if (NULL == pstRouteNew)
{
return ERROR_NOTENOUGH_MEMORY;
}
// 赋值
pstRouteNew->uiDstNetwork = uiDstNetwork & uiMask;
pstRouteNew->uiMask = uiMask;
pstRouteNew->usPrefixLen = AddrLib_MasktoPrefixLen(uiMask);
pstRouteNew->usProtocol = usProtocol;
pstRouteNew->usIfNum = usIfNum;
pstRouteNew->uiNexthop = uiNexthop;
pstRoute = pstRouteDevice->stRouteList.pstNextRoute;
for (;;)
{
if (NULL == pstRoute)
{
pstRouterPre->pstNextRoute = pstRouteNew;
pstRouteNew->pstNextRoute = NULL;
return ERROR_SUCCESS;
}
if (1 == routedata_compareroute(pstRouteNew, pstRoute))
{
pstRouterPre->pstNextRoute = pstRouteNew;
pstRouteNew->pstNextRoute = pstRoute;
return ERROR_SUCCESS;
}
else
{
pstRouterPre = pstRoute;
pstRoute = pstRoute->pstNextRoute;
}
}
}
INT32 RouteData_DelRoute(ROUTE_DEVICE_S *pstRouteDevice, UINT32 uiDstNetwork, UINT32 uiMask, UINT16 usProtocol, UINT16 usIfNum, UINT32 uiNexthop)
{
ROUTE_DATA_S *pstRoutePre = &pstRouteDevice->stRouteList;
ROUTE_DATA_S *pstRoute = pstRoutePre->pstNextRoute;
ROUTE_DATA_S *stRouteDel;
DebugLib_Printf(MODULE_ROUTE, "RouteData_DelRoute in: uiDstNetwork=0x%x, uiMask=0x%x, usProtocol=%d.\n",
uiDstNetwork, uiMask, usProtocol);
stRouteDel = malloc(sizeof(ROUTE_DATA_S));
stRouteDel->uiDstNetwork = uiDstNetwork;
stRouteDel->uiMask = uiMask;
stRouteDel->usPrefixLen = AddrLib_MasktoPrefixLen(uiMask);
stRouteDel->usProtocol = usProtocol;
stRouteDel->usIfNum = usIfNum;
stRouteDel->uiNexthop = uiNexthop;
while (1)
{
if (NULL == pstRoute)
{
return ERROR_NOT_EXIST;
}
if (0 == routedata_compareroute(stRouteDel, pstRoute))
{
pstRoutePre->pstNextRoute = pstRoute->pstNextRoute;
free(pstRoute);
return ERROR_SUCCESS;
}
pstRoutePre = pstRoute;
pstRoute = pstRoute->pstNextRoute;
}
}
/*协议:整形转字符型*/
UINT8 g_aucProtocol[ROUTE_PROTOCOL_MAX][10] =
{
"Interface",
"Static",
"Rip"};
INT32 RouteData_Print(IN ROUTE_DEVICE_S *pstRouteDevice)
{
ROUTE_DATA_S *pstRoutePre = &pstRouteDevice->stRouteList;
ROUTE_DATA_S *pstRoute = pstRoutePre->pstNextRoute;
UINT8 aucNexthop[16];
printf("DstNetwork/PrefixLen\t Protocol\tInterface NextHop\n");
for (;;)
{
if (NULL == pstRoute)
{
return ERROR_SUCCESS;
}
memset(aucNexthop, 0, 16);
if (0 == pstRoute->uiNexthop)
{
if (32 == pstRoute->usPrefixLen)
{
strcpy(aucNexthop, "Inloop");
}
else
{
strcpy(aucNexthop, "NA");
}
}
else
{
sprintf(aucNexthop, "%d.%d.%d.%d",
((pstRoute->uiNexthop) >> 24), ((pstRoute->uiNexthop & 0x00FF0000) >> 16),
((pstRoute->uiNexthop & 0x0000FF00) >> 8), (pstRoute->uiNexthop & 0x000000FF));
}
printf("%3d.%3d.%3d.%3d/%2d %14s %14d %14s\n",
((pstRoute->uiDstNetwork) >> 24), ((pstRoute->uiDstNetwork & 0x00FF0000) >> 16),
((pstRoute->uiDstNetwork & 0x0000FF00) >> 8), (pstRoute->uiDstNetwork & 0x000000FF),
pstRoute->usPrefixLen, g_aucProtocol[pstRoute->usProtocol], pstRoute->usIfNum, aucNexthop);
pstRoute = pstRoute->pstNextRoute;
}
}
/* 最佳路由匹配 */
ROUTE_DATA_S *RouteData_BestMatch(IN ROUTE_DEVICE_S *pstRouteDevice, UINT32 uiDstNetwork)
{
ROUTE_DATA_S *pstRouterPre = &pstRouteDevice->stRouteList;
ROUTE_DATA_S *pstRoute = pstRouterPre->pstNextRoute;
UINT8 aucDstAddrString[IPV4_STRING_MAXLEN];
UINT8 aucNexthopAddrString[IPV4_STRING_MAXLEN];
AddrLib_InttoDotString(uiDstNetwork, aucDstAddrString);
for (;;)
{
if (NULL == pstRoute)
{
DebugLib_Printf(MODULE_ROUTE, "RouteData_BestMatch: %s, result is NULL.\n", aucDstAddrString);
return NULL;
}
else
{
if ((pstRoute->uiDstNetwork) == (uiDstNetwork & (pstRoute->uiMask)))
{
AddrLib_InttoDotString(pstRoute->uiNexthop, aucNexthopAddrString);
DebugLib_Printf(MODULE_ROUTE, "RouteData_BestMatch: %s, outif=%d, nexthop=%s.\n",
aucDstAddrString, pstRoute->usIfNum, aucNexthopAddrString);
return pstRoute;
}
pstRoute = pstRoute->pstNextRoute;
}
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。