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
e430137c
Unverified
Commit
e430137c
authored
Sep 21, 2018
by
Stéphane Graber
Committed by
GitHub
Sep 21, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #2608 from brauner/2018-09-11/netns_get_nsid
network: add lxc_netns_get_nsid()
parents
2339fce5
9d036caa
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
99 additions
and
7 deletions
+99
-7
macro.h
src/lxc/macro.h
+5
-0
network.c
src/lxc/network.c
+92
-7
network.h
src/lxc/network.h
+2
-0
No files found.
src/lxc/macro.h
View file @
e430137c
...
...
@@ -27,6 +27,7 @@
#include <linux/loop.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <linux/types.h>
#include <stdint.h>
#include <string.h>
#include <sys/mount.h>
...
...
@@ -279,6 +280,10 @@ extern int __build_bug_on_failed;
#define RTM_NEWNSID 88
#endif
#ifndef RTM_GETNSID
#define RTM_GETNSID 90
#endif
#ifndef NLMSG_ERROR
#define NLMSG_ERROR 0x2
#endif
...
...
src/lxc/network.c
View file @
e430137c
...
...
@@ -3171,6 +3171,7 @@ int addattr(struct nlmsghdr *n, size_t maxlen, int type, const void *data, size_
int
len
=
RTA_LENGTH
(
alen
);
struct
rtattr
*
rta
;
errno
=
EMSGSIZE
;
if
(
NLMSG_ALIGN
(
n
->
nlmsg_len
)
+
RTA_ALIGN
(
len
)
>
maxlen
)
return
-
1
;
...
...
@@ -3196,7 +3197,7 @@ enum {
int
lxc_netns_set_nsid
(
int
fd
)
{
ssize_
t
ret
;
in
t
ret
;
char
buf
[
NLMSG_ALIGN
(
sizeof
(
struct
nlmsghdr
))
+
NLMSG_ALIGN
(
sizeof
(
struct
rtgenmsg
))
+
NLMSG_ALIGN
(
1024
)];
...
...
@@ -3204,12 +3205,12 @@ int lxc_netns_set_nsid(int fd)
struct
nlmsghdr
*
hdr
;
struct
rtgenmsg
*
msg
;
int
saved_errno
;
__s32
ns_id
=
-
1
;
__u32
netns_fd
=
fd
;
const
__s32
ns_id
=
-
1
;
const
__u32
netns_fd
=
fd
;
ret
=
netlink_open
(
&
nlh
,
NETLINK_ROUTE
);
if
(
ret
<
0
)
return
ret
;
return
-
1
;
memset
(
buf
,
0
,
sizeof
(
buf
));
hdr
=
(
struct
nlmsghdr
*
)
buf
;
...
...
@@ -3222,15 +3223,99 @@ int lxc_netns_set_nsid(int fd)
hdr
->
nlmsg_seq
=
RTM_NEWNSID
;
msg
->
rtgen_family
=
AF_UNSPEC
;
addattr
(
hdr
,
1024
,
__LXC_NETNSA_FD
,
&
netns_fd
,
sizeof
(
netns_fd
));
addattr
(
hdr
,
1024
,
__LXC_NETNSA_NSID
,
&
ns_id
,
sizeof
(
ns_id
));
ret
=
addattr
(
hdr
,
1024
,
__LXC_NETNSA_FD
,
&
netns_fd
,
sizeof
(
netns_fd
));
if
(
ret
<
0
)
goto
on_error
;
ret
=
addattr
(
hdr
,
1024
,
__LXC_NETNSA_NSID
,
&
ns_id
,
sizeof
(
ns_id
));
if
(
ret
<
0
)
goto
on_error
;
ret
=
__netlink_transaction
(
&
nlh
,
hdr
,
hdr
);
on_error:
saved_errno
=
errno
;
netlink_close
(
&
nlh
);
errno
=
saved_errno
;
return
ret
;
}
static
int
parse_rtattr
(
struct
rtattr
*
tb
[],
int
max
,
struct
rtattr
*
rta
,
int
len
)
{
memset
(
tb
,
0
,
sizeof
(
struct
rtattr
*
)
*
(
max
+
1
));
while
(
RTA_OK
(
rta
,
len
))
{
unsigned
short
type
=
rta
->
rta_type
;
if
((
type
<=
max
)
&&
(
!
tb
[
type
]))
tb
[
type
]
=
rta
;
rta
=
RTA_NEXT
(
rta
,
len
);
}
return
0
;
}
static
inline
__s32
rta_getattr_s32
(
const
struct
rtattr
*
rta
)
{
return
*
(
__s32
*
)
RTA_DATA
(
rta
);
}
#ifndef NETNS_RTA
#define NETNS_RTA(r) \
((struct rtattr *)(((char *)(r)) + NLMSG_ALIGN(sizeof(struct rtgenmsg))))
#endif
int
lxc_netns_get_nsid
(
int
fd
)
{
int
ret
;
ssize_t
len
;
char
buf
[
NLMSG_ALIGN
(
sizeof
(
struct
nlmsghdr
))
+
NLMSG_ALIGN
(
sizeof
(
struct
rtgenmsg
))
+
NLMSG_ALIGN
(
1024
)];
struct
rtattr
*
tb
[
__LXC_NETNSA_MAX
+
1
];
struct
nl_handler
nlh
;
struct
nlmsghdr
*
hdr
;
struct
rtgenmsg
*
msg
;
int
saved_errno
;
__u32
netns_fd
=
fd
;
ret
=
netlink_open
(
&
nlh
,
NETLINK_ROUTE
);
if
(
ret
<
0
)
return
-
1
;
memset
(
buf
,
0
,
sizeof
(
buf
));
hdr
=
(
struct
nlmsghdr
*
)
buf
;
msg
=
(
struct
rtgenmsg
*
)
NLMSG_DATA
(
hdr
);
hdr
->
nlmsg_len
=
NLMSG_LENGTH
(
sizeof
(
*
msg
));
hdr
->
nlmsg_type
=
RTM_GETNSID
;
hdr
->
nlmsg_flags
=
NLM_F_REQUEST
|
NLM_F_ACK
;
hdr
->
nlmsg_pid
=
0
;
hdr
->
nlmsg_seq
=
RTM_GETNSID
;
msg
->
rtgen_family
=
AF_UNSPEC
;
ret
=
addattr
(
hdr
,
1024
,
__LXC_NETNSA_FD
,
&
netns_fd
,
sizeof
(
netns_fd
));
if
(
ret
==
0
)
ret
=
__netlink_transaction
(
&
nlh
,
hdr
,
hdr
);
saved_errno
=
errno
;
netlink_close
(
&
nlh
);
errno
=
saved_errno
;
if
(
ret
<
0
)
return
-
1
;
return
0
;
errno
=
EINVAL
;
msg
=
NLMSG_DATA
(
hdr
);
len
=
hdr
->
nlmsg_len
-
NLMSG_SPACE
(
sizeof
(
*
msg
));
if
(
len
<
0
)
return
-
1
;
parse_rtattr
(
tb
,
__LXC_NETNSA_MAX
,
NETNS_RTA
(
msg
),
len
);
if
(
tb
[
__LXC_NETNSA_NSID
])
return
rta_getattr_s32
(
tb
[
__LXC_NETNSA_NSID
]);
return
-
1
;
}
src/lxc/network.h
View file @
e430137c
...
...
@@ -27,6 +27,7 @@
#include <stdio.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <linux/types.h>
#include <sys/socket.h>
#include "list.h"
...
...
@@ -273,5 +274,6 @@ extern int lxc_network_recv_veth_names_from_parent(struct lxc_handler *handler);
extern
int
lxc_network_send_name_and_ifindex_to_parent
(
struct
lxc_handler
*
handler
);
extern
int
lxc_network_recv_name_and_ifindex_from_child
(
struct
lxc_handler
*
handler
);
extern
int
lxc_netns_set_nsid
(
int
netns_fd
);
extern
int
lxc_netns_get_nsid
(
__s32
fd
);
#endif
/* __LXC_NETWORK_H */
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