Hi,

Kernel version 2.6.15 onwards provides UDP Fragmentation Offload (UFO)
This patch to ethtool provides UFO (UDP Fragmentation Offload) on/off support 
using -K option similar to feature TSO.

To find out whether UFO is enabled or not use 
#ethtool -k eth3
Offload parameters for eth3:
rx-checksumming: on
tx-checksumming: on
scatter-gather: on
tcp segmentation offload: on
udp fragmentation offload: on
#

To turn off UFO use following command.
#ethtool -K eth3 ufo off

To turn off UFO use following command.
#ethtool -K eth3 ufo on


Please review the patch.

Signed-off-by: Ananda Raju <[EMAIL PROTECTED]>
---
diff -uNr ethtool/ethtool-copy.h ethtool_ufo/ethtool-copy.h
--- ethtool/ethtool-copy.h      2006-03-14 02:33:38.000000000 -0800
+++ ethtool_ufo/ethtool-copy.h  2006-03-14 02:24:13.000000000 -0800
@@ -283,6 +283,8 @@
 #define ETHTOOL_GSTATS         0x0000001d /* get NIC-specific statistics */
 #define ETHTOOL_GTSO           0x0000001e /* Get TSO enable (ethtool_value) */
 #define ETHTOOL_STSO           0x0000001f /* Set TSO enable (ethtool_value) */
+#define ETHTOOL_GUFO           0x00000021 /* Get UFO enable (ethtool_value) */
+#define ETHTOOL_SUFO           0x00000022 /* Set UFO enable (ethtool_value) */
 
 /* compatibility with older code */
 #define SPARC_ETH_GSET         ETHTOOL_GSET
diff -uNr ethtool/ethtool.8 ethtool_ufo/ethtool.8
--- ethtool/ethtool.8   2006-03-14 02:33:38.000000000 -0800
+++ ethtool_ufo/ethtool.8       2006-03-14 02:34:54.000000000 -0800
@@ -153,6 +153,7 @@
 .B2 tx on off
 .B2 sg on off
 .B2 tso on off
+.B2 ufo on off
 
 .B ethtool \-p|\-\-blink
 .I ethX
@@ -272,6 +273,9 @@
 .A2 tso on off
 Specify if tcp segmentation offload is enabled.
 .TP
+.A2 ufo on off
+Specify if UDP fragmentation offload is enabled 
+.TP
 .B \-p \-\-identify
 initiates adapter-specific action intended to enable an operator to
 easily identify the adapter by sight.  Typically this involves
diff -uNr ethtool/ethtool.c ethtool_ufo/ethtool.c
--- ethtool/ethtool.c   2006-03-14 02:33:38.000000000 -0800
+++ ethtool_ufo/ethtool.c       2006-03-14 02:24:07.000000000 -0800
@@ -144,7 +144,8 @@
                "               [ rx on|off ]\n"
                "               [ tx on|off ]\n"
                "               [ sg on|off ]\n"
-               "               [ tso on|off ]\n" },
+               "               [ tso on|off ]\n"
+               "               [ ufo on|off ]\n" },
     { "-i", "--driver", MODE_GDRV, "Show driver information" }, 
     { "-d", "--register-dump", MODE_GREGS, "Do a register dump" },
     { "-e", "--eeprom-dump", MODE_GEEPROM, "Do a EEPROM dump",
@@ -189,6 +190,7 @@
 static int off_csum_tx_wanted = -1;
 static int off_sg_wanted = -1;
 static int off_tso_wanted = -1;
+static int off_ufo_wanted = -1;
 
 static struct ethtool_pauseparam epause;
 static int gpause_changed = 0;
@@ -292,6 +294,7 @@
        { "tx", CMDL_BOOL, &off_csum_tx_wanted, NULL },
        { "sg", CMDL_BOOL, &off_sg_wanted, NULL },
        { "tso", CMDL_BOOL, &off_tso_wanted, NULL },
+       { "ufo", CMDL_BOOL, &off_ufo_wanted, NULL },
 };
 
 static struct cmdline_info cmdline_pause[] = {
@@ -1112,17 +1115,19 @@
        return 0;
 }
 
-static int dump_offload (int rx, int tx, int sg, int tso)
+static int dump_offload (int rx, int tx, int sg, int tso, int ufo)
 {
        fprintf(stdout,
                "rx-checksumming: %s\n"
                "tx-checksumming: %s\n"
                "scatter-gather: %s\n"
-               "tcp segmentation offload: %s\n",
+               "tcp segmentation offload: %s\n"
+               "udp fragmentation offload: %s\n",
                rx ? "on" : "off",
                tx ? "on" : "off",
                sg ? "on" : "off",
-               tso ? "on" : "off");
+               tso ? "on" : "off",
+               ufo ? "on" : "off");
 
        return 0;
 }
@@ -1386,7 +1391,7 @@
 static int do_goffload(int fd, struct ifreq *ifr)
 {
        struct ethtool_value eval;
-       int err, allfail = 1, rx = 0, tx = 0, sg = 0, tso = 0;
+       int err, allfail = 1, rx = 0, tx = 0, sg = 0, tso = 0, ufo = 0;
 
        fprintf(stdout, "Offload parameters for %s:\n", devname);
 
@@ -1430,12 +1435,22 @@
                allfail = 0;
        }
 
+       eval.cmd = ETHTOOL_GUFO;
+       ifr->ifr_data = (caddr_t)&eval;
+       err = ioctl(fd, SIOCETHTOOL, ifr);
+       if (err)
+               perror("Cannot get device udp large send offload settings");
+       else {
+               ufo = eval.data;
+               allfail = 0;
+       }
+
        if (allfail) {
                fprintf(stdout, "no offload info available\n");
                return 83;
        }
 
-       return dump_offload(rx, tx, sg, tso);
+       return dump_offload(rx, tx, sg, tso, ufo);
 }
 
 static int do_soffload(int fd, struct ifreq *ifr)
@@ -1490,6 +1505,17 @@
                        return 88;
                }
        }
+       if (off_ufo_wanted >= 0) {
+               changed = 1;
+               eval.cmd = ETHTOOL_SUFO;
+               eval.data = (off_ufo_wanted == 1);
+               ifr->ifr_data = (caddr_t)&eval;
+               err = ioctl(fd, SIOCETHTOOL, ifr);
+               if (err) {
+                       perror("Cannot set device udp large send offload 
settings");
+                       return 89;
+               }
+       }
        if (!changed) {
                fprintf(stdout, "no offload settings changed\n");
        }

-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to