req->i.ifi_flags &= ~IFF_UP;
} else if (strcmp(*argv, "name") == 0) {
NEXT_ARG();
+ if (*name)
+ duparg("name", *argv);
if (check_ifname(*argv))
invarg("\"name\" not a valid ifname", *argv);
*name = *argv;
+ if (!*dev) {
+ *dev = *name;
+ dev_index = ll_name_to_index(*dev);
+ }
} else if (strcmp(*argv, "index") == 0) {
NEXT_ARG();
if (*index)
if (xdp_parse(&argc, &argv, req, dev_index,
generic, drv, offload))
exit(-1);
+
+ if (offload && *name == *dev)
+ *dev = NULL;
} else if (strcmp(*argv, "netns") == 0) {
NEXT_ARG();
if (netns != -1)
if (len < 0)
return -1;
addattr_nest_end(&req->n, vflist);
+
+ if (*name == *dev)
+ *dev = NULL;
} else if (matches(*argv, "master") == 0) {
int ifindex;
if (strcmp(*argv, "dev") == 0)
NEXT_ARG();
- if (*dev)
+ if (*dev != *name)
duparg2("dev", *argv);
if (check_ifname(*argv))
invarg("\"dev\" not a valid ifname", *argv);
argc--; argv++;
}
+ /* Allow "ip link add dev" and "ip link add name" */
+ if (!*name)
+ *name = *dev;
+ else if (!*dev)
+ *dev = *name;
+ else if (!strcmp(*name, *dev))
+ *name = *dev;
+
if (dev_index && addr_len) {
int halen = nl_get_ll_addr_len(dev_index);
req.i.ifi_index = ll_name_to_index(dev);
if (!req.i.ifi_index)
return nodev(dev);
+
+ /* Not renaming to the same name */
+ if (name == dev)
+ name = NULL;
} else {
- /* Allow "ip link add dev" and "ip link add name" */
- if (!name)
- name = dev;
+ if (name != dev) {
+ fprintf(stderr,
+ "both \"name\" and \"dev\" cannot be used when creating devices.\n");
+ exit(-1);
+ }
if (link) {
int ifindex;