]> git.proxmox.com Git - mirror_iproute2.git/blobdiff - ip/iplink.c
Merge branch 'master' into net-next
[mirror_iproute2.git] / ip / iplink.c
index 4c967112460aaeeb4100922af5405c61ed8ebc9e..0ea5547f48c58071022fb1bf39f0e2a63c57346d 100644 (file)
 #define LIBDIR "/usr/lib"
 #endif
 
+#ifndef GSO_MAX_SIZE
+#define GSO_MAX_SIZE           65536
+#endif
+#ifndef GSO_MAX_SEGS
+#define GSO_MAX_SEGS           65535
+#endif
+
+
 static void usage(void) __attribute__((noreturn));
 static int iplink_have_newlink(void);
 
@@ -97,7 +105,8 @@ void iplink_usage(void)
                "                         [ master DEVICE ][ vrf NAME ]\n"
                "                         [ nomaster ]\n"
                "                         [ addrgenmode { eui64 | none | stable_secret | random } ]\n"
-               "                         [ protodown { on | off } ]\n"
+               "                         [ protodown { on | off } ]\n"
+               "                         [ gso_max_size BYTES ] | [ gso_max_segs PACKETS ]\n"
                "\n"
                "       ip link show [ DEVICE | group GROUP ] [up] [master DEV] [vrf NAME] [type TYPE]\n");
 
@@ -113,7 +122,7 @@ void iplink_usage(void)
                        "          bridge | bond | team | ipoib | ip6tnl | ipip | sit | vxlan |\n"
                        "          gre | gretap | erspan | ip6gre | ip6gretap | ip6erspan |\n"
                        "          vti | nlmon | team_slave | bond_slave | ipvlan | geneve |\n"
-                       "          bridge_slave | vrf | macsec }\n");
+                       "          bridge_slave | vrf | macsec | netdevsim }\n");
        }
        exit(-1);
 }
@@ -853,6 +862,26 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req,
                                return on_off("protodown", *argv);
                        addattr8(&req->n, sizeof(*req), IFLA_PROTO_DOWN,
                                 proto_down);
+               } else if (strcmp(*argv, "gso_max_size") == 0) {
+                       unsigned int max_size;
+
+                       NEXT_ARG();
+                       if (get_unsigned(&max_size, *argv, 0) ||
+                           max_size > GSO_MAX_SIZE)
+                               invarg("Invalid \"gso_max_size\" value\n",
+                                      *argv);
+                       addattr32(&req->n, sizeof(*req),
+                                 IFLA_GSO_MAX_SIZE, max_size);
+               } else if (strcmp(*argv, "gso_max_segs") == 0) {
+                       unsigned int max_segs;
+
+                       NEXT_ARG();
+                       if (get_unsigned(&max_segs, *argv, 0) ||
+                           max_segs > GSO_MAX_SEGS)
+                               invarg("Invalid \"gso_max_segs\" value\n",
+                                      *argv);
+                       addattr32(&req->n, sizeof(*req),
+                                 IFLA_GSO_MAX_SEGS, max_segs);
                } else {
                        if (matches(*argv, "help") == 0)
                                usage();