iplink.c revision ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87
1aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger/* 2aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * iplink.c "ip link". 3aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * 4aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * This program is free software; you can redistribute it and/or 5aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * modify it under the terms of the GNU General Public License 6aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * as published by the Free Software Foundation; either version 7aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * 2 of the License, or (at your option) any later version. 8aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * 9aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> 10aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * 11aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger */ 12aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 13aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <stdio.h> 14aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <stdlib.h> 15aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <unistd.h> 16aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <syslog.h> 17aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <fcntl.h> 181d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy#include <dlfcn.h> 19aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <errno.h> 20aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <sys/socket.h> 21aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <linux/if.h> 22aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <linux/if_packet.h> 23aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <linux/if_ether.h> 24aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <linux/sockios.h> 25aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <netinet/in.h> 26aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <arpa/inet.h> 27aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <string.h> 28aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <sys/ioctl.h> 29aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <linux/sockios.h> 30aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 31aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "rt_names.h" 32aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "utils.h" 33aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "ip_common.h" 34aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 351d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy#define IPLINK_IOCTL_COMPAT 1 365e3bb534ae179be141a92eb1a4e2eb48094193b7Andreas Henriksson#ifndef LIBDIR 375e3bb534ae179be141a92eb1a4e2eb48094193b7Andreas Henriksson#define LIBDIR "/usr/lib/" 38b514b3587ee56552fcc87a066c955a7ff4f55d6fRafael Almeida#endif 39aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 40aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic void usage(void) __attribute__((noreturn)); 41750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemmingerstatic int iplink_have_newlink(void); 42aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 43aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid iplink_usage(void) 44aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 45750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger if (iplink_have_newlink()) { 46750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger fprintf(stderr, "Usage: ip link add link DEV [ name ] NAME\n"); 47750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger fprintf(stderr, " [ txqueuelen PACKETS ]\n"); 48750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger fprintf(stderr, " [ address LLADDR ]\n"); 49750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger fprintf(stderr, " [ broadcast LLADDR ]\n"); 50750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger fprintf(stderr, " [ mtu MTU ]\n"); 51750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger fprintf(stderr, " type TYPE [ ARGS ]\n"); 52750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger fprintf(stderr, " ip link delete DEV type TYPE [ ARGS ]\n"); 53750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger fprintf(stderr, "\n"); 54750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger fprintf(stderr, " ip link set DEVICE [ { up | down } ]\n"); 55750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger } else 56750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger fprintf(stderr, "Usage: ip link set DEVICE [ { up | down } ]\n"); 57750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger 58750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger fprintf(stderr, " [ arp { on | off } ]\n"); 59750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger fprintf(stderr, " [ dynamic { on | off } ]\n"); 60750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger fprintf(stderr, " [ multicast { on | off } ]\n"); 61750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger fprintf(stderr, " [ allmulticast { on | off } ]\n"); 62750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger fprintf(stderr, " [ promisc { on | off } ]\n"); 63750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger fprintf(stderr, " [ trailers { on | off } ]\n"); 64750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger fprintf(stderr, " [ txqueuelen PACKETS ]\n"); 65750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger fprintf(stderr, " [ name NEWNAME ]\n"); 66750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger fprintf(stderr, " [ address LLADDR ]\n"); 67750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger fprintf(stderr, " [ broadcast LLADDR ]\n"); 68750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger fprintf(stderr, " [ mtu MTU ]\n"); 69750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger fprintf(stderr, " [ netns PID ]\n"); 70ace9c96121b10ff8f91d79b7486bb8a5520c12dfStephen Hemminger fprintf(stderr, " [ alias NAME ]\n"); 71ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A fprintf(stderr, " [ vf NUM [ mac LLADDR ]\n"); 72ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A fprintf(stderr, " [ vlan VLANID [ qos VLAN-QOS ] ]\n"); 73ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A fprintf(stderr, " [ rate TXRATE ] ] \n"); 74aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, " ip link show [ DEVICE ]\n"); 75750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger 76750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger if (iplink_have_newlink()) { 77750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger fprintf(stderr, "\n"); 785a2044782b6a0eb7594d3b3e2e32bbd6a63e77f1Wolfgang Grandegger fprintf(stderr, "TYPE := { vlan | veth | vcan | dummy | ifb | macvlan | can }\n"); 79750a405a5a6f6cdae7d14609b49051e59738177eStephen Hemminger } 80aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger exit(-1); 81aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 82aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 83aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic void usage(void) 84aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 85aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger iplink_usage(); 86aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 87aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 88aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int on_off(char *msg) 89aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 90aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Error: argument of \"%s\" must be \"on\" or \"off\"\n", msg); 91aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 92aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 93aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 941d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardystatic void *BODY; /* cached dlopen(NULL) handle */ 951d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardystatic struct link_util *linkutil_list; 961d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 971d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardystruct link_util *get_link_kind(const char *id) 981d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy{ 991d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy void *dlh; 1001d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy char buf[256]; 1011d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy struct link_util *l; 1021d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 1031d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy for (l = linkutil_list; l; l = l->next) 1041d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (strcmp(l->id, id) == 0) 1051d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy return l; 1061d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 1075e3bb534ae179be141a92eb1a4e2eb48094193b7Andreas Henriksson snprintf(buf, sizeof(buf), LIBDIR "/ip/link_%s.so", id); 1081d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy dlh = dlopen(buf, RTLD_LAZY); 1091d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (dlh == NULL) { 1101d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy /* look in current binary, only open once */ 1111d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy dlh = BODY; 1121d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (dlh == NULL) { 1131d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy dlh = BODY = dlopen(NULL, RTLD_LAZY); 1141d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (dlh == NULL) 1151d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy return NULL; 1161d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } 1171d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } 1181d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 1191d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy snprintf(buf, sizeof(buf), "%s_link_util", id); 1201d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy l = dlsym(dlh, buf); 1211d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (l == NULL) 1221d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy return NULL; 1231d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 1241d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy l->next = linkutil_list; 1251d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy linkutil_list = l; 1261d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy return l; 1271d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy} 1281d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 1291d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy#if IPLINK_IOCTL_COMPAT 1301d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardystatic int have_rtnl_newlink = -1; 1311d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 1321d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardystatic int accept_msg(const struct sockaddr_nl *who, 1331d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy struct nlmsghdr *n, void *arg) 1341d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy{ 1351d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy struct nlmsgerr *err = (struct nlmsgerr *)NLMSG_DATA(n); 1361d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 13766e529f579f45351828fc82d6ba2629cc6eb3dddPatrick McHardy if (n->nlmsg_type == NLMSG_ERROR && 13866e529f579f45351828fc82d6ba2629cc6eb3dddPatrick McHardy (err->error == -EOPNOTSUPP || err->error == -EINVAL)) 1391d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy have_rtnl_newlink = 0; 1401d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy else 1411d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy have_rtnl_newlink = 1; 1421d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy return -1; 1431d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy} 1441d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 1451d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardystatic int iplink_have_newlink(void) 1461d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy{ 1471d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy struct { 1481d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy struct nlmsghdr n; 1491d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy struct ifinfomsg i; 1501d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy char buf[1024]; 1511d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } req; 1521d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 1531d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (have_rtnl_newlink < 0) { 1541d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy memset(&req, 0, sizeof(req)); 1551d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 1561d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)); 1571d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy req.n.nlmsg_flags = NLM_F_REQUEST|NLM_F_ACK; 1581d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy req.n.nlmsg_type = RTM_NEWLINK; 1591d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy req.i.ifi_family = AF_UNSPEC; 1601d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 1611d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy rtnl_send(&rth, (char *)&req.n, req.n.nlmsg_len); 1621d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy rtnl_listen(&rth, accept_msg, NULL); 1631d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } 1641d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy return have_rtnl_newlink; 1651d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy} 1661d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy#else /* IPLINK_IOCTL_COMPAT */ 1671d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardystatic int iplink_have_newlink(void) 1681d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy{ 1691d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy return 1; 1701d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy} 1711d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy#endif /* ! IPLINK_IOCTL_COMPAT */ 1721d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 173909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanovstruct iplink_req { 174909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov struct nlmsghdr n; 175909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov struct ifinfomsg i; 176909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov char buf[1024]; 177909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov}; 178909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov 179909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanovint iplink_parse(int argc, char **argv, struct iplink_req *req, 180909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov char **name, char **type, char **link, char **dev) 1811d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy{ 182909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov int ret, len; 183909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov char abuf[32]; 1841d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy int qlen = -1; 1851d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy int mtu = -1; 186e2613dc8605e56dbc53890ebbae263f93610bd41Benjamin Thery int netns = -1; 187ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A int vf = -1; 1881d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 189909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov ret = argc; 1901d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 1911d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy while (argc > 0) { 1921d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (strcmp(*argv, "up") == 0) { 193909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req->i.ifi_change |= IFF_UP; 194909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req->i.ifi_flags |= IFF_UP; 1951d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else if (strcmp(*argv, "down") == 0) { 196909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req->i.ifi_change |= IFF_UP; 197909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req->i.ifi_flags &= ~IFF_UP; 1981d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else if (strcmp(*argv, "name") == 0) { 1991d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy NEXT_ARG(); 200909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov *name = *argv; 2011d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else if (matches(*argv, "link") == 0) { 2021d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy NEXT_ARG(); 203909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov *link = *argv; 2041d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else if (matches(*argv, "address") == 0) { 2051d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy NEXT_ARG(); 2061d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy len = ll_addr_a2n(abuf, sizeof(abuf), *argv); 207cb2eb9997a0292a144968d117f4d831c155ca71dAndreas Henriksson if (len < 0) 208cb2eb9997a0292a144968d117f4d831c155ca71dAndreas Henriksson return -1; 209909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov addattr_l(&req->n, sizeof(*req), IFLA_ADDRESS, abuf, len); 2101d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else if (matches(*argv, "broadcast") == 0 || 211909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov strcmp(*argv, "brd") == 0) { 2121d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy NEXT_ARG(); 2131d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy len = ll_addr_a2n(abuf, sizeof(abuf), *argv); 214cb2eb9997a0292a144968d117f4d831c155ca71dAndreas Henriksson if (len < 0) 215cb2eb9997a0292a144968d117f4d831c155ca71dAndreas Henriksson return -1; 216909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov addattr_l(&req->n, sizeof(*req), IFLA_BROADCAST, abuf, len); 2171d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else if (matches(*argv, "txqueuelen") == 0 || 218909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov strcmp(*argv, "qlen") == 0 || 219909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov matches(*argv, "txqlen") == 0) { 2201d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy NEXT_ARG(); 2211d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (qlen != -1) 2221d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy duparg("txqueuelen", *argv); 2231d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (get_integer(&qlen, *argv, 0)) 2241d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy invarg("Invalid \"txqueuelen\" value\n", *argv); 225909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov addattr_l(&req->n, sizeof(*req), IFLA_TXQLEN, &qlen, 4); 2261d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else if (strcmp(*argv, "mtu") == 0) { 2271d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy NEXT_ARG(); 2281d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (mtu != -1) 2291d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy duparg("mtu", *argv); 2301d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (get_integer(&mtu, *argv, 0)) 2311d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy invarg("Invalid \"mtu\" value\n", *argv); 232909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov addattr_l(&req->n, sizeof(*req), IFLA_MTU, &mtu, 4); 233e2613dc8605e56dbc53890ebbae263f93610bd41Benjamin Thery } else if (strcmp(*argv, "netns") == 0) { 234e2613dc8605e56dbc53890ebbae263f93610bd41Benjamin Thery NEXT_ARG(); 235e2613dc8605e56dbc53890ebbae263f93610bd41Benjamin Thery if (netns != -1) 236e2613dc8605e56dbc53890ebbae263f93610bd41Benjamin Thery duparg("netns", *argv); 237e2613dc8605e56dbc53890ebbae263f93610bd41Benjamin Thery if (get_integer(&netns, *argv, 0)) 238e2613dc8605e56dbc53890ebbae263f93610bd41Benjamin Thery invarg("Invalid \"netns\" value\n", *argv); 239e2613dc8605e56dbc53890ebbae263f93610bd41Benjamin Thery addattr_l(&req->n, sizeof(*req), IFLA_NET_NS_PID, &netns, 4); 2401d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else if (strcmp(*argv, "multicast") == 0) { 2411d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy NEXT_ARG(); 242909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req->i.ifi_change |= IFF_MULTICAST; 2431d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (strcmp(*argv, "on") == 0) { 244909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req->i.ifi_flags |= IFF_MULTICAST; 2451d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else if (strcmp(*argv, "off") == 0) { 246909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req->i.ifi_flags &= ~IFF_MULTICAST; 2471d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else 2481d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy return on_off("multicast"); 2491d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else if (strcmp(*argv, "allmulticast") == 0) { 2501d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy NEXT_ARG(); 251909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req->i.ifi_change |= IFF_ALLMULTI; 2521d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (strcmp(*argv, "on") == 0) { 253909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req->i.ifi_flags |= IFF_ALLMULTI; 2541d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else if (strcmp(*argv, "off") == 0) { 255909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req->i.ifi_flags &= ~IFF_ALLMULTI; 2561d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else 2571d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy return on_off("allmulticast"); 2581d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else if (strcmp(*argv, "promisc") == 0) { 2591d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy NEXT_ARG(); 260909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req->i.ifi_change |= IFF_PROMISC; 2611d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (strcmp(*argv, "on") == 0) { 262909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req->i.ifi_flags |= IFF_PROMISC; 2631d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else if (strcmp(*argv, "off") == 0) { 264909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req->i.ifi_flags &= ~IFF_PROMISC; 2651d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else 2661d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy return on_off("promisc"); 2671d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else if (strcmp(*argv, "trailers") == 0) { 2681d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy NEXT_ARG(); 269909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req->i.ifi_change |= IFF_NOTRAILERS; 2701d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (strcmp(*argv, "off") == 0) { 271909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req->i.ifi_flags |= IFF_NOTRAILERS; 2721d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else if (strcmp(*argv, "on") == 0) { 273909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req->i.ifi_flags &= ~IFF_NOTRAILERS; 2741d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else 2751d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy return on_off("trailers"); 2761d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else if (strcmp(*argv, "arp") == 0) { 2771d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy NEXT_ARG(); 278909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req->i.ifi_change |= IFF_NOARP; 2791d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (strcmp(*argv, "on") == 0) { 280909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req->i.ifi_flags &= ~IFF_NOARP; 2811d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else if (strcmp(*argv, "off") == 0) { 282909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req->i.ifi_flags |= IFF_NOARP; 2831d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else 2841d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy return on_off("noarp"); 285ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A } else if (strcmp(*argv, "vf") == 0) { 286ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A NEXT_ARG(); 287ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A if (get_integer(&vf, *argv, 0)) { 288ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A invarg("Invalid \"vf\" value\n", *argv); 289ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A } 290ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A } else if (matches(*argv, "mac") == 0) { 291ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A struct ifla_vf_mac ivm; 292ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A NEXT_ARG(); 293ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A if (vf < 0) { 294ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A missarg("vf"); 295ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A } 296ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A ivm.vf = vf; 297ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A len = ll_addr_a2n((char *)ivm.mac, 32, *argv); 298ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A if (len < 0) 299ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A return -1; 300ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A addattr_l(&req->n, sizeof(*req), IFLA_VF_MAC, &ivm, sizeof(ivm)); 301ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A } else if (matches(*argv, "vlan") == 0) { 302ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A struct ifla_vf_vlan ivv; 303ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A NEXT_ARG(); 304ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A if (vf < 0) { 305ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A missarg("vf"); 306ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A } 307ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A if (get_unsigned(&ivv.vlan, *argv, 0)) { 308ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A invarg("Invalid \"vlan\" value\n", *argv); 309ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A } 310ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A ivv.vf = vf; 311ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A ivv.qos = 0; 312ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A if (NEXT_ARG_OK()) { 313ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A NEXT_ARG(); 314ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A if (matches(*argv, "qos") == 0) { 315ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A NEXT_ARG(); 316ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A if (get_unsigned(&ivv.qos, *argv, 0)) { 317ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A invarg("Invalid \"qos\" value\n", *argv); 318ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A } 319ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A } 320ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A } 321ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A addattr_l(&req->n, sizeof(*req), IFLA_VF_VLAN, &ivv, sizeof(ivv)); 322ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A } else if (matches(*argv, "rate") == 0) { 323ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A struct ifla_vf_tx_rate ivt; 324ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A NEXT_ARG(); 325ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A if (vf < 0) { 326ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A missarg("vf"); 327ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A } 328ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A if (get_unsigned(&ivt.rate, *argv, 0)) { 329ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A invarg("Invalid \"rate\" value\n", *argv); 330ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A } 331ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A ivt.vf = vf; 332ae7229d5f99ed9d7fd6ae11bcc726b80e8f8cb87Williams, Mitch A addattr_l(&req->n, sizeof(*req), IFLA_VF_TX_RATE, &ivt, sizeof(ivt)); 3331d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy#ifdef IFF_DYNAMIC 3341d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else if (matches(*argv, "dynamic") == 0) { 3351d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy NEXT_ARG(); 336909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req->i.ifi_change |= IFF_DYNAMIC; 3371d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (strcmp(*argv, "on") == 0) { 338909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req->i.ifi_flags |= IFF_DYNAMIC; 3391d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else if (strcmp(*argv, "off") == 0) { 340909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req->i.ifi_flags &= ~IFF_DYNAMIC; 3411d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else 3421d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy return on_off("dynamic"); 3431d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy#endif 3441d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else if (matches(*argv, "type") == 0) { 3451d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy NEXT_ARG(); 346909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov *type = *argv; 3471d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy argc--; argv++; 3481d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy break; 349ace9c96121b10ff8f91d79b7486bb8a5520c12dfStephen Hemminger } else if (matches(*argv, "alias") == 0) { 350ace9c96121b10ff8f91d79b7486bb8a5520c12dfStephen Hemminger NEXT_ARG(); 351ace9c96121b10ff8f91d79b7486bb8a5520c12dfStephen Hemminger addattr_l(&req->n, sizeof(*req), IFLA_IFALIAS, 352ace9c96121b10ff8f91d79b7486bb8a5520c12dfStephen Hemminger *argv, strlen(*argv)); 353ace9c96121b10ff8f91d79b7486bb8a5520c12dfStephen Hemminger argc--; argv++; 354ace9c96121b10ff8f91d79b7486bb8a5520c12dfStephen Hemminger break; 3551d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else { 356909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov if (strcmp(*argv, "dev") == 0) { 3571d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy NEXT_ARG(); 3581d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } 359053255520216654c6914e84b0a37e86c542898bdPatrick McHardy if (matches(*argv, "help") == 0) 360053255520216654c6914e84b0a37e86c542898bdPatrick McHardy usage(); 361909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov if (*dev) 3621d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy duparg2("dev", *argv); 363909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov *dev = *argv; 3641d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } 3651d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy argc--; argv++; 3661d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } 3671d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 368909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov return ret - argc; 369909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov} 370909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov 371909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanovstatic int iplink_modify(int cmd, unsigned int flags, int argc, char **argv) 372909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov{ 373909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov int len; 374909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov char *dev = NULL; 375909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov char *name = NULL; 376909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov char *link = NULL; 377909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov char *type = NULL; 378909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov struct link_util *lu = NULL; 379909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov struct iplink_req req; 380909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov int ret; 381909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov 382909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov memset(&req, 0, sizeof(req)); 383909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov 384909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)); 385909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req.n.nlmsg_flags = NLM_F_REQUEST|flags; 386909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req.n.nlmsg_type = cmd; 387909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov req.i.ifi_family = preferred_family; 388909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov 389909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov ret = iplink_parse(argc, argv, &req, &name, &type, &link, &dev); 390909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov if (ret < 0) 391909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov return ret; 392909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov 393909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov argc -= ret; 394909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanov argv += ret; 3951d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy ll_init_map(&rth); 3961d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 3971d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (type) { 3981d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy struct rtattr *linkinfo = NLMSG_TAIL(&req.n); 3991d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy addattr_l(&req.n, sizeof(req), IFLA_LINKINFO, NULL, 0); 4001d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy addattr_l(&req.n, sizeof(req), IFLA_INFO_KIND, type, 4011d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy strlen(type)); 4021d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 4031d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy lu = get_link_kind(type); 4041d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (lu && argc) { 4051d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy struct rtattr * data = NLMSG_TAIL(&req.n); 4061d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy addattr_l(&req.n, sizeof(req), IFLA_INFO_DATA, NULL, 0); 4071d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 4081d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (lu->parse_opt && 4091d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy lu->parse_opt(lu, argc, argv, &req.n)) 4101d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy return -1; 4111d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 4121d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy data->rta_len = (void *)NLMSG_TAIL(&req.n) - (void *)data; 4131d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else if (argc) { 4141d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (matches(*argv, "help") == 0) 4151d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy usage(); 4161d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy fprintf(stderr, "Garbage instead of arguments \"%s ...\". " 4171d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy "Try \"ip link help\".\n", *argv); 4181d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy return -1; 4191d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } 4201d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy linkinfo->rta_len = (void *)NLMSG_TAIL(&req.n) - (void *)linkinfo; 4213ef0c8594283d4891e84b4b8d7d04901416aeae0Patrick McHardy } else if (flags & NLM_F_CREATE) { 4223ef0c8594283d4891e84b4b8d7d04901416aeae0Patrick McHardy fprintf(stderr, "Not enough information: \"type\" argument " 4233ef0c8594283d4891e84b4b8d7d04901416aeae0Patrick McHardy "is required\n"); 4243ef0c8594283d4891e84b4b8d7d04901416aeae0Patrick McHardy return -1; 4251d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } 4261d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 4271d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (!(flags & NLM_F_CREATE)) { 4281d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (!dev) { 4291d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy fprintf(stderr, "Not enough information: \"dev\" " 4301d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy "argument is required.\n"); 4311d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy exit(-1); 4321d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } 4331d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 4341d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy req.i.ifi_index = ll_name_to_index(dev); 4351d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (req.i.ifi_index == 0) { 4361d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy fprintf(stderr, "Cannot find device \"%s\"\n", dev); 4371d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy return -1; 4381d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } 4391d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else { 4401d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy /* Allow "ip link add dev" and "ip link add name" */ 4411d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (!name) 4421d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy name = dev; 4431d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 4441d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (link) { 4451d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy int ifindex; 4461d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 4471d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy ifindex = ll_name_to_index(link); 4481d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (ifindex == 0) { 4491d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy fprintf(stderr, "Cannot find device \"%s\"\n", 4501d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy link); 4511d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy return -1; 4521d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } 4531d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy addattr_l(&req.n, sizeof(req), IFLA_LINK, &ifindex, 4); 4541d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } 4551d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } 4561d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 4571d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (name) { 4581d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy len = strlen(name) + 1; 459ca78b0e7d4042be7f7283d551d433b76da7f312bPatrick McHardy if (len == 1) 460ca78b0e7d4042be7f7283d551d433b76da7f312bPatrick McHardy invarg("\"\" is not a valid device identifier\n", "name"); 4611d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (len > IFNAMSIZ) 462ca78b0e7d4042be7f7283d551d433b76da7f312bPatrick McHardy invarg("\"name\" too long\n", name); 4631d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy addattr_l(&req.n, sizeof(req), IFLA_IFNAME, name, len); 4641d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } 4651d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 4661d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (rtnl_talk(&rth, &req.n, 0, 0, NULL, NULL, NULL) < 0) 4671d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy exit(2); 4681d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 4691d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy return 0; 4701d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy} 4711d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy 4721d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy#if IPLINK_IOCTL_COMPAT 473aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int get_ctl_fd(void) 474aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 475aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int s_errno; 476aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int fd; 477aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 478aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fd = socket(PF_INET, SOCK_DGRAM, 0); 479aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (fd >= 0) 480aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return fd; 481aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger s_errno = errno; 482aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fd = socket(PF_PACKET, SOCK_DGRAM, 0); 483aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (fd >= 0) 484aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return fd; 485aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fd = socket(PF_INET6, SOCK_DGRAM, 0); 486aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (fd >= 0) 487aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return fd; 488aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger errno = s_errno; 489aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger perror("Cannot create control socket"); 490aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 491aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 492aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 49371058eb8ef128aa99666dc4e6664e7632e12a1b9osdl.net!shemmingerstatic int do_chflags(const char *dev, __u32 flags, __u32 mask) 494aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 495aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct ifreq ifr; 496aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int fd; 497aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int err; 498aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 49971058eb8ef128aa99666dc4e6664e7632e12a1b9osdl.net!shemminger strncpy(ifr.ifr_name, dev, IFNAMSIZ); 500aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fd = get_ctl_fd(); 501aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (fd < 0) 502aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 503aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger err = ioctl(fd, SIOCGIFFLAGS, &ifr); 504aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (err) { 505aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger perror("SIOCGIFFLAGS"); 506aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger close(fd); 507aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 508aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 509aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if ((ifr.ifr_flags^flags)&mask) { 510aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger ifr.ifr_flags &= ~mask; 511aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger ifr.ifr_flags |= mask&flags; 512aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger err = ioctl(fd, SIOCSIFFLAGS, &ifr); 513aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (err) 514aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger perror("SIOCSIFFLAGS"); 515aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 516aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger close(fd); 517aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return err; 518aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 519aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 52071058eb8ef128aa99666dc4e6664e7632e12a1b9osdl.net!shemmingerstatic int do_changename(const char *dev, const char *newdev) 521aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 522aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct ifreq ifr; 523aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int fd; 524aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int err; 525aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 52671058eb8ef128aa99666dc4e6664e7632e12a1b9osdl.net!shemminger strncpy(ifr.ifr_name, dev, IFNAMSIZ); 52771058eb8ef128aa99666dc4e6664e7632e12a1b9osdl.net!shemminger strncpy(ifr.ifr_newname, newdev, IFNAMSIZ); 528aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fd = get_ctl_fd(); 529aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (fd < 0) 530aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 531aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger err = ioctl(fd, SIOCSIFNAME, &ifr); 532aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (err) { 533aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger perror("SIOCSIFNAME"); 534aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger close(fd); 535aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 536aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 537aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger close(fd); 538aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return err; 539aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 540aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 54171058eb8ef128aa99666dc4e6664e7632e12a1b9osdl.net!shemmingerstatic int set_qlen(const char *dev, int qlen) 542aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 543aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct ifreq ifr; 544aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int s; 545aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 546aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger s = get_ctl_fd(); 547aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (s < 0) 548aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 549aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 550aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger memset(&ifr, 0, sizeof(ifr)); 551ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger strncpy(ifr.ifr_name, dev, IFNAMSIZ); 552ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger ifr.ifr_qlen = qlen; 553aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (ioctl(s, SIOCSIFTXQLEN, &ifr) < 0) { 554aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger perror("SIOCSIFXQLEN"); 555aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger close(s); 556aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 557aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 558aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger close(s); 559aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 560ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger return 0; 561aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 562aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 56371058eb8ef128aa99666dc4e6664e7632e12a1b9osdl.net!shemmingerstatic int set_mtu(const char *dev, int mtu) 564aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 565aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct ifreq ifr; 566aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int s; 567aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 568aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger s = get_ctl_fd(); 569aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (s < 0) 570aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 571aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 572aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger memset(&ifr, 0, sizeof(ifr)); 573ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger strncpy(ifr.ifr_name, dev, IFNAMSIZ); 574ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger ifr.ifr_mtu = mtu; 575aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (ioctl(s, SIOCSIFMTU, &ifr) < 0) { 576aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger perror("SIOCSIFMTU"); 577aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger close(s); 578aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 579aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 580aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger close(s); 581aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 582ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger return 0; 583aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 584aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 58571058eb8ef128aa99666dc4e6664e7632e12a1b9osdl.net!shemmingerstatic int get_address(const char *dev, int *htype) 586aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 587aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct ifreq ifr; 588aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct sockaddr_ll me; 589f332d169246447bd5e258ac03d5ee840a70adb1eshemminger socklen_t alen; 590aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int s; 591aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 592aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger s = socket(PF_PACKET, SOCK_DGRAM, 0); 593ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger if (s < 0) { 594aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger perror("socket(PF_PACKET)"); 595aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 596aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 597aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 598aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger memset(&ifr, 0, sizeof(ifr)); 59971058eb8ef128aa99666dc4e6664e7632e12a1b9osdl.net!shemminger strncpy(ifr.ifr_name, dev, IFNAMSIZ); 600aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) { 601aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger perror("SIOCGIFINDEX"); 602aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger close(s); 603aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 604aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 605aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 606aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger memset(&me, 0, sizeof(me)); 607aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger me.sll_family = AF_PACKET; 608aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger me.sll_ifindex = ifr.ifr_ifindex; 609aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger me.sll_protocol = htons(ETH_P_LOOP); 610aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (bind(s, (struct sockaddr*)&me, sizeof(me)) == -1) { 611aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger perror("bind"); 612aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger close(s); 613aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 614aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 615aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 616aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger alen = sizeof(me); 617aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (getsockname(s, (struct sockaddr*)&me, &alen) == -1) { 618aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger perror("getsockname"); 619aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger close(s); 620aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 621aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 622aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger close(s); 623aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *htype = me.sll_hatype; 624aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return me.sll_halen; 625aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 626aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 627ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemmingerstatic int parse_address(const char *dev, int hatype, int halen, 6287b5657545dc246ae37690d660597e8fa37040205shemminger char *lla, struct ifreq *ifr) 629aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 630aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int alen; 631aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 632aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger memset(ifr, 0, sizeof(*ifr)); 63371058eb8ef128aa99666dc4e6664e7632e12a1b9osdl.net!shemminger strncpy(ifr->ifr_name, dev, IFNAMSIZ); 634aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger ifr->ifr_hwaddr.sa_family = hatype; 635aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger alen = ll_addr_a2n(ifr->ifr_hwaddr.sa_data, 14, lla); 636aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (alen < 0) 637aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 638aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (alen != halen) { 639aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Wrong address (%s) length: expected %d bytes\n", lla, halen); 640aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 641aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 642ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger return 0; 643aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 644aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 645aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int set_address(struct ifreq *ifr, int brd) 646aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 647aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int s; 648aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 649aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger s = get_ctl_fd(); 650aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (s < 0) 651aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 652aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (ioctl(s, brd?SIOCSIFHWBROADCAST:SIOCSIFHWADDR, ifr) < 0) { 653aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger perror(brd?"SIOCSIFHWBROADCAST":"SIOCSIFHWADDR"); 654aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger close(s); 655aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 656aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 657aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger close(s); 658ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger return 0; 659aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 660aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 661aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 662aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int do_set(int argc, char **argv) 663aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 664aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char *dev = NULL; 665aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 mask = 0; 666aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 flags = 0; 667aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int qlen = -1; 668aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int mtu = -1; 669aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char *newaddr = NULL; 670aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char *newbrd = NULL; 671aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct ifreq ifr0, ifr1; 672aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char *newname = NULL; 673aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int htype, halen; 674aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 675aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger while (argc > 0) { 676aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcmp(*argv, "up") == 0) { 677aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger mask |= IFF_UP; 678aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger flags |= IFF_UP; 679aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "down") == 0) { 680aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger mask |= IFF_UP; 681aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger flags &= ~IFF_UP; 682aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "name") == 0) { 683aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 684aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger newname = *argv; 685aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (matches(*argv, "address") == 0) { 686aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 687aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger newaddr = *argv; 688aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (matches(*argv, "broadcast") == 0 || 689aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strcmp(*argv, "brd") == 0) { 690aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 691aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger newbrd = *argv; 692aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (matches(*argv, "txqueuelen") == 0 || 693aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strcmp(*argv, "qlen") == 0 || 694aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger matches(*argv, "txqlen") == 0) { 695aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 696aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (qlen != -1) 697aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger duparg("txqueuelen", *argv); 698aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_integer(&qlen, *argv, 0)) 699aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger invarg("Invalid \"txqueuelen\" value\n", *argv); 700aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "mtu") == 0) { 701aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 702aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (mtu != -1) 703aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger duparg("mtu", *argv); 704aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_integer(&mtu, *argv, 0)) 705aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger invarg("Invalid \"mtu\" value\n", *argv); 706aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "multicast") == 0) { 707aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 708aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger mask |= IFF_MULTICAST; 709aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcmp(*argv, "on") == 0) { 710aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger flags |= IFF_MULTICAST; 711aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "off") == 0) { 712aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger flags &= ~IFF_MULTICAST; 713aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else 714aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return on_off("multicast"); 715d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger } else if (strcmp(*argv, "allmulticast") == 0) { 716d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger NEXT_ARG(); 717d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger mask |= IFF_ALLMULTI; 718d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger if (strcmp(*argv, "on") == 0) { 719d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger flags |= IFF_ALLMULTI; 720d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger } else if (strcmp(*argv, "off") == 0) { 721d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger flags &= ~IFF_ALLMULTI; 722d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger } else 723d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger return on_off("allmulticast"); 724d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger } else if (strcmp(*argv, "promisc") == 0) { 725d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger NEXT_ARG(); 726d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger mask |= IFF_PROMISC; 727d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger if (strcmp(*argv, "on") == 0) { 728d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger flags |= IFF_PROMISC; 729d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger } else if (strcmp(*argv, "off") == 0) { 730d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger flags &= ~IFF_PROMISC; 731d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger } else 732d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger return on_off("promisc"); 733d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger } else if (strcmp(*argv, "trailers") == 0) { 734d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger NEXT_ARG(); 735d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger mask |= IFF_NOTRAILERS; 736d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger if (strcmp(*argv, "off") == 0) { 737d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger flags |= IFF_NOTRAILERS; 738d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger } else if (strcmp(*argv, "on") == 0) { 739d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger flags &= ~IFF_NOTRAILERS; 740d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger } else 741d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger return on_off("trailers"); 742aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "arp") == 0) { 743aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 744aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger mask |= IFF_NOARP; 745aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcmp(*argv, "on") == 0) { 746aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger flags &= ~IFF_NOARP; 747aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "off") == 0) { 748aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger flags |= IFF_NOARP; 749aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else 750aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return on_off("noarp"); 751aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#ifdef IFF_DYNAMIC 752aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (matches(*argv, "dynamic") == 0) { 753aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 754aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger mask |= IFF_DYNAMIC; 755aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcmp(*argv, "on") == 0) { 756aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger flags |= IFF_DYNAMIC; 757aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "off") == 0) { 758aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger flags &= ~IFF_DYNAMIC; 759aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else 760aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return on_off("dynamic"); 761aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#endif 762aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else { 763aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcmp(*argv, "dev") == 0) { 764aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 765aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 766aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "help") == 0) 767aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger usage(); 768aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (dev) 769aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger duparg2("dev", *argv); 770aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger dev = *argv; 771aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 772aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger argc--; argv++; 773aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 774aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 775aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (!dev) { 776aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Not enough of information: \"dev\" argument is required.\n"); 777aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger exit(-1); 778aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 779aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 780aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (newaddr || newbrd) { 781aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger halen = get_address(dev, &htype); 782aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (halen < 0) 783aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 784aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (newaddr) { 785aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (parse_address(dev, htype, halen, newaddr, &ifr0) < 0) 786aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 787aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 788aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (newbrd) { 789aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (parse_address(dev, htype, halen, newbrd, &ifr1) < 0) 790ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger return -1; 791aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 792aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 793aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 794aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (newname && strcmp(dev, newname)) { 795ca78b0e7d4042be7f7283d551d433b76da7f312bPatrick McHardy if (strlen(newname) == 0) 796ca78b0e7d4042be7f7283d551d433b76da7f312bPatrick McHardy invarg("\"\" is not a valid device identifier\n", "name"); 797aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (do_changename(dev, newname) < 0) 798aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 799aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger dev = newname; 800aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 801ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger if (qlen != -1) { 802aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (set_qlen(dev, qlen) < 0) 803ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger return -1; 804aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 805ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger if (mtu != -1) { 806aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (set_mtu(dev, mtu) < 0) 807ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger return -1; 808aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 809aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (newaddr || newbrd) { 810aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (newbrd) { 811aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (set_address(&ifr1, 1) < 0) 812ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger return -1; 813aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 814aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (newaddr) { 815aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (set_address(&ifr0, 0) < 0) 816aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 817aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 818aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 819aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (mask) 820aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return do_chflags(dev, flags, mask); 821aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 822aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 8231d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy#endif /* IPLINK_IOCTL_COMPAT */ 824aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 825aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint do_iplink(int argc, char **argv) 826aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 827aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (argc > 0) { 8281d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (iplink_have_newlink()) { 8291d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (matches(*argv, "add") == 0) 8301d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy return iplink_modify(RTM_NEWLINK, 8311d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy NLM_F_CREATE|NLM_F_EXCL, 8321d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy argc-1, argv+1); 8331d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (matches(*argv, "set") == 0 || 8341d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy matches(*argv, "change") == 0) 8351d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy return iplink_modify(RTM_NEWLINK, 0, 8361d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy argc-1, argv+1); 8371d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (matches(*argv, "replace") == 0) 8381d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy return iplink_modify(RTM_NEWLINK, 8391d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy NLM_F_CREATE|NLM_F_REPLACE, 8401d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy argc-1, argv+1); 8411d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (matches(*argv, "delete") == 0) 8421d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy return iplink_modify(RTM_DELLINK, 0, 8431d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy argc-1, argv+1); 8441d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } else { 8451d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy#if IPLINK_IOCTL_COMPAT 8461d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy if (matches(*argv, "set") == 0) 8471d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy return do_set(argc-1, argv+1); 8481d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy#endif 8491d93483985f0aa2d2afc72dde5179ff3f79a0999Patrick McHardy } 850aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "show") == 0 || 851aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger matches(*argv, "lst") == 0 || 852aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger matches(*argv, "list") == 0) 853aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return ipaddr_list_link(argc-1, argv+1); 854aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "help") == 0) 855aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger usage(); 856aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else 857aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return ipaddr_list_link(0, NULL); 858aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 859aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Command \"%s\" is unknown, try \"ip link help\".\n", *argv); 860aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger exit(-1); 861aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 862