iplink: allow configuring GSO max values

This allows sending GSO maximum values when configuring a device.
The values are advisory. Most devices will ignore them but for some
pseudo devices such as veth pairs they can be set.

Example:
	# ip link add dev vm1 type veth peer name vm2 gso_max_size 32768

Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com>
This commit is contained in:
Stephen Hemminger 2017-12-01 11:52:34 -08:00
parent 5c6e3478ac
commit c2db423f7c
2 changed files with 31 additions and 1 deletions

View File

@ -97,7 +97,8 @@ void iplink_usage(void)
" [ master DEVICE ][ vrf NAME ]\n" " [ master DEVICE ][ vrf NAME ]\n"
" [ nomaster ]\n" " [ nomaster ]\n"
" [ addrgenmode { eui64 | none | stable_secret | random } ]\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" "\n"
" ip link show [ DEVICE | group GROUP ] [up] [master DEV] [vrf NAME] [type TYPE]\n"); " ip link show [ DEVICE | group GROUP ] [up] [master DEV] [vrf NAME] [type TYPE]\n");
@ -848,6 +849,22 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req,
return on_off("protodown", *argv); return on_off("protodown", *argv);
addattr8(&req->n, sizeof(*req), IFLA_PROTO_DOWN, addattr8(&req->n, sizeof(*req), IFLA_PROTO_DOWN,
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 > UINT16_MAX)
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 > UINT16_MAX)
invarg("Invalid \"gso_max_segs\" value\n",
*argv);
addattr32(&req->n, sizeof(*req), IFLA_GSO_MAX_SEGS, max_segs);
} else { } else {
if (matches(*argv, "help") == 0) if (matches(*argv, "help") == 0)
usage(); usage();

View File

@ -36,6 +36,11 @@ ip-link \- network device configuration
.RB "[ " numrxqueues .RB "[ " numrxqueues
.IR QUEUE_COUNT " ]" .IR QUEUE_COUNT " ]"
.br .br
.BR "[" gso_max_size
.IR BYTES " ]"
.RB "[ " gso_max_segs
.IR SEGMENTS " ]"
.br
.BI type " TYPE" .BI type " TYPE"
.RI "[ " ARGS " ]" .RI "[ " ARGS " ]"
@ -342,6 +347,14 @@ specifies the number of transmit queues for new device.
.BI numrxqueues " QUEUE_COUNT " .BI numrxqueues " QUEUE_COUNT "
specifies the number of receive queues for new device. specifies the number of receive queues for new device.
.TP
.BI gso_max_size " BYTES "
specifies the recommended maximum size of a Generic Segment Offload packet the new device should accept.
.TP
.BI gso_max_segs " SEGMENTS "
specifies the recommended maximum number of a Generic Segment Offload segments the new device should accept.
.TP .TP
.BI index " IDX " .BI index " IDX "
specifies the desired index of the new virtual device. The link creation fails, if the index is busy. specifies the desired index of the new virtual device. The link creation fails, if the index is busy.