]> rtime.felk.cvut.cz Git - lisovros/iproute2_canprio.git/commitdiff
ip: allow set and display of link mode parameter
authorStephen Hemminger <shemminger@vyatta.com>
Tue, 20 Mar 2012 00:24:43 +0000 (17:24 -0700)
committerStephen Hemminger <shemminger@vyatta.com>
Tue, 20 Mar 2012 00:24:43 +0000 (17:24 -0700)
The kernel supports a link mode attribute (which can be dormant or default).
This attribute is used to control how the link watch engine
handles operstate transistion.

This adds a new parameter to ip link command to allow setting and
displaying the value.
---

ip/ipaddress.c
ip/iplink.c
man/man8/ip-link.8

index 8123da12f7e0a9459e0fdbcbf76b1fb447ecc2be..aea1a8176b5baa207e405a4607c58fccd0ecf459 100644 (file)
@@ -158,6 +158,20 @@ static void print_queuelen(FILE *f, struct rtattr *tb[IFLA_MAX + 1])
                fprintf(f, "qlen %d", qlen);
 }
 
+static const char *link_modes[] = {
+       "DEFAULT", "DORMANT"
+};
+
+static void print_linkmode(FILE *f, struct rtattr *tb)
+{
+       unsigned int mode = rta_getattr_u8(tb);
+
+       if (mode >= sizeof(link_modes) / sizeof(link_modes[0]))
+               fprintf(f, "mode %d ", mode);
+       else
+               fprintf(f, "mode %s ", link_modes[mode]);
+}
+
 static void print_linktype(FILE *fp, struct rtattr *tb)
 {
        struct rtattr *linkinfo[IFLA_INFO_MAX+1];
@@ -398,9 +412,13 @@ int print_linkinfo(const struct sockaddr_nl *who,
                SPRINT_BUF(b1);
                fprintf(fp, "master %s ", ll_idx_n2a(*(int*)RTA_DATA(tb[IFLA_MASTER]), b1));
        }
+
        if (tb[IFLA_OPERSTATE])
                print_operstate(fp, *(__u8 *)RTA_DATA(tb[IFLA_OPERSTATE]));
-               
+
+       if (do_link && tb[IFLA_LINKMODE])
+               print_linkmode(fp, tb[IFLA_LINKMODE]);
+
        if (filter.showqueue)
                print_queuelen(fp, tb);
 
index 8481514b13e6e20d07e4d5de361651f89920ca83..814a92c94d0c3ba8bec8010d7c804ba8c340ec9f 100644 (file)
@@ -132,6 +132,15 @@ struct link_util *get_link_kind(const char *id)
        return l;
 }
 
+int get_link_mode(const char *mode)
+{
+       if (strcmp(mode, "default") == 0)
+               return IF_LINK_MODE_DEFAULT;
+       if (strcmp(mode, "dormant") == 0)
+               return IF_LINK_MODE_DORMANT;
+       return -1;
+}
+
 #if IPLINK_IOCTL_COMPAT
 static int have_rtnl_newlink = -1;
 
@@ -421,6 +430,13 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req,
                                duparg("group", *argv);
                        if (rtnl_group_a2n(group, *argv))
                                invarg("Invalid \"group\" value\n", *argv);
+               } else if (strcmp(*argv, "mode") == 0) {
+                       int mode;
+                       NEXT_ARG();
+                       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, "dev") == 0) {
                                NEXT_ARG();
index 8c635845c4fecb40b329acd7e03a14d3c418f9fc..acc6d2876b24c167c7b3deaf2b8d930c0b4508b8 100644 (file)
@@ -100,6 +100,9 @@ ip-link \- network device configuration
 .B spoofchk { on | off }
 ] |
 .br
+.B mode
+.IR LINKMODE " |"
+.br
 .B master
 .IR DEVICE
 .br
@@ -248,6 +251,14 @@ move the device to the network namespace associated with the process
 move the device to the network namespace associated with name
 .IR "NETNSNAME".
 
+.TP
+.BI mode " LINKMODE"
+allows setting link mode which determines which RFC2863 operational state
+the device will transistion to when it is brought up. Setting
+.I dormant
+mode changes the behaviour so that device goes into DORMANT state instead
+of UP when driver is ready.
+
 .TP
 .BI alias " NAME"
 give the device a symbolic name for easy reference.