好的,这里是根据你提供的结构体修改后的函数:
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 是否相同。 - 如果找到匹配的路由表项,将该表项从路由表中删除,并更新相关变量。如果路由表为空,则释放内存并重置相关变量。