Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
L
lxc
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chen Yisong
lxc
Commits
0854538f
Unverified
Commit
0854538f
authored
May 04, 2019
by
Christian Brauner
Committed by
GitHub
May 04, 2019
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #2973 from tomponline/tp-gw-dev
network: Adds gateway device route mode
parents
9e8c3ebe
a2f9a670
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
105 additions
and
5 deletions
+105
-5
api-extensions.md
doc/api-extensions.md
+7
-0
lxc.container.conf.sgml.in
doc/lxc.container.conf.sgml.in
+6
-0
api_extensions.h
src/lxc/api_extensions.h
+1
-0
confile.c
src/lxc/confile.c
+14
-2
confile_utils.c
src/lxc/confile_utils.c
+6
-0
network.c
src/lxc/network.c
+27
-3
network.h
src/lxc/network.h
+4
-0
parse_config_file.c
src/tests/parse_config_file.c
+40
-0
No files found.
doc/api-extensions.md
View file @
0854538f
...
@@ -84,3 +84,10 @@ For IPv6 addresses it will check the following sysctl values and fail with an er
...
@@ -84,3 +84,10 @@ For IPv6 addresses it will check the following sysctl values and fail with an er
net.ipv6.conf.[link].proxy_ndp=1
net.ipv6.conf.[link].proxy_ndp=1
net.ipv6.conf.[link].forwarding=1
net.ipv6.conf.[link].forwarding=1
```
```
## network\_gateway\_device\_route
This introduces the ability to specify
`lxc.net.[i].ipv4.gateway`
and/or
`lxc.net.[i].ipv6.gateway`
with a value of
`dev`
which will cause the default gateway
inside the container to be created as a device route without destination gateway IP needed.
This is primarily intended for use with layer 3 networking devices, such as IPVLAN.
doc/lxc.container.conf.sgml.in
View file @
0854538f
...
@@ -665,6 +665,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
...
@@ -665,6 +665,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
the gateway. <option>auto</option> is only available when
the gateway. <option>auto</option> is only available when
using the <option>veth</option>,
using the <option>veth</option>,
<option>macvlan</option> and <option>ipvlan</option> network types.
<option>macvlan</option> and <option>ipvlan</option> network types.
Can also have the special value of <option>dev</option>,
which means to set the default gateway as a device route.
This is primarily for use with layer 3 network modes, such as IPVLAN.
</para>
</para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
...
@@ -699,6 +702,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
...
@@ -699,6 +702,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
the gateway. <option>auto</option> is only available when
the gateway. <option>auto</option> is only available when
using the <option>veth</option>,
using the <option>veth</option>,
<option>macvlan</option> and <option>ipvlan</option> network types.
<option>macvlan</option> and <option>ipvlan</option> network types.
Can also have the special value of <option>dev</option>,
which means to set the default gateway as a device route.
This is primarily for use with layer 3 network modes, such as IPVLAN.
</para>
</para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
...
...
src/lxc/api_extensions.h
View file @
0854538f
...
@@ -47,6 +47,7 @@ static char *api_extensions[] = {
...
@@ -47,6 +47,7 @@ static char *api_extensions[] = {
"network_veth_routes"
,
"network_veth_routes"
,
"network_ipvlan"
,
"network_ipvlan"
,
"network_l2proxy"
,
"network_l2proxy"
,
"network_gateway_device_route"
,
};
};
static
size_t
nr_api_extensions
=
sizeof
(
api_extensions
)
/
sizeof
(
*
api_extensions
);
static
size_t
nr_api_extensions
=
sizeof
(
api_extensions
)
/
sizeof
(
*
api_extensions
);
...
...
src/lxc/confile.c
View file @
0854538f
...
@@ -686,9 +686,13 @@ static int set_config_net_ipv4_gateway(const char *key, const char *value,
...
@@ -686,9 +686,13 @@ static int set_config_net_ipv4_gateway(const char *key, const char *value,
free
(
netdev
->
ipv4_gateway
);
free
(
netdev
->
ipv4_gateway
);
if
(
!
strcmp
(
value
,
"auto"
)
)
{
if
(
strcmp
(
value
,
"auto"
)
==
0
)
{
netdev
->
ipv4_gateway
=
NULL
;
netdev
->
ipv4_gateway
=
NULL
;
netdev
->
ipv4_gateway_auto
=
true
;
netdev
->
ipv4_gateway_auto
=
true
;
}
else
if
(
strcmp
(
value
,
"dev"
)
==
0
)
{
netdev
->
ipv4_gateway
=
NULL
;
netdev
->
ipv4_gateway_auto
=
false
;
netdev
->
ipv4_gateway_dev
=
true
;
}
else
{
}
else
{
int
ret
;
int
ret
;
struct
in_addr
*
gw
;
struct
in_addr
*
gw
;
...
@@ -853,9 +857,13 @@ static int set_config_net_ipv6_gateway(const char *key, const char *value,
...
@@ -853,9 +857,13 @@ static int set_config_net_ipv6_gateway(const char *key, const char *value,
free
(
netdev
->
ipv6_gateway
);
free
(
netdev
->
ipv6_gateway
);
if
(
!
strcmp
(
value
,
"auto"
)
)
{
if
(
strcmp
(
value
,
"auto"
)
==
0
)
{
netdev
->
ipv6_gateway
=
NULL
;
netdev
->
ipv6_gateway
=
NULL
;
netdev
->
ipv6_gateway_auto
=
true
;
netdev
->
ipv6_gateway_auto
=
true
;
}
else
if
(
strcmp
(
value
,
"dev"
)
==
0
)
{
netdev
->
ipv6_gateway
=
NULL
;
netdev
->
ipv6_gateway_auto
=
false
;
netdev
->
ipv6_gateway_dev
=
true
;
}
else
{
}
else
{
int
ret
;
int
ret
;
struct
in6_addr
*
gw
;
struct
in6_addr
*
gw
;
...
@@ -5625,6 +5633,8 @@ static int get_config_net_ipv4_gateway(const char *key, char *retv, int inlen,
...
@@ -5625,6 +5633,8 @@ static int get_config_net_ipv4_gateway(const char *key, char *retv, int inlen,
if
(
netdev
->
ipv4_gateway_auto
)
{
if
(
netdev
->
ipv4_gateway_auto
)
{
strprint
(
retv
,
inlen
,
"auto"
);
strprint
(
retv
,
inlen
,
"auto"
);
}
else
if
(
netdev
->
ipv4_gateway_dev
)
{
strprint
(
retv
,
inlen
,
"dev"
);
}
else
if
(
netdev
->
ipv4_gateway
)
{
}
else
if
(
netdev
->
ipv4_gateway
)
{
inet_ntop
(
AF_INET
,
netdev
->
ipv4_gateway
,
buf
,
sizeof
(
buf
));
inet_ntop
(
AF_INET
,
netdev
->
ipv4_gateway
,
buf
,
sizeof
(
buf
));
strprint
(
retv
,
inlen
,
"%s"
,
buf
);
strprint
(
retv
,
inlen
,
"%s"
,
buf
);
...
@@ -5714,6 +5724,8 @@ static int get_config_net_ipv6_gateway(const char *key, char *retv, int inlen,
...
@@ -5714,6 +5724,8 @@ static int get_config_net_ipv6_gateway(const char *key, char *retv, int inlen,
if
(
netdev
->
ipv6_gateway_auto
)
{
if
(
netdev
->
ipv6_gateway_auto
)
{
strprint
(
retv
,
inlen
,
"auto"
);
strprint
(
retv
,
inlen
,
"auto"
);
}
else
if
(
netdev
->
ipv6_gateway_dev
)
{
strprint
(
retv
,
inlen
,
"dev"
);
}
else
if
(
netdev
->
ipv6_gateway
)
{
}
else
if
(
netdev
->
ipv6_gateway
)
{
inet_ntop
(
AF_INET6
,
netdev
->
ipv6_gateway
,
buf
,
sizeof
(
buf
));
inet_ntop
(
AF_INET6
,
netdev
->
ipv6_gateway
,
buf
,
sizeof
(
buf
));
strprint
(
retv
,
inlen
,
"%s"
,
buf
);
strprint
(
retv
,
inlen
,
"%s"
,
buf
);
...
...
src/lxc/confile_utils.c
View file @
0854538f
...
@@ -361,6 +361,9 @@ void lxc_log_configured_netdevs(const struct lxc_conf *conf)
...
@@ -361,6 +361,9 @@ void lxc_log_configured_netdevs(const struct lxc_conf *conf)
TRACE
(
"ipv4 gateway auto: %s"
,
TRACE
(
"ipv4 gateway auto: %s"
,
netdev
->
ipv4_gateway_auto
?
"true"
:
"false"
);
netdev
->
ipv4_gateway_auto
?
"true"
:
"false"
);
TRACE
(
"ipv4 gateway dev: %s"
,
netdev
->
ipv4_gateway_dev
?
"true"
:
"false"
);
if
(
netdev
->
ipv4_gateway
)
{
if
(
netdev
->
ipv4_gateway
)
{
inet_ntop
(
AF_INET
,
netdev
->
ipv4_gateway
,
inet_ntop
(
AF_INET
,
netdev
->
ipv4_gateway
,
bufinet4
,
sizeof
(
bufinet4
));
bufinet4
,
sizeof
(
bufinet4
));
...
@@ -377,6 +380,9 @@ void lxc_log_configured_netdevs(const struct lxc_conf *conf)
...
@@ -377,6 +380,9 @@ void lxc_log_configured_netdevs(const struct lxc_conf *conf)
TRACE
(
"ipv6 gateway auto: %s"
,
TRACE
(
"ipv6 gateway auto: %s"
,
netdev
->
ipv6_gateway_auto
?
"true"
:
"false"
);
netdev
->
ipv6_gateway_auto
?
"true"
:
"false"
);
TRACE
(
"ipv6 gateway dev: %s"
,
netdev
->
ipv6_gateway_dev
?
"true"
:
"false"
);
if
(
netdev
->
ipv6_gateway
)
{
if
(
netdev
->
ipv6_gateway
)
{
inet_ntop
(
AF_INET6
,
netdev
->
ipv6_gateway
,
inet_ntop
(
AF_INET6
,
netdev
->
ipv6_gateway
,
bufinet6
,
sizeof
(
bufinet6
));
bufinet6
,
sizeof
(
bufinet6
));
...
...
src/lxc/network.c
View file @
0854538f
...
@@ -2074,8 +2074,12 @@ static int ip_gateway_add(int family, int ifindex, void *gw)
...
@@ -2074,8 +2074,12 @@ static int ip_gateway_add(int family, int ifindex, void *gw)
rt
->
rtm_dst_len
=
0
;
rt
->
rtm_dst_len
=
0
;
err
=
-
EINVAL
;
err
=
-
EINVAL
;
/* If gateway address not supplied, then a device route will be created instead */
if
(
gw
!=
NULL
)
{
if
(
nla_put_buffer
(
nlmsg
,
RTA_GATEWAY
,
gw
,
addrlen
))
if
(
nla_put_buffer
(
nlmsg
,
RTA_GATEWAY
,
gw
,
addrlen
))
goto
out
;
goto
out
;
}
/* Adding the interface index enables the use of link-local
/* Adding the interface index enables the use of link-local
* addresses for the gateway.
* addresses for the gateway.
...
@@ -3480,12 +3484,12 @@ static int lxc_setup_netdev_in_child_namespaces(struct lxc_netdev *netdev)
...
@@ -3480,12 +3484,12 @@ static int lxc_setup_netdev_in_child_namespaces(struct lxc_netdev *netdev)
}
}
/* We can only set up the default routes after bringing
/* We can only set up the default routes after bringing
* up the interface, sine bringing up the interface adds
* up the interface, sin
c
e bringing up the interface adds
* the link-local routes and we can't add a default
* the link-local routes and we can't add a default
* route if the gateway is not reachable. */
* route if the gateway is not reachable. */
/* setup ipv4 gateway on the interface */
/* setup ipv4 gateway on the interface */
if
(
netdev
->
ipv4_gateway
)
{
if
(
netdev
->
ipv4_gateway
||
netdev
->
ipv4_gateway_dev
)
{
if
(
!
(
netdev
->
flags
&
IFF_UP
))
{
if
(
!
(
netdev
->
flags
&
IFF_UP
))
{
ERROR
(
"Cannot add ipv4 gateway for network device "
ERROR
(
"Cannot add ipv4 gateway for network device "
"
\"
%s
\"
when not bringing up the interface"
,
ifname
);
"
\"
%s
\"
when not bringing up the interface"
,
ifname
);
...
@@ -3498,6 +3502,15 @@ static int lxc_setup_netdev_in_child_namespaces(struct lxc_netdev *netdev)
...
@@ -3498,6 +3502,15 @@ static int lxc_setup_netdev_in_child_namespaces(struct lxc_netdev *netdev)
return
-
1
;
return
-
1
;
}
}
/* Setup device route if ipv4_gateway_dev is enabled */
if
(
netdev
->
ipv4_gateway_dev
)
{
err
=
lxc_ipv4_gateway_add
(
netdev
->
ifindex
,
NULL
);
if
(
err
<
0
)
{
SYSERROR
(
"Failed to setup ipv4 gateway to network device
\"
%s
\"
"
,
ifname
);
return
minus_one_set_errno
(
-
err
);
}
}
else
{
err
=
lxc_ipv4_gateway_add
(
netdev
->
ifindex
,
netdev
->
ipv4_gateway
);
err
=
lxc_ipv4_gateway_add
(
netdev
->
ifindex
,
netdev
->
ipv4_gateway
);
if
(
err
)
{
if
(
err
)
{
err
=
lxc_ipv4_dest_add
(
netdev
->
ifindex
,
netdev
->
ipv4_gateway
,
32
);
err
=
lxc_ipv4_dest_add
(
netdev
->
ifindex
,
netdev
->
ipv4_gateway
,
32
);
...
@@ -3522,9 +3535,10 @@ static int lxc_setup_netdev_in_child_namespaces(struct lxc_netdev *netdev)
...
@@ -3522,9 +3535,10 @@ static int lxc_setup_netdev_in_child_namespaces(struct lxc_netdev *netdev)
}
}
}
}
}
}
}
/* setup ipv6 gateway on the interface */
/* setup ipv6 gateway on the interface */
if
(
netdev
->
ipv6_gateway
)
{
if
(
netdev
->
ipv6_gateway
||
netdev
->
ipv6_gateway_dev
)
{
if
(
!
(
netdev
->
flags
&
IFF_UP
))
{
if
(
!
(
netdev
->
flags
&
IFF_UP
))
{
ERROR
(
"Cannot add ipv6 gateway for network device "
ERROR
(
"Cannot add ipv6 gateway for network device "
"
\"
%s
\"
when not bringing up the interface"
,
ifname
);
"
\"
%s
\"
when not bringing up the interface"
,
ifname
);
...
@@ -3537,6 +3551,15 @@ static int lxc_setup_netdev_in_child_namespaces(struct lxc_netdev *netdev)
...
@@ -3537,6 +3551,15 @@ static int lxc_setup_netdev_in_child_namespaces(struct lxc_netdev *netdev)
return
-
1
;
return
-
1
;
}
}
/* Setup device route if ipv6_gateway_dev is enabled */
if
(
netdev
->
ipv6_gateway_dev
)
{
err
=
lxc_ipv6_gateway_add
(
netdev
->
ifindex
,
NULL
);
if
(
err
<
0
)
{
SYSERROR
(
"Failed to setup ipv6 gateway to network device
\"
%s
\"
"
,
ifname
);
return
minus_one_set_errno
(
-
err
);
}
}
else
{
err
=
lxc_ipv6_gateway_add
(
netdev
->
ifindex
,
netdev
->
ipv6_gateway
);
err
=
lxc_ipv6_gateway_add
(
netdev
->
ifindex
,
netdev
->
ipv6_gateway
);
if
(
err
)
{
if
(
err
)
{
err
=
lxc_ipv6_dest_add
(
netdev
->
ifindex
,
netdev
->
ipv6_gateway
,
128
);
err
=
lxc_ipv6_dest_add
(
netdev
->
ifindex
,
netdev
->
ipv6_gateway
,
128
);
...
@@ -3563,6 +3586,7 @@ static int lxc_setup_netdev_in_child_namespaces(struct lxc_netdev *netdev)
...
@@ -3563,6 +3586,7 @@ static int lxc_setup_netdev_in_child_namespaces(struct lxc_netdev *netdev)
}
}
}
}
}
}
}
DEBUG
(
"Network device
\"
%s
\"
has been setup"
,
current_ifname
);
DEBUG
(
"Network device
\"
%s
\"
has been setup"
,
current_ifname
);
...
...
src/lxc/network.h
View file @
0854538f
...
@@ -156,9 +156,11 @@ union netdev_p {
...
@@ -156,9 +156,11 @@ union netdev_p {
* @ipv6 : a list of ipv6 addresses to be set on the network device
* @ipv6 : a list of ipv6 addresses to be set on the network device
* @ipv4_gateway_auto : whether the ipv4 gateway is to be automatically gathered
* @ipv4_gateway_auto : whether the ipv4 gateway is to be automatically gathered
* from the associated @link
* from the associated @link
* @ipv4_gateway_dev : whether the ipv4 gateway is to be set as a device route
* @ipv4_gateway : ipv4 gateway
* @ipv4_gateway : ipv4 gateway
* @ipv6_gateway_auto : whether the ipv6 gateway is to be automatically gathered
* @ipv6_gateway_auto : whether the ipv6 gateway is to be automatically gathered
* from the associated @link
* from the associated @link
* @ipv6_gateway_dev : whether the ipv6 gateway is to be set as a device route
* @ipv6_gateway : ipv6 gateway
* @ipv6_gateway : ipv6 gateway
* @upscript : a script filename to be executed during interface
* @upscript : a script filename to be executed during interface
* configuration
* configuration
...
@@ -179,8 +181,10 @@ struct lxc_netdev {
...
@@ -179,8 +181,10 @@ struct lxc_netdev {
struct
lxc_list
ipv4
;
struct
lxc_list
ipv4
;
struct
lxc_list
ipv6
;
struct
lxc_list
ipv6
;
bool
ipv4_gateway_auto
;
bool
ipv4_gateway_auto
;
bool
ipv4_gateway_dev
;
struct
in_addr
*
ipv4_gateway
;
struct
in_addr
*
ipv4_gateway
;
bool
ipv6_gateway_auto
;
bool
ipv6_gateway_auto
;
bool
ipv6_gateway_dev
;
struct
in6_addr
*
ipv6_gateway
;
struct
in6_addr
*
ipv6_gateway
;
char
*
upscript
;
char
*
upscript
;
char
*
downscript
;
char
*
downscript
;
...
...
src/tests/parse_config_file.c
View file @
0854538f
...
@@ -108,6 +108,16 @@ static int set_and_clear_complete_netdev(struct lxc_container *c)
...
@@ -108,6 +108,16 @@ static int set_and_clear_complete_netdev(struct lxc_container *c)
return
-
1
;
return
-
1
;
}
}
if
(
!
c
->
set_config_item
(
c
,
"lxc.net.1.ipv4.gateway"
,
"auto"
))
{
lxc_error
(
"%s
\n
"
,
"lxc.net.1.ipv4.gateway"
);
return
-
1
;
}
if
(
!
c
->
set_config_item
(
c
,
"lxc.net.1.ipv4.gateway"
,
"dev"
))
{
lxc_error
(
"%s
\n
"
,
"lxc.net.1.ipv4.gateway"
);
return
-
1
;
}
if
(
!
c
->
set_config_item
(
c
,
"lxc.net.1.ipv6.address"
,
if
(
!
c
->
set_config_item
(
c
,
"lxc.net.1.ipv6.address"
,
"2003:db8:1:0:214:1234:fe0b:3596/64"
))
{
"2003:db8:1:0:214:1234:fe0b:3596/64"
))
{
lxc_error
(
"%s
\n
"
,
"lxc.net.1.ipv6.address"
);
lxc_error
(
"%s
\n
"
,
"lxc.net.1.ipv6.address"
);
...
@@ -120,6 +130,16 @@ static int set_and_clear_complete_netdev(struct lxc_container *c)
...
@@ -120,6 +130,16 @@ static int set_and_clear_complete_netdev(struct lxc_container *c)
return
-
1
;
return
-
1
;
}
}
if
(
!
c
->
set_config_item
(
c
,
"lxc.net.1.ipv6.gateway"
,
"auto"
))
{
lxc_error
(
"%s
\n
"
,
"lxc.net.1.ipv6.gateway"
);
return
-
1
;
}
if
(
!
c
->
set_config_item
(
c
,
"lxc.net.1.ipv6.gateway"
,
"dev"
))
{
lxc_error
(
"%s
\n
"
,
"lxc.net.1.ipv6.gateway"
);
return
-
1
;
}
if
(
!
c
->
set_config_item
(
c
,
"lxc.net.1.flags"
,
"up"
))
{
if
(
!
c
->
set_config_item
(
c
,
"lxc.net.1.flags"
,
"up"
))
{
lxc_error
(
"%s
\n
"
,
"lxc.net.1.flags"
);
lxc_error
(
"%s
\n
"
,
"lxc.net.1.flags"
);
return
-
1
;
return
-
1
;
...
@@ -781,11 +801,31 @@ int main(int argc, char *argv[])
...
@@ -781,11 +801,31 @@ int main(int argc, char *argv[])
goto
non_test_error
;
goto
non_test_error
;
}
}
if
(
set_get_compare_clear_save_load
(
c
,
"lxc.net.0.ipv4.gateway"
,
"auto"
,
tmpf
,
true
))
{
lxc_error
(
"%s
\n
"
,
"lxc.net.0.ipv4.gateway"
);
goto
non_test_error
;
}
if
(
set_get_compare_clear_save_load
(
c
,
"lxc.net.0.ipv4.gateway"
,
"dev"
,
tmpf
,
true
))
{
lxc_error
(
"%s
\n
"
,
"lxc.net.0.ipv4.gateway"
);
goto
non_test_error
;
}
if
(
set_get_compare_clear_save_load
(
c
,
"lxc.net.0.ipv6.gateway"
,
"2003:db8:1::1"
,
tmpf
,
true
))
{
if
(
set_get_compare_clear_save_load
(
c
,
"lxc.net.0.ipv6.gateway"
,
"2003:db8:1::1"
,
tmpf
,
true
))
{
lxc_error
(
"%s
\n
"
,
"lxc.net.0.ipv6.gateway"
);
lxc_error
(
"%s
\n
"
,
"lxc.net.0.ipv6.gateway"
);
goto
non_test_error
;
goto
non_test_error
;
}
}
if
(
set_get_compare_clear_save_load
(
c
,
"lxc.net.0.ipv6.gateway"
,
"auto"
,
tmpf
,
true
))
{
lxc_error
(
"%s
\n
"
,
"lxc.net.0.ipv6.gateway"
);
goto
non_test_error
;
}
if
(
set_get_compare_clear_save_load
(
c
,
"lxc.net.0.ipv6.gateway"
,
"dev"
,
tmpf
,
true
))
{
lxc_error
(
"%s
\n
"
,
"lxc.net.0.ipv6.gateway"
);
goto
non_test_error
;
}
if
(
set_get_compare_clear_save_load
(
c
,
"lxc.net.0.ipv4.address"
,
"10.0.2.3/24"
,
tmpf
,
true
))
{
if
(
set_get_compare_clear_save_load
(
c
,
"lxc.net.0.ipv4.address"
,
"10.0.2.3/24"
,
tmpf
,
true
))
{
lxc_error
(
"%s
\n
"
,
"lxc.net.0.ipv4.address"
);
lxc_error
(
"%s
\n
"
,
"lxc.net.0.ipv4.address"
);
goto
non_test_error
;
goto
non_test_error
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment