{
    "mode": "man",
    "parameter": "tc-skbmod",
    "section": "8",
    "url": "https://www.chedong.com/phpMan.php/man/tc-skbmod/8/json",
    "generated": "2026-06-17T13:11:47Z",
    "synopsis": "tc ... action skbmod { set SETTABLE | swap SWAPPABLE  | ecn } [ CONTROL ] [ index INDEX ]\nSETTABLE :=  [ dmac DMAC ]  [ smac SMAC ]  [ etype ETYPE ]\nSWAPPABLE := mac\nCONTROL := { reclassify | pipe | drop | shot | continue | pass }",
    "sections": {
        "NAME": {
            "content": "skbmod - user-friendly packet editor action\n",
            "subsections": []
        },
        "SYNOPSIS": {
            "content": "tc ... action skbmod { set SETTABLE | swap SWAPPABLE  | ecn } [ CONTROL ] [ index INDEX ]\n\nSETTABLE :=  [ dmac DMAC ]  [ smac SMAC ]  [ etype ETYPE ]\n\nSWAPPABLE := mac\n\nCONTROL := { reclassify | pipe | drop | shot | continue | pass }\n",
            "subsections": []
        },
        "DESCRIPTION": {
            "content": "The skbmod action is intended as a usability upgrade to the existing pedit action. Instead of\nhaving to manually edit 8-, 16-, or 32-bit chunks of an ethernet header, skbmod  allows  com‐\nplete  substitution of supported elements.  Action must be one of set, swap and ecn.  set and\nswap only affect Ethernet packets, while ecn only affects IP packets.\n",
            "subsections": []
        },
        "OPTIONS": {
            "content": "dmac DMAC\nChange the destination mac to the specified address.\n\nsmac SMAC\nChange the source mac to the specified address.\n\netype ETYPE\nChange the ethertype to the specified value.\n\nmac    Used to swap mac addresses.\n\necn    Used to mark ECN Capable Transport (ECT) IP packets as  Congestion  Encountered  (CE).\nDoes not affect Non ECN-Capable Transport (Non-ECT) packets.\n\nCONTROL\nThe  following  keywords  allow to control how the tree of qdisc, classes, filters and\nactions is further traversed after this action.\n\nreclassify\nRestart with the first filter in the current list.\n\npipe   Continue with the next action attached to the same filter.\n\ndrop\nshot   Drop the packet.\n\ncontinue\nContinue classification with the next filter in line.\n\npass   Finish classification process and return to calling qdisc  for  further  packet\nprocessing. This is the default.\n",
            "subsections": []
        },
        "EXAMPLES": {
            "content": "To start, observe the following filter with a pedit action:\n\ntc filter add dev eth1 parent 1: protocol ip prio 10 \\\nu32 match ip protocol 1 0xff flowid 1:2 \\\naction pedit munge offset -14 u8 set 0x02 \\\nmunge offset -13 u8 set 0x15 \\\nmunge offset -12 u8 set 0x15 \\\nmunge offset -11 u8 set 0x15 \\\nmunge offset -10 u16 set 0x1515 \\\npipe\n\nUsing the skbmod action, this command can be simplified to:\n\ntc filter add dev eth1 parent 1: protocol ip prio 10 \\\nu32 match ip protocol 1 0xff flowid 1:2 \\\naction skbmod set dmac 02:15:15:15:15:15 \\\npipe\n\nComplexity will increase if source mac and ethertype are also being edited as part of the ac‐\ntion. If all three fields are to be changed with skbmod:\n\ntc filter add dev eth5 parent 1: protocol ip prio 10 \\\nu32 match ip protocol 1 0xff flowid 1:2 \\\naction skbmod \\\nset etype 0xBEEF \\\nset dmac 02:12:13:14:15:16 \\\nset smac 02:22:23:24:25:26\n\nTo swap the destination and source mac addresses in the Ethernet header:\n\ntc filter add dev eth3 parent 1: protocol ip prio 10 \\\nu32 match ip protocol 1 0xff flowid 1:2 \\\naction skbmod \\\nswap mac\n\nFinally, to mark the CE codepoint in the IP header for ECN Capable Transport (ECT) packets:\n\ntc filter add dev eth0 parent 1: protocol ip prio 10 \\\nu32 match ip protocol 1 0xff flowid 1:2 \\\naction skbmod \\\necn\n\nOnly one of set, swap and ecn shall be used in a single command.  Trying to use more than one\nof them in a single command is considered undefined behavior; pipe multiple commands together\ninstead.\n\n",
            "subsections": []
        },
        "SEE ALSO": {
            "content": "tc(8), tc-u32(8), tc-pedit(8)\n\n\n\niproute2                                     21 Sep 2016                      skbmod action in tc(8)",
            "subsections": []
        }
    },
    "summary": "skbmod - user-friendly packet editor action",
    "flags": [],
    "examples": [
        "To start, observe the following filter with a pedit action:",
        "tc filter add dev eth1 parent 1: protocol ip prio 10 \\",
        "u32 match ip protocol 1 0xff flowid 1:2 \\",
        "action pedit munge offset -14 u8 set 0x02 \\",
        "munge offset -13 u8 set 0x15 \\",
        "munge offset -12 u8 set 0x15 \\",
        "munge offset -11 u8 set 0x15 \\",
        "munge offset -10 u16 set 0x1515 \\",
        "pipe",
        "Using the skbmod action, this command can be simplified to:",
        "tc filter add dev eth1 parent 1: protocol ip prio 10 \\",
        "u32 match ip protocol 1 0xff flowid 1:2 \\",
        "action skbmod set dmac 02:15:15:15:15:15 \\",
        "pipe",
        "Complexity will increase if source mac and ethertype are also being edited as part of the ac‐",
        "tion. If all three fields are to be changed with skbmod:",
        "tc filter add dev eth5 parent 1: protocol ip prio 10 \\",
        "u32 match ip protocol 1 0xff flowid 1:2 \\",
        "action skbmod \\",
        "set etype 0xBEEF \\",
        "set dmac 02:12:13:14:15:16 \\",
        "set smac 02:22:23:24:25:26",
        "To swap the destination and source mac addresses in the Ethernet header:",
        "tc filter add dev eth3 parent 1: protocol ip prio 10 \\",
        "u32 match ip protocol 1 0xff flowid 1:2 \\",
        "action skbmod \\",
        "swap mac",
        "Finally, to mark the CE codepoint in the IP header for ECN Capable Transport (ECT) packets:",
        "tc filter add dev eth0 parent 1: protocol ip prio 10 \\",
        "u32 match ip protocol 1 0xff flowid 1:2 \\",
        "action skbmod \\",
        "ecn",
        "Only one of set, swap and ecn shall be used in a single command.  Trying to use more than one",
        "of them in a single command is considered undefined behavior; pipe multiple commands together",
        "instead."
    ],
    "see_also": [
        {
            "name": "tc",
            "section": "8",
            "url": "https://www.chedong.com/phpMan.php/man/tc/8/json"
        },
        {
            "name": "tc-u32",
            "section": "8",
            "url": "https://www.chedong.com/phpMan.php/man/tc-u32/8/json"
        },
        {
            "name": "tc-pedit",
            "section": "8",
            "url": "https://www.chedong.com/phpMan.php/man/tc-pedit/8/json"
        },
        {
            "name": "tc",
            "section": "8",
            "url": "https://www.chedong.com/phpMan.php/man/tc/8/json"
        }
    ]
}