Define a way to specify that a flow's action is to be used for Wake-on-LAN purposes (using -2 as an action value) and define a new Wake-on-LAN flag: 'f' which enables the Ethernet adapter for Wake-on-LAN using filters.
Signed-off-by: Florian Fainelli <f.faine...@gmail.com> --- ethtool-copy.h | 2 ++ ethtool.8.in | 4 +++- ethtool.c | 7 ++++++- rxclass.c | 8 +++++--- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/ethtool-copy.h b/ethtool-copy.h index 8cc61e9ab40b..943af3882aa1 100644 --- a/ethtool-copy.h +++ b/ethtool-copy.h @@ -1628,6 +1628,7 @@ static __inline__ int ethtool_validate_duplex(__u8 duplex) #define WAKE_ARP (1 << 4) #define WAKE_MAGIC (1 << 5) #define WAKE_MAGICSECURE (1 << 6) /* only meaningful if WAKE_MAGIC */ +#define WAKE_FILTER (1 << 7) /* L2-L4 network traffic flow types */ #define TCP_V4_FLOW 0x01 /* hash or spec (tcp_ip4_spec) */ @@ -1665,6 +1666,7 @@ static __inline__ int ethtool_validate_duplex(__u8 duplex) #define RXH_DISCARD (1 << 31) #define RX_CLS_FLOW_DISC 0xffffffffffffffffULL +#define RX_CLS_FLOW_WAKE 0xfffffffffffffffeULL /* Special RX classification rule insert location values */ #define RX_CLS_LOC_SPECIAL 0x80000000 /* flag */ diff --git a/ethtool.8.in b/ethtool.8.in index 0a366aa536ae..61923eed7c27 100644 --- a/ethtool.8.in +++ b/ethtool.8.in @@ -58,7 +58,7 @@ .\" .\" \(*WO - wol flags .\" -.ds WO \fBp\fP|\fBu\fP|\fBm\fP|\fBb\fP|\fBa\fP|\fBg\fP|\fBs\fP|\fBd\fP... +.ds WO \fBp\fP|\fBu\fP|\fBm\fP|\fBb\fP|\fBa\fP|\fBg\fP|\fBs\fP|\fBd|\fBf\fP... .\" .\" \(*FL - flow type values .\" @@ -679,6 +679,7 @@ b Wake on broadcast messages a Wake on ARP g Wake on MagicPacket\[tm] s Enable SecureOn\[tm] password for MagicPacket\[tm] +f Wake on filter(s) d T{ Disable (wake on nothing). This option clears all previous options. T} @@ -870,6 +871,7 @@ Specifies the Rx queue to send packets to, or some other action. nokeep; lB l. -1 Drop the matched flow +-2 Use the matched flow as a Wake-on-LAN filter 0 or higher Rx queue to route the flow .TE .TP diff --git a/ethtool.c b/ethtool.c index fb93ae898312..5e91ef9cecdb 100644 --- a/ethtool.c +++ b/ethtool.c @@ -931,6 +931,9 @@ static int parse_wolopts(char *optstr, u32 *data) case 's': *data |= WAKE_MAGICSECURE; break; + case 'f': + *data |= WAKE_FILTER; + break; case 'd': *data = 0; break; @@ -964,6 +967,8 @@ static char *unparse_wolopts(int wolopts) *p++ = 'g'; if (wolopts & WAKE_MAGICSECURE) *p++ = 's'; + if (wolopts & WAKE_FILTER) + *p++ = 'f'; } else { *p = 'd'; } @@ -4224,7 +4229,7 @@ static int flow_spec_to_ntuple(struct ethtool_rx_flow_spec *fsp, return -1; /* verify ring cookie can transfer to action */ - if (fsp->ring_cookie > INT_MAX && fsp->ring_cookie < (u64)(-2)) + if (fsp->ring_cookie > INT_MAX && fsp->ring_cookie < (u64)(-3)) return -1; /* verify only one field is setting data field */ diff --git a/rxclass.c b/rxclass.c index 42d122d1ed86..79972651e706 100644 --- a/rxclass.c +++ b/rxclass.c @@ -251,7 +251,11 @@ static void rxclass_print_nfc_rule(struct ethtool_rx_flow_spec *fsp, if (fsp->flow_type & FLOW_RSS) fprintf(stdout, "\tRSS Context ID: %u\n", rss_context); - if (fsp->ring_cookie != RX_CLS_FLOW_DISC) { + if (fsp->ring_cookie == RX_CLS_FLOW_DISC) { + fprintf(stdout, "\tAction: Drop\n"); + } else if (fsp->ring_cookie == RX_CLS_FLOW_WAKE) { + fprintf(stdout, "\tAction: Wake-on-LAN\n"); + } else { u64 vf = ethtool_get_flow_spec_ring_vf(fsp->ring_cookie); u64 queue = ethtool_get_flow_spec_ring(fsp->ring_cookie); @@ -266,8 +270,6 @@ static void rxclass_print_nfc_rule(struct ethtool_rx_flow_spec *fsp, else fprintf(stdout, "\tAction: Direct to queue %llu\n", queue); - } else { - fprintf(stdout, "\tAction: Drop\n"); } fprintf(stdout, "\n"); -- 2.17.1