]> 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);
 }
 
                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];
 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));
        }
                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 (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);
 
        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;
 }
 
        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;
 
 #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);
                                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();
                } 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 spoofchk { on | off }
 ] |
 .br
+.B mode
+.IR LINKMODE " |"
+.br
 .B master
 .IR DEVICE
 .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".
 
 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.
 .TP
 .BI alias " NAME"
 give the device a symbolic name for easy reference.