X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fsyscall_netadd-net.hc;h=6238f41bb5e8ed93b2baa8f9baf234c1c01b1996;hb=a6be71d3e49f0f633705ba5e4e08cc1cac811344;hp=f408d90f4554d81e2746fa45fbaa3657aac99e84;hpb=9c78378bebc1a9f3d400f422df8ede9efea57dea;p=util-vserver.git diff --git a/lib/syscall_netadd-net.hc b/lib/syscall_netadd-net.hc index f408d90..6238f41 100644 --- a/lib/syscall_netadd-net.hc +++ b/lib/syscall_netadd-net.hc @@ -21,17 +21,27 @@ #endif static inline ALWAYSINLINE int -vc_net_add_net(nid_t nid, struct vc_net_nx const *info) +vc_net_add_net(nid_t nid, struct vc_net_addr const *info) { struct vcmd_net_addr_v0 k_info; size_t i; - k_info.type = NETTYPE_USER2KERNEL(info->type); - k_info.count = info->count; - for (i = 0; i < sizeof(k_info.ip) / sizeof(*k_info.ip); i++) - k_info.ip[i] = info->ip[i]; - for (i = 0; i < sizeof(k_info.mask) / sizeof(*k_info.mask); i++) - k_info.mask[i] = info->mask[i]; - - return vserver(VCMD_net_add, NID_USER2KERNEL(nid), &k_info); + k_info.type = info->vna_type & (VC_NXA_TYPE_IPV4|VC_NXA_TYPE_IPV6); + k_info.count = 1; + switch (info->vna_type & ~VC_NXA_TYPE_ADDR) { + case VC_NXA_TYPE_IPV4: + k_info.ip[0].s_addr = info->vna_v4_ip.s_addr; + k_info.mask[0].s_addr = info->vna_v4_mask.s_addr; + break; + case VC_NXA_TYPE_IPV6: + for (i = 0; i < 4; i++) + k_info.ip[i].s_addr = info->vna_v6_ip.s6_addr32[i]; + k_info.mask[0].s_addr = info->vna_prefix; + break; + default: + errno = EINVAL; + return -1; + } + + return vserver(VCMD_net_add_v0, NID_USER2KERNEL(nid), &k_info); }