Merge remote-tracking branch 'main/main' into next

Signed-off-by: David Ahern <dsahern@kernel.org>
This commit is contained in:
David Ahern
2024-10-25 16:53:41 +00:00
11 changed files with 171 additions and 78 deletions

View File

@@ -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);

View File

@@ -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__ */

View File

@@ -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) \

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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++;

View File

@@ -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:

View File

@@ -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)

View File

@@ -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;

View File

@@ -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");

View File

@@ -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);