X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fsyscall_netadd-net.hc;h=a22090f39f1dec5b63dd6e95648d6f30094720c8;hb=a741f6faf2baae1e823d334012f6a09e6a1bda51;hp=faa4908e4b9056edba634ca67818af99f382dfcb;hpb=2822ba293eb308225c50d346930c47bf98d9927b;p=util-vserver.git diff --git a/lib/syscall_netadd-net.hc b/lib/syscall_netadd-net.hc index faa4908..a22090f 100644 --- a/lib/syscall_netadd-net.hc +++ b/lib/syscall_netadd-net.hc @@ -1,4 +1,4 @@ -// $Id: syscall_netadd-net.hc,v 1.2 2005/07/15 18:07:24 ensc Exp $ --*- c -*-- +// $Id: syscall_netadd-net.hc 2584 2007-08-10 15:28:42Z dhozac $ --*- c -*-- // Copyright (C) 2004 Enrico Scholz // @@ -21,12 +21,31 @@ #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; - - return vserver(VCMD_net_add, NID_USER2KERNEL(nid), &k_info); + k_info.type = info->vna_type & (VC_NXA_TYPE_IPV4|VC_NXA_TYPE_IPV6|VC_NXA_MOD_BCAST); + k_info.count = 1; + + if ((k_info.type | VC_NXA_TYPE_ADDR) != info->vna_type) { + errno = EINVAL; + return -1; + } + + switch (k_info.type) { + case VC_NXA_TYPE_IPV4: + case VC_NXA_TYPE_IPV4 | VC_NXA_MOD_BCAST: + 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; + } + + return vserver(VCMD_net_add_v0, NID_USER2KERNEL(nid), &k_info); }