static int dmpKernelNetIfCmdSet(DAL_NETIF_ENTRY *pEntryRecieve, DAL_NETIF_ENTRY_FLAG_E netifFlag, DAL_NETIF_DHCP_FLAG_E dhcpFlag)
{
if (pEntryRecieve == NULL)
{
return;
}
/* 缓存中的entry */
DAL_NETIF_ENTRY entryFind = {};
/* 最后操作的entry */
DAL_NETIF_ENTRY entry2Set = {};
DAL_NETIF_KERNEL_FLAG kernelFlag = 0;
/* 找不到,为新增条目 */
if (dalNetIfEntryGetByIfId(pEntryRecieve->if_id, &entryFind) != ERR_NO_ERROR)
{
/* 填充key */
memcpy(&entry2Set.if_id, &pEntryRecieve->if_id, sizeof(IF_ID));
snprintf(entry2Set.vrfName, sizeof(entry2Set.vrfName), DEFAULT_VRF_NAME);
kernelFlag |= DAL_NETIF_KERNEL_FLAG_NEW;
}
else
{
memcpy(&entry2Set, &entryFind, sizeof(DAL_NETIF_ENTRY));
}
if (DAL_NETIF_ENTRY_FLAG_NONE == flag && DAL_NETIF_ENTRY_FLAG_DNSNONE == dhcpflag)
{
goto done;
}
/* 删除 */
if (flag & DAL_NETIF_ENTRY_FLAG_DEL)
{
/* 如果没找到直接返回,找到了才删除(kernelflag new为false) */
if (!(kernelFlag & DAL_NETIF_KERNEL_FLAG_NEW))
{
/* IPV4 设置为FALSE */
hiNetIfIpv4RouteEnableSet(entry2Set.vlanId, FALSE);
/* IPV6 设置为FALSE */
hiNetIfIpv6RouteEnableSet(entry2Set.vlanId, FALSE);
kernelFlag |= DAL_NETIF_KERNEL_FLAG_DEL;
dalNetIfKernelHandle(&entry2Set, kernelFlag);
dalNetIfEntryDel(&entry2Set);
}
goto done;
}
if (flag & DAL_NETIF_ENTRY_FLAG_VLANID)
{
entry2Set.vlanId = pEntryRecieve->vlanId;
}
if (flag & DAL_NETIF_ENTRY_FLAG_MAC)
{
/* mac变更 */
if (0 != memcmp(pEntryRecieve->mac, entry2Set.mac, MAC_ADDR_SIZE))
{
memcpy(entry2Set.mac, pEntryRecieve->mac, MAC_ADDR_SIZE);
kernelFlag |= DAL_NETIF_KERNEL_FLAG_MAC_SET;
}
}
if (flag & DAL_NETIF_ENTRY_FLAG_IFX)
{
entry2Set.ifindex = pEntryRecieve->ifindex;
}
if (flag & DAL_NETIF_ENTRY_FLAG_SUBIFTYPE)
{
entry2Set.subType = pEntryRecieve->subType;
}
if (flag & DAL_NETIF_ENTRY_FLAG_LINKSTATUS)
{
/* 如果iftype为需要在dmp侧判断linkstatus的类型 */
/* 理论上讲,上层不会下发这几个类型的linkstatus字段 */
/* 如果是从dal数据库恢复linkstatus状态(master->slave) */
if (FALSE == dalNetIfLinkScanFilter(entry2Set.if_id) || flag & DAL_NETIF_ENTRY_FLAG_RELOAD)
{
entry2Set.linkStatus = pEntryRecieve->linkStatus;
/* 设置上kernel flag,直接在kernelhandle中处理 */
kernelFlag |= DAL_NETIF_KERNEL_FLAG_LINK_SET;
}
}
if (flag & DAL_NETIF_ENTRY_FLAG_ADMINSTATUS)
{
/* 涉及到初始化问题,加上new flag判断 */
if ((kernelFlag & DAL_NETIF_KERNEL_FLAG_NEW) ||
(entry2Set.adminStatus != pEntryRecieve->adminStatus))
{
DBG("recieve status: %d", pEntryRecieve->adminStatus);
entry2Set.adminStatus = pEntryRecieve->adminStatus;
/* admin set flag仅管理口使用,netIF其他接口走linkscan逻辑 */
kernelFlag |= DAL_NETIF_KERNEL_FLAG_ADMIN_SET;
}
}
if (flag & DAL_NETIF_ENTRY_FLAG_IPV4MODE)
{
entry2Set.ipv4Mode = pEntryRecieve->ipv4Mode;
}
if (flag & DAL_NETIF_ENTRY_FLAG_IPV4EN)
{
/* 涉及到初始化问题,加上new flag判断 */
if ((kernelFlag & DAL_NETIF_KERNEL_FLAG_NEW) ||
entry2Set.ipv4En != pEntryRecieve->ipv4En)
{
entry2Set.ipv4En = !!pEntryRecieve->ipv4En;
hiNetIfIpv4RouteEnableSet(entry2Set.vlanId, entry2Set.ipv4En);
}
}
if (flag & DAL_NETIF_ENTRY_FLAG_IPV6EN)
{
/* 涉及到初始化问题,加上new flag判断 */
if ((kernelFlag & DAL_NETIF_KERNEL_FLAG_NEW) ||
entry2Set.ipv6En != pEntryRecieve->ipv6En)
{
entry2Set.ipv6En = !!pEntryRecieve->ipv6En;
hiNetIfIpv6RouteEnableSet(entry2Set.vlanId, entry2Set.ipv6En);
kernelFlag |= DAL_NETIF_KERNEL_FLAG_IPV6_EN;
}
}
if (flag & DAL_NETIF_ENTRY_FLAG_VRFID)
{
entry2Set.vrfId = pEntryRecieve->vrfId;
}
if (flag & DAL_NETIF_ENTRY_FLAG_VRFNAME)
{
if (0 != strncmp(entry2Set.vrfName, pEntryRecieve->vrfName, VRF_NAME_LEN))
{
snprintf(entry2Set.vrfName, sizeof(entry2Set.vrfName), pEntryRecieve->vrfName);
kernelFlag |= DAL_NETIF_KERNEL_FLAG_VRF_SET;
}
}
if (flag & DAL_NETIF_ENTRY_FLAG_SLAACEN)
{
entry2Set.slaacEn = pEntryRecieve->slaacEn;
}
if (flag & DAL_NETIF_ENTRY_FLAG_DHCP6EN)
{
entry2Set.dhcp6En = pEntryRecieve->dhcp6En;
}
if (flag & DAL_NETIF_ENTRY_FLAG_LINKLOCALMODE)
{
entry2Set.linklocalMode = pEntryRecieve->linklocalMode;
}
if (flag & DAL_NETIF_ENTRY_FLAG_LINKLOCALADDR)
{
if (0 != memcmp(&entry2Set.linklocalAddr, &pEntryRecieve->linklocalAddr, sizeof(IF_ADDR)))
{
memcpy(&entry2Set.linklocalAddr, &pEntryRecieve->linklocalAddr, sizeof(IF_ADDR));
kernelFlag |= DAL_NETIF_KERNEL_FLAG_LINKLOCAL_SET;
}
}
if (flag & DAL_NETIF_ENTRY_FLAG_PARENTNAME)
{
snprintf(entry2Set.parentName, sizeof(entry2Set.parentName), pEntryRecieve->parentName);
}
if (flag & DAL_NETIF_ENTRY_FLAG_KERNELNAME)
{
snprintf(entry2Set.kernelName, sizeof(entry2Set.kernelName), pEntryRecieve->kernelName);
}
if (flag & DAL_NETIF_ENTRY_FLAG_LOCALADDR)
{
snprintf(entry2Set.localAddr, sizeof(entry2Set.localAddr), pEntryRecieve->localAddr);
}
if (flag & DAL_NETIF_ENTRY_FLAG_REMOTEADDR)
{
snprintf(entry2Set.remoteAddr, sizeof(entry2Set.remoteAddr), pEntryRecieve->remoteAddr);
}
if (flag & DAL_NETIF_ENTRY_FLAG_GROUPADDR)
{
snprintf(entry2Set.groupAddr, sizeof(entry2Set.groupAddr), pEntryRecieve->groupAddr);
}
if (flag & DAL_NETIF_ENTRY_FLAG_TTL)
{
entry2Set.ttl = pEntryRecieve->ttl;
}
if (flag & DAL_NETIF_ENTRY_FLAG_VNI)
{
entry2Set.vni = pEntryRecieve->vni;
}
if (flag & DAL_NETIF_ENTRY_FLAG_DSTPORT)
{
entry2Set.dstport = pEntryRecieve->dstport;
}
if (dhcpflag & DAL_NETIF_ENTRY_FLAG_DNS4PRI)
{
snprintf(entry2Set.dns4Pri, sizeof(entry2Set.dns4Pri), pEntryRecieve->dns4Pri);
}
if (dhcpflag & DAL_NETIF_ENTRY_FLAG_DNS4SEC)
{
snprintf(entry2Set.dns4Sec, sizeof(entry2Set.dns4Sec), pEntryRecieve->dns4Sec);
}
if (dhcpflag & DAL_NETIF_ENTRY_FLAG_DNS6PRI)
{
snprintf(entry2Set.dns6Pri, sizeof(entry2Set.dns6Pri), pEntryRecieve->dns6Pri);
}
if (dhcpflag & DAL_NETIF_ENTRY_FLAG_DNS6SEC)
{
snprintf(entry2Set.dns6Pri, sizeof(entry2Set.dns6Sec), pEntryRecieve->dns6Sec);
}
/* 只有管理vlan配置的dns可以生效 */
if (entry2Set.if_id.ifType == NETIF_TYPE_VLAN && entry2Set.if_id.ifData.vlanId == 1)
{
if (IS_DNS4_SET(dhcpflag))
{
dalNetIfThreadSaveDnsServerAddr(entry2Set.dns4Pri, entry2Set.dns4Sec);
}
if (IS_DNS6_SET(dhcpflag))
{
dalNetIfThreadSaveDns6ServerAddr(entry2Set.dns6Pri, entry2Set.dns6Sec);
}
}
/* 先更新缓存 */
dalNetIfEntryAdd(&entry2Set);
/* 配置内核 */
if (entry2Set.if_id.ifType == NETIF_TYPE_MGMT)
{
dalMgmtPortIfKernelHandle(&entry2Set, kernelFlag);
}
else if (entry2Set.if_id.ifType != NETIF_TYPE_NONE)
{
/* TODO:后续vxlan,vrrp等整合后,需要更细分处理 */
dalNetIfKernelHandle(&entry2Set, kernelFlag);
/* 目前只有netif需要操作,后续vrrp可以集成一起 */
if (entry2Set.if_id.ifType == NETIF_TYPE_PORT_CHANNEL ||
entry2Set.if_id.ifType == NETIF_TYPE_ROUTED_PORT ||
entry2Set.if_id.ifType == NETIF_TYPE_VLAN)
{
/* 这里不判断linkstatus写mac了,在linkscan那边操作 */
if (INVALID_VRF_ID != entry2Set.vrfId && entry2Set.vrfName[0] != '\0')
{
UINT32 hwVrfId = INVALID_VRF_ID;
VRF_ID_TO_HW_VRF_ID(entry2Set.vrfId, hwVrfId);
DBG("vlanid = %d ! vrfId = %d ! hwVrfId = %d !",
entry2Set.vlanId, entry2Set.vrfId, hwVrfId);
hiNetIfAddVrf(entry2Set.vlanId, hwVrfId);
}
}
}
/* 至少保证配置能下到内核 */
APPL_ENSURE_RET(dalNetIfL2CacheInitCheck());
/* dalNetIfLinkScanFilter为TRUE则通过netiflinkscan判断接口状态 */
dalNetIfLinkScanTrigger(entry2Set.if_id);
done:
/* 释放 */
dalNetIfFree(pMsg);
return ERR_NO_ERROR;
}
把这段代码优化一下
最新发布