Merge remote-tracking branch 'main/main' into next
Signed-off-by: David Ahern <dsahern@kernel.org>
This commit is contained in:
13
bridge/mst.c
13
bridge/mst.c
@@ -176,7 +176,7 @@ static int mst_set(int argc, char **argv)
|
||||
char *d = NULL, *m = NULL, *s = NULL, *endptr;
|
||||
struct rtattr *af_spec, *mst, *entry;
|
||||
__u16 msti;
|
||||
__u8 state;
|
||||
int state;
|
||||
|
||||
while (argc > 0) {
|
||||
if (strcmp(*argv, "dev") == 0) {
|
||||
@@ -212,13 +212,12 @@ static int mst_set(int argc, char **argv)
|
||||
}
|
||||
|
||||
state = strtol(s, &endptr, 10);
|
||||
if (!(*s != '\0' && *endptr == '\0')) {
|
||||
if (!(*s != '\0' && *endptr == '\0'))
|
||||
state = parse_stp_state(s);
|
||||
if (state == -1) {
|
||||
fprintf(stderr,
|
||||
"Error: invalid STP port state\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (state < 0 || state > UINT8_MAX) {
|
||||
fprintf(stderr, "Error: invalid STP port state\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
af_spec = addattr_nest(&req.n, sizeof(req), IFLA_AF_SPEC);
|
||||
|
||||
@@ -60,6 +60,8 @@ struct netns_func {
|
||||
};
|
||||
|
||||
int netns_id_from_name(struct rtnl_handle *rtnl, const char *name);
|
||||
int set_netns_id_from_name(struct rtnl_handle *rtnl, const char *name,
|
||||
int nsid);
|
||||
char *netns_name_from_id(int32_t id);
|
||||
|
||||
#endif /* __NAMESPACE_H__ */
|
||||
|
||||
@@ -6047,11 +6047,6 @@ enum {
|
||||
BPF_F_MARK_ENFORCE = (1ULL << 6),
|
||||
};
|
||||
|
||||
/* BPF_FUNC_clone_redirect and BPF_FUNC_redirect flags. */
|
||||
enum {
|
||||
BPF_F_INGRESS = (1ULL << 0),
|
||||
};
|
||||
|
||||
/* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */
|
||||
enum {
|
||||
BPF_F_TUNINFO_IPV6 = (1ULL << 0),
|
||||
@@ -6198,10 +6193,12 @@ enum {
|
||||
BPF_F_BPRM_SECUREEXEC = (1ULL << 0),
|
||||
};
|
||||
|
||||
/* Flags for bpf_redirect_map helper */
|
||||
/* Flags for bpf_redirect and bpf_redirect_map helpers */
|
||||
enum {
|
||||
BPF_F_BROADCAST = (1ULL << 3),
|
||||
BPF_F_EXCLUDE_INGRESS = (1ULL << 4),
|
||||
BPF_F_INGRESS = (1ULL << 0), /* used for skb path */
|
||||
BPF_F_BROADCAST = (1ULL << 3), /* used for XDP path */
|
||||
BPF_F_EXCLUDE_INGRESS = (1ULL << 4), /* used for XDP path */
|
||||
#define BPF_F_REDIRECT_FLAGS (BPF_F_INGRESS | BPF_F_BROADCAST | BPF_F_EXCLUDE_INGRESS)
|
||||
};
|
||||
|
||||
#define __bpf_md_ptr(type, name) \
|
||||
|
||||
@@ -62,8 +62,6 @@ void netns_nsid_socket_init(void);
|
||||
int print_nsid(struct nlmsghdr *n, void *arg);
|
||||
int ipstats_print(struct nlmsghdr *n, void *arg);
|
||||
char *get_name_from_nsid(int nsid);
|
||||
int get_netnsid_from_name(const char *name);
|
||||
int set_netnsid_from_name(const char *name, int nsid);
|
||||
int do_ipaddr(int argc, char **argv);
|
||||
int do_ipaddrlabel(int argc, char **argv);
|
||||
int do_iproute(int argc, char **argv);
|
||||
|
||||
142
ip/iplink.c
142
ip/iplink.c
@@ -240,6 +240,38 @@ static int nl_get_ll_addr_len(const char *ifname)
|
||||
return len;
|
||||
}
|
||||
|
||||
static int get_ifindex_in_netns(struct rtnl_handle *rtnl, int netnsid,
|
||||
const char *ifname)
|
||||
{
|
||||
struct {
|
||||
struct nlmsghdr n;
|
||||
struct ifinfomsg ifm;
|
||||
char buf[1024];
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = RTM_GETLINK,
|
||||
};
|
||||
struct nlmsghdr *answer;
|
||||
int ifindex;
|
||||
|
||||
addattr32(&req.n, sizeof(req), IFLA_TARGET_NETNSID, netnsid);
|
||||
addattr_l(&req.n, sizeof(req),
|
||||
!check_ifname(ifname) ? IFLA_IFNAME : IFLA_ALT_IFNAME,
|
||||
ifname, strlen(ifname) + 1);
|
||||
|
||||
if (rtnl_talk(rtnl, &req.n, &answer) < 0)
|
||||
return 0;
|
||||
|
||||
if (answer->nlmsg_len < NLMSG_LENGTH(sizeof(struct ifinfomsg))) {
|
||||
free(answer);
|
||||
return 0;
|
||||
}
|
||||
ifindex = ((struct ifinfomsg *)NLMSG_DATA(answer))->ifi_index;
|
||||
free(answer);
|
||||
return ifindex;
|
||||
}
|
||||
|
||||
static void iplink_parse_vf_vlan_info(int vf, int *argcp, char ***argvp,
|
||||
struct ifla_vf_vlan_info *ivvip)
|
||||
{
|
||||
@@ -536,7 +568,10 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req, char **type)
|
||||
int vf = -1;
|
||||
int numtxqueues = -1;
|
||||
int numrxqueues = -1;
|
||||
char *link_netns = NULL;
|
||||
int link_netnsid = -1;
|
||||
struct rtnl_handle netns_rtnl;
|
||||
struct rtnl_handle *rtnl = &rth;
|
||||
int index = 0;
|
||||
int group = -1;
|
||||
int addr_len = 0;
|
||||
@@ -618,20 +653,25 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req, char **type)
|
||||
if (offload && name == dev)
|
||||
dev = NULL;
|
||||
} else if (strcmp(*argv, "netns") == 0) {
|
||||
int pid;
|
||||
|
||||
NEXT_ARG();
|
||||
if (netns != -1)
|
||||
duparg("netns", *argv);
|
||||
netns = netns_get_fd(*argv);
|
||||
if (netns >= 0) {
|
||||
open_fds_add(netns);
|
||||
addattr_l(&req->n, sizeof(*req), IFLA_NET_NS_FD,
|
||||
&netns, 4);
|
||||
if (netns < 0 && get_integer(&pid, *argv, 0) == 0) {
|
||||
char path[PATH_MAX];
|
||||
|
||||
snprintf(path, sizeof(path), "/proc/%d/ns/net",
|
||||
pid);
|
||||
netns = open(path, O_RDONLY);
|
||||
}
|
||||
else if (get_integer(&netns, *argv, 0) == 0)
|
||||
addattr_l(&req->n, sizeof(*req),
|
||||
IFLA_NET_NS_PID, &netns, 4);
|
||||
else
|
||||
if (netns < 0)
|
||||
invarg("Invalid \"netns\" value\n", *argv);
|
||||
|
||||
open_fds_add(netns);
|
||||
addattr_l(&req->n, sizeof(*req), IFLA_NET_NS_FD,
|
||||
&netns, 4);
|
||||
move_netns = true;
|
||||
} else if (strcmp(*argv, "multicast") == 0) {
|
||||
NEXT_ARG();
|
||||
@@ -817,21 +857,12 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req, char **type)
|
||||
addattr_nest_end(&req->n, afs);
|
||||
} else if (matches(*argv, "link-netns") == 0) {
|
||||
NEXT_ARG();
|
||||
if (link_netnsid != -1)
|
||||
if (link_netnsid != -1 || link_netns)
|
||||
duparg("link-netns/link-netnsid", *argv);
|
||||
link_netnsid = get_netnsid_from_name(*argv);
|
||||
/* No nsid? Try to assign one. */
|
||||
if (link_netnsid < 0)
|
||||
set_netnsid_from_name(*argv, -1);
|
||||
link_netnsid = get_netnsid_from_name(*argv);
|
||||
if (link_netnsid < 0)
|
||||
invarg("Invalid \"link-netns\" value\n",
|
||||
*argv);
|
||||
addattr32(&req->n, sizeof(*req), IFLA_LINK_NETNSID,
|
||||
link_netnsid);
|
||||
link_netns = *argv;
|
||||
} else if (matches(*argv, "link-netnsid") == 0) {
|
||||
NEXT_ARG();
|
||||
if (link_netnsid != -1)
|
||||
if (link_netnsid != -1 || link_netns)
|
||||
duparg("link-netns/link-netnsid", *argv);
|
||||
if (get_integer(&link_netnsid, *argv, 0))
|
||||
invarg("Invalid \"link-netnsid\" value\n",
|
||||
@@ -983,6 +1014,53 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req, char **type)
|
||||
}
|
||||
}
|
||||
|
||||
if (netns != -1 && (link_netnsid != -1 || link_netns)) {
|
||||
int orig_netns;
|
||||
|
||||
/*
|
||||
* When both link-netns and netns are set, open an RTNL in
|
||||
* target netns, to
|
||||
* 1) get link-netns id from the view of target netns, and
|
||||
* 2) get link ifindex from link-netns.
|
||||
*/
|
||||
orig_netns = open("/proc/self/ns/net", O_RDONLY);
|
||||
if (orig_netns == -1) {
|
||||
fprintf(stderr, "Cannot open namespace: %s\n",
|
||||
strerror(errno));
|
||||
exit(-1);
|
||||
}
|
||||
if (setns(netns, CLONE_NEWNET) < 0) {
|
||||
fprintf(stderr, "Cannot set namespace: %s\n",
|
||||
strerror(errno));
|
||||
exit(-1);
|
||||
}
|
||||
if (rtnl_open(&netns_rtnl, 0) < 0) {
|
||||
fprintf(stderr, "Cannot open rtnetlink\n");
|
||||
exit(-1);
|
||||
}
|
||||
if (setns(orig_netns, CLONE_NEWNET) < 0) {
|
||||
fprintf(stderr, "Cannot set namespace: %s\n",
|
||||
strerror(errno));
|
||||
exit(-1);
|
||||
}
|
||||
close(orig_netns);
|
||||
rtnl = &netns_rtnl;
|
||||
}
|
||||
|
||||
if (link_netns) {
|
||||
link_netnsid = netns_id_from_name(rtnl, link_netns);
|
||||
/* No nsid? Try to assign one. */
|
||||
if (link_netnsid < 0) {
|
||||
set_netns_id_from_name(rtnl, link_netns, -1);
|
||||
link_netnsid = netns_id_from_name(rtnl, link_netns);
|
||||
}
|
||||
if (link_netnsid < 0)
|
||||
invarg("Invalid \"link-netns\" value\n",
|
||||
*argv);
|
||||
addattr32(&req->n, sizeof(*req), IFLA_LINK_NETNSID,
|
||||
link_netnsid);
|
||||
}
|
||||
|
||||
if (!(req->n.nlmsg_flags & NLM_F_CREATE)) {
|
||||
if (!dev) {
|
||||
fprintf(stderr,
|
||||
@@ -991,8 +1069,10 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req, char **type)
|
||||
}
|
||||
|
||||
req->i.ifi_index = ll_name_to_index(dev);
|
||||
if (!req->i.ifi_index)
|
||||
return nodev(dev);
|
||||
if (!req->i.ifi_index) {
|
||||
ret = nodev(dev);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Not renaming to the same name */
|
||||
if (name == dev)
|
||||
@@ -1010,9 +1090,17 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req, char **type)
|
||||
if (link) {
|
||||
int ifindex;
|
||||
|
||||
ifindex = ll_name_to_index(link);
|
||||
if (!ifindex)
|
||||
return nodev(link);
|
||||
if (link_netnsid == -1)
|
||||
ifindex = ll_name_to_index(link);
|
||||
else
|
||||
ifindex = get_ifindex_in_netns(rtnl,
|
||||
link_netnsid,
|
||||
link);
|
||||
|
||||
if (!ifindex) {
|
||||
ret = nodev(link);
|
||||
goto out;
|
||||
}
|
||||
addattr32(&req->n, sizeof(*req), IFLA_LINK, ifindex);
|
||||
}
|
||||
|
||||
@@ -1024,6 +1112,10 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req, char **type)
|
||||
IFLA_IFNAME, name, strlen(name) + 1);
|
||||
}
|
||||
|
||||
out:
|
||||
if (rtnl == &netns_rtnl)
|
||||
rtnl_close(rtnl);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -271,7 +271,7 @@ static int mroute_list(int argc, char **argv)
|
||||
id = *argv;
|
||||
} else if (matches(*argv, "from") == 0) {
|
||||
NEXT_ARG();
|
||||
if (get_prefix(&filter.msrc, *argv, family))
|
||||
if (get_prefix(&filter.msrc, *argv, preferred_family))
|
||||
invarg("from value is invalid\n", *argv);
|
||||
} else {
|
||||
if (strcmp(*argv, "to") == 0) {
|
||||
@@ -279,7 +279,7 @@ static int mroute_list(int argc, char **argv)
|
||||
}
|
||||
if (matches(*argv, "help") == 0)
|
||||
usage();
|
||||
if (get_prefix(&filter.mdst, *argv, family))
|
||||
if (get_prefix(&filter.mdst, *argv, preferred_family))
|
||||
invarg("to value is invalid\n", *argv);
|
||||
}
|
||||
argc--; argv++;
|
||||
|
||||
@@ -187,16 +187,16 @@ static int do_show(int argc, char **argv)
|
||||
ll_init_map(&rth);
|
||||
|
||||
if (filter.ifindex && filter.family != AF_UNSPEC) {
|
||||
struct nlmsghdr *answer;
|
||||
|
||||
req.ncm.ncm_family = filter.family;
|
||||
addattr_l(&req.n, sizeof(req), NETCONFA_IFINDEX,
|
||||
&filter.ifindex, sizeof(filter.ifindex));
|
||||
|
||||
if (rtnl_send(&rth, &req.n, req.n.nlmsg_len) < 0) {
|
||||
perror("Can not send request");
|
||||
exit(1);
|
||||
}
|
||||
if (rtnl_listen(&rth, print_netconf, stdout) < 0)
|
||||
if (rtnl_talk(&rth, &req.n, &answer) < 0)
|
||||
exit(2);
|
||||
|
||||
print_netconf2(answer, stdout);
|
||||
} else {
|
||||
rth.flags = RTNL_HANDLE_F_SUPPRESS_NLERR;
|
||||
dump:
|
||||
|
||||
28
ip/ipnetns.c
28
ip/ipnetns.c
@@ -104,7 +104,7 @@ static int ipnetns_have_nsid(void)
|
||||
return have_rtnl_getnsid;
|
||||
}
|
||||
|
||||
int get_netnsid_from_name(const char *name)
|
||||
static int get_netnsid_from_name(const char *name)
|
||||
{
|
||||
netns_nsid_socket_init();
|
||||
|
||||
@@ -896,33 +896,11 @@ out_delete:
|
||||
return -1;
|
||||
}
|
||||
|
||||
int set_netnsid_from_name(const char *name, int nsid)
|
||||
static int set_netnsid_from_name(const char *name, int nsid)
|
||||
{
|
||||
struct {
|
||||
struct nlmsghdr n;
|
||||
struct rtgenmsg g;
|
||||
char buf[1024];
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtgenmsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = RTM_NEWNSID,
|
||||
.g.rtgen_family = AF_UNSPEC,
|
||||
};
|
||||
int fd, err = 0;
|
||||
|
||||
netns_nsid_socket_init();
|
||||
|
||||
fd = netns_get_fd(name);
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
||||
addattr32(&req.n, 1024, NETNSA_FD, fd);
|
||||
addattr32(&req.n, 1024, NETNSA_NSID, nsid);
|
||||
if (rtnl_talk(&rth, &req.n, NULL) < 0)
|
||||
err = -2;
|
||||
|
||||
close(fd);
|
||||
return err;
|
||||
return set_netns_id_from_name(&rth, name, nsid);
|
||||
}
|
||||
|
||||
static int netns_set(int argc, char **argv)
|
||||
|
||||
@@ -189,6 +189,33 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int set_netns_id_from_name(struct rtnl_handle *rtnl, const char *name, int nsid)
|
||||
{
|
||||
struct {
|
||||
struct nlmsghdr n;
|
||||
struct rtgenmsg g;
|
||||
char buf[1024];
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtgenmsg)),
|
||||
.n.nlmsg_flags = NLM_F_REQUEST,
|
||||
.n.nlmsg_type = RTM_NEWNSID,
|
||||
.g.rtgen_family = AF_UNSPEC,
|
||||
};
|
||||
int fd, err = 0;
|
||||
|
||||
fd = netns_get_fd(name);
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
||||
addattr32(&req.n, 1024, NETNSA_FD, fd);
|
||||
addattr32(&req.n, 1024, NETNSA_NSID, nsid);
|
||||
if (rtnl_talk(rtnl, &req.n, NULL) < 0)
|
||||
err = -2;
|
||||
|
||||
close(fd);
|
||||
return err;
|
||||
}
|
||||
|
||||
struct netns_name_from_id_ctx {
|
||||
int32_t id;
|
||||
char *name;
|
||||
|
||||
@@ -16,8 +16,8 @@ static int res_help(struct rd *rd)
|
||||
pr_out(" resource show qp link [DEV/PORT] [FILTER-NAME FILTER-VALUE]\n");
|
||||
pr_out(" resource show cm_id link [DEV/PORT]\n");
|
||||
pr_out(" resource show cm_id link [DEV/PORT] [FILTER-NAME FILTER-VALUE]\n");
|
||||
pr_out(" resource show cq link [DEV/PORT]\n");
|
||||
pr_out(" resource show cq link [DEV/PORT] [FILTER-NAME FILTER-VALUE]\n");
|
||||
pr_out(" resource show cq dev [DEV]\n");
|
||||
pr_out(" resource show cq dev [DEV] [FILTER-NAME FILTER-VALUE]\n");
|
||||
pr_out(" resource show pd dev [DEV]\n");
|
||||
pr_out(" resource show pd dev [DEV] [FILTER-NAME FILTER-VALUE]\n");
|
||||
pr_out(" resource show mr dev [DEV]\n");
|
||||
|
||||
@@ -414,7 +414,7 @@ random_loss_model:
|
||||
}
|
||||
} else if (matches(*argv, "distribution") == 0) {
|
||||
NEXT_ARG();
|
||||
dist_data = calloc(sizeof(dist_data[0]), MAX_DIST);
|
||||
dist_data = calloc(MAX_DIST, sizeof(dist_data[0]));
|
||||
if (dist_data == NULL)
|
||||
return -1;
|
||||
|
||||
@@ -479,7 +479,7 @@ random_loss_model:
|
||||
if (strcmp(*argv, "distribution") == 0) {
|
||||
present[TCA_NETEM_SLOT] = 1;
|
||||
NEXT_ARG();
|
||||
slot_dist_data = calloc(sizeof(slot_dist_data[0]), MAX_DIST);
|
||||
slot_dist_data = calloc(MAX_DIST, sizeof(slot_dist_data[0]));
|
||||
if (!slot_dist_data)
|
||||
return -1;
|
||||
slot_dist_size = get_distribution(*argv, slot_dist_data, MAX_DIST);
|
||||
|
||||
Reference in New Issue
Block a user