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

Reply via email to