Add ability to set link state with ip

Exposes existing netlink operations to modify link state of devices.
This commit is contained in:
Stephen Hemminger 2012-04-05 15:08:57 -07:00
parent ae5555d334
commit 4f2fdd44b6
4 changed files with 27 additions and 1 deletions

View File

@ -1,3 +1,4 @@
extern int get_operstate(const char *name);
extern int print_linkinfo(const struct sockaddr_nl *who,
struct nlmsghdr *n,
void *arg);

View File

@ -131,6 +131,16 @@ static void print_operstate(FILE *f, __u8 state)
fprintf(f, "state %s ", oper_states[state]);
}
int get_operstate(const char *name)
{
int i;
for (i = 0; i < sizeof(oper_states)/sizeof(oper_states[0]); i++)
if (strcasecmp(name, oper_states[i]) == 0)
return i;
return -1;
}
static void print_queuelen(FILE *f, struct rtattr *tb[IFLA_MAX + 1])
{
int qlen;

View File

@ -433,10 +433,18 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req,
} else if (strcmp(*argv, "mode") == 0) {
int mode;
NEXT_ARG();
mode = get_link_mode(*argv);
mode = get_link_mode(*argv);
if (mode < 0)
invarg("Invalid link mode\n", *argv);
addattr8(&req->n, sizeof(*req), IFLA_LINKMODE, mode);
} else if (strcmp(*argv, "state") == 0) {
int state;
NEXT_ARG();
state = get_operstate(*argv);
if (state < 0)
invarg("Invalid operstate\n", *argv);
addattr8(&req->n, sizeof(*req), IFLA_OPERSTATE, state);
} else {
if (strcmp(*argv, "dev") == 0) {
NEXT_ARG();

View File

@ -103,6 +103,9 @@ ip-link \- network device configuration
.B mode
.IR LINKMODE " |"
.br
.B state
.IR LINKSTATE " |"
.br
.B master
.IR DEVICE
.br
@ -259,6 +262,10 @@ the device will transistion to when it is brought up. Setting
mode changes the behaviour so that device goes into DORMANT state instead
of UP when driver is ready.
.TP
.BI state " LINKSTATE"
allows setting the operational link state. The values (defined in RFC2863)
are: UP, DOWN, TESTING, UNKNOWN, DORMANT, NOTPRESENT, LOWERLAYERDOWN.
.TP
.BI alias " NAME"
give the device a symbolic name for easy reference.