ZBLOG

static int vrrp_route_del_cmd(vrrp_route_t *route_info) { vrrp_route_t *p_del = NULL; int i = 0; if(NULL == route_info) return -1; for(i = 0; i < route_number; i++) { p_del = route_ptr_s - i; if((strncmp

好的,这里是根据你提供的结构体修改后的函数:

int vrrp_route_del_cmd(vrrp_route_t *route_info) {
    if (route_info == NULL) {
        return -1;
    }

    for (int i = 0; i < route_number; i++) {
        vrrp_route_t *p_del = route_ptr_s - i;

        if (route_info->version != p_del->version) { // 版本不同直接跳过
            continue;
        }

        if (route_info->version == 1 && strcmp(route_info->ipv4_info.destination, p_del->ipv4_info.destination) == 0 
                && strcmp(route_info->ipv4_info.genmask, p_del->ipv4_info.genmask) == 0 
                && route_info->ipv4_info.table_id == p_del->ipv4_info.table_id) { // IPv4 路由表项匹配
            if (i == 0) {
                memset(p_del, 0, sizeof(vrrp_route_t));
            } else {
                memcpy(p_del, p_del + 1, i * sizeof(vrrp_route_t));
                memset(route_ptr_s - i + route_number - 1, 0, sizeof(vrrp_route_t));
            }
            route_number--;

            if (route_number == 0) { // 如果路由表为空,则释放内存并重置相关变量
                V2V_SYSLOG_INFO("Route table is empty\n");
                free(route_ptr);
                route_ptr = NULL;
                route_ptr_s = NULL;
                route_apply_amount = 0;
            } else {
                route_ptr_s--;
            }

            return 0;
        } else if (route_info->version == 2 && memcmp(&route_info->ipv6_info.destination, &p_del->ipv6_info.destination, sizeof(struct in6_addr)) == 0 
                && route_info->ipv6_info.prefixlen == p_del->ipv6_info.prefixlen 
                && route_info->ipv6_info.table_id == p_del->ipv6_info.table_id) { // IPv6 路由表项匹配
            if (i == 0) {
                memset(p_del, 0, sizeof(vrrp_route_t));
            } else {
                memcpy(p_del, p_del + 1, i * sizeof(vrrp_route_t));
                memset(route_ptr_s - i + route_number - 1, 0, sizeof(vrrp_route_t));
            }
            route_number--;

            if (route_number == 0) { // 如果路由表为空,则释放内存并重置相关变量
                V2V_SYSLOG_INFO("Route table is empty\n");
                free(route_ptr);
                route_ptr = NULL;
                route_ptr_s = NULL;
                route_apply_amount = 0;
            } else {
                route_ptr_s--;
            }

            return 0;
        }
    }

    V2V_SYSLOG_INFO("Failed to find the specified route\n");
    return -1;
}

修改说明:

  • 根据输入的 vrrp_route_t 结构体判断其 IP 版本,分别处理 IPv4 和 IPv6 路由表项。
  • 对于 IPv4 路由表项,使用 strcmp 函数比较字符串类型的地址和掩码,并检查表 ID 是否相同。
  • 对于 IPv6 路由表项,使用 memcmp 函数比较二进制形式的地址和掩码,并检查表 ID 是否相同。
  • 如果找到匹配的路由表项,将该表项从路由表中删除,并更新相关变量。如果路由表为空,则释放内存并重置相关变量。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:http://sdn.0voice.com/?id=901

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?