int vr_route_add(vr_route_req *req) { struct rtable_fspec *fs; struct vr_route_req vr_req; int ret; uint32_t rt_prefix[4]; fs = vr_get_family(req->rtr_family); if (!fs) { ret = -ENOENT; } else { vr_req.rtr_req = *req; if (req->rtr_prefix_size) { vr_req.rtr_req.rtr_prefix = (uint8_t*)&rt_prefix; memcpy(vr_req.rtr_req.rtr_prefix, req->rtr_prefix, RT_IP_ADDR_SIZE(req->rtr_family)); vr_req.rtr_req.rtr_marker_size = 0; vr_req.rtr_req.rtr_prefix_size = req->rtr_prefix_size; } else { vr_req.rtr_req.rtr_prefix = NULL; } ret = fs->route_add(fs, &vr_req); } vr_send_response(ret); return ret; }
int vr_route_add(vr_route_req *req) { struct rtable_fspec *fs; struct vr_route_req vr_req; int ret; fs = vr_get_family(req->rtr_family); if (!fs) { ret = -ENOENT; } else { vr_req.rtr_req = *req; ret = fs->route_add(fs, &vr_req); } vr_send_response(ret); return ret; }
int vr_route_delete(vr_route_req *req) { struct rtable_fspec *fs; struct vr_route_req vr_req; int ret; uint32_t rt_prefix[4]; fs = vr_get_family(req->rtr_family); if (!fs) ret = -ENOENT; else { vr_req.rtr_req = *req; if (req->rtr_family != AF_BRIDGE && !req->rtr_prefix_size) { ret = -EINVAL; goto error; } if (req ->rtr_family == AF_BRIDGE && (!req->rtr_mac_size || !req->rtr_mac)) { ret = -EINVAL; goto error; } if (req ->rtr_family != AF_BRIDGE) { vr_req.rtr_req.rtr_prefix = (uint8_t*)&rt_prefix; memcpy(vr_req.rtr_req.rtr_prefix, req->rtr_prefix, RT_IP_ADDR_SIZE(req->rtr_family)); } vr_req.rtr_req.rtr_marker_size = 0; ret = fs->route_del(fs, &vr_req); } error: vr_send_response(ret); return ret; }