Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/818162/?format=api
{ "id": 818162, "url": "http://patchwork.ozlabs.org/api/patches/818162/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/1506335021-32024-4-git-send-email-simon.horman@netronome.com/", "project": { "id": 7, "url": "http://patchwork.ozlabs.org/api/projects/7/?format=api", "name": "Linux network development", "link_name": "netdev", "list_id": "netdev.vger.kernel.org", "list_email": "netdev@vger.kernel.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<1506335021-32024-4-git-send-email-simon.horman@netronome.com>", "list_archive_url": null, "date": "2017-09-25T10:23:37", "name": "[net-next,3/7] nfp: compile flower vxlan tunnel set actions", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": true, "hash": "2c8daa036ba2a8dff8cebd57c7772e13ab86c367", "submitter": { "id": 64714, "url": "http://patchwork.ozlabs.org/api/people/64714/?format=api", "name": "Simon Horman", "email": "simon.horman@netronome.com" }, "delegate": { "id": 34, "url": "http://patchwork.ozlabs.org/api/users/34/?format=api", "username": "davem", "first_name": "David", "last_name": "Miller", "email": "davem@davemloft.net" }, "mbox": "http://patchwork.ozlabs.org/project/netdev/patch/1506335021-32024-4-git-send-email-simon.horman@netronome.com/mbox/", "series": [ { "id": 4932, "url": "http://patchwork.ozlabs.org/api/series/4932/?format=api", "web_url": "http://patchwork.ozlabs.org/project/netdev/list/?series=4932", "date": "2017-09-25T10:23:34", "name": "nfp: flower vxlan tunnel offload", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/4932/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/818162/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/818162/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<netdev-owner@vger.kernel.org>", "X-Original-To": "patchwork-incoming@ozlabs.org", "Delivered-To": "patchwork-incoming@ozlabs.org", "Authentication-Results": [ "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)", "ozlabs.org; dkim=pass (2048-bit key;\n\tunprotected) header.d=netronome-com.20150623.gappssmtp.com\n\theader.i=@netronome-com.20150623.gappssmtp.com\n\theader.b=\"JaWohMft\"; dkim-atps=neutral" ], "Received": [ "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3y10Ym1k8qz9tXF\n\tfor <patchwork-incoming@ozlabs.org>;\n\tMon, 25 Sep 2017 20:24:12 +1000 (AEST)", "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S934407AbdIYKYI (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tMon, 25 Sep 2017 06:24:08 -0400", "from mail-wm0-f50.google.com ([74.125.82.50]:47785 \"EHLO\n\tmail-wm0-f50.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S934151AbdIYKYE (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Mon, 25 Sep 2017 06:24:04 -0400", "by mail-wm0-f50.google.com with SMTP id r136so17961525wmf.2\n\tfor <netdev@vger.kernel.org>; Mon, 25 Sep 2017 03:24:03 -0700 (PDT)", "from penelope.horms.nl ([217.111.208.18])\n\tby smtp.gmail.com with ESMTPSA id\n\t10sm6816818wrt.59.2017.09.25.03.24.01\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);\n\tMon, 25 Sep 2017 03:24:02 -0700 (PDT)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=netronome-com.20150623.gappssmtp.com; s=20150623;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=Lr7GfNiTFm1iFSxS4LE1V8R9+KSDZRm3RirACpUiJn0=;\n\tb=JaWohMftIcu4xHyXqV3TfSBLZziisxOv9mlkLaqJQ7EnQWvhuOvowg6wxLLdeJi/Ss\n\teOOsaDe/QIAtjAE7m7Es2hwY4Dz3yCR+H1Py6B2DJBz8sjMUJvYmm+IubT+KIeKohOYW\n\tuGDRXYsWRk/G0hdZTN6/aBlWKKt0WAgw/WFDEROPvxuvx3kVFO0F4Y2AXnK0aezZb65c\n\tTqHDyatsk8Qu/dunUgqWt0crtY2KCtCcgfqeR0W70HkgPFTg6nJtDuzcPg8AuY/Nq2nf\n\tZx41BUXQhrKmojAERGSzcZKaWGs2B2a/Ln3WymcQgOOZCN+9P9hgwlFSX7r0iBre6Aoq\n\tpE5A==", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=Lr7GfNiTFm1iFSxS4LE1V8R9+KSDZRm3RirACpUiJn0=;\n\tb=Mto3T9YhTakXaJsxniE/m/mLwMVv8EI0WUzrQg203Em1maepgTozdHEeEr94pv0tb7\n\tG9gi/16F0E5OuaqodphJyWXgEIPsevosdDvTzPUxpWYnMAPEh0CYyoA+RNKGyxi+xS9a\n\tWYoYY0DX9O2m1GiUQpRMGd2nhJW+qxiKub795NYV/764NoPzjY9YmTZgnh+wY7rGmyik\n\t06LWV2B+DU4L4lJea6kyrmNuUBXRfU6dtjWkyqXFnKs6EHthQH6/hJzjKiL5+t6BTbQ0\n\tVbhs0+ZxbtcJB0chqU6ryUYaUUr9s/ENxumcFfemNuEcBw+YRN9qUX2Z5dh4tQnVRN/v\n\tfjVA==", "X-Gm-Message-State": "AHPjjUixm+12XXTJo5AzQhrpJZFBB7lVG8PT7R1WaVPR9FWqIZc6RNzF\n\tWWnsf47hEvG0Wcfl9JdtjCiP6A==", "X-Google-Smtp-Source": "AOwi7QDZ/xrDEvQ8lcxNmdE3K8kPRir0O+gHO+azaWEIVTDO6ldoQF2+ZctwclnfsGJ+frMPTSILNA==", "X-Received": "by 10.28.55.209 with SMTP id e200mr33427wma.72.1506335042713;\n\tMon, 25 Sep 2017 03:24:02 -0700 (PDT)", "From": "Simon Horman <simon.horman@netronome.com>", "To": "David Miller <davem@davemloft.net>,\n\tJakub Kicinski <jakub.kicinski@netronome.com>", "Cc": "netdev@vger.kernel.org, oss-drivers@netronome.com,\n\tJohn Hurley <john.hurley@netronome.com>,\n\tSimon Horman <simon.horman@netronome.com>", "Subject": "[PATCH net-next 3/7] nfp: compile flower vxlan tunnel set actions", "Date": "Mon, 25 Sep 2017 12:23:37 +0200", "Message-Id": "<1506335021-32024-4-git-send-email-simon.horman@netronome.com>", "X-Mailer": "git-send-email 2.1.4", "In-Reply-To": "<1506335021-32024-1-git-send-email-simon.horman@netronome.com>", "References": "<1506335021-32024-1-git-send-email-simon.horman@netronome.com>", "Sender": "netdev-owner@vger.kernel.org", "Precedence": "bulk", "List-ID": "<netdev.vger.kernel.org>", "X-Mailing-List": "netdev@vger.kernel.org" }, "content": "From: John Hurley <john.hurley@netronome.com>\n\nCompile set tunnel actions for tc flower. Only support VXLAN and ensure a\ntunnel destination port of 4789 is used.\n\nSigned-off-by: John Hurley <john.hurley@netronome.com>\nSigned-off-by: Simon Horman <simon.horman@netronome.com>\n---\n drivers/net/ethernet/netronome/nfp/flower/action.c | 169 ++++++++++++++++++---\n drivers/net/ethernet/netronome/nfp/flower/cmsg.h | 31 +++-\n 2 files changed, 179 insertions(+), 21 deletions(-)", "diff": "diff --git a/drivers/net/ethernet/netronome/nfp/flower/action.c b/drivers/net/ethernet/netronome/nfp/flower/action.c\nindex db9750695dc7..38f3835ae176 100644\n--- a/drivers/net/ethernet/netronome/nfp/flower/action.c\n+++ b/drivers/net/ethernet/netronome/nfp/flower/action.c\n@@ -37,6 +37,7 @@\n #include <net/tc_act/tc_gact.h>\n #include <net/tc_act/tc_mirred.h>\n #include <net/tc_act/tc_vlan.h>\n+#include <net/tc_act/tc_tunnel_key.h>\n \n #include \"cmsg.h\"\n #include \"main.h\"\n@@ -80,14 +81,27 @@ nfp_fl_push_vlan(struct nfp_fl_push_vlan *push_vlan,\n \tpush_vlan->vlan_tci = cpu_to_be16(tmp_push_vlan_tci);\n }\n \n+static bool nfp_fl_netdev_is_tunnel_type(struct net_device *out_dev,\n+\t\t\t\t\t enum nfp_flower_tun_type tun_type)\n+{\n+\tif (!out_dev->rtnl_link_ops)\n+\t\treturn false;\n+\n+\tif (!strcmp(out_dev->rtnl_link_ops->kind, \"vxlan\"))\n+\t\treturn tun_type == NFP_FL_TUNNEL_VXLAN;\n+\n+\treturn false;\n+}\n+\n static int\n nfp_fl_output(struct nfp_fl_output *output, const struct tc_action *action,\n \t struct nfp_fl_payload *nfp_flow, bool last,\n-\t struct net_device *in_dev)\n+\t struct net_device *in_dev, enum nfp_flower_tun_type tun_type,\n+\t int *tun_out_cnt)\n {\n \tsize_t act_size = sizeof(struct nfp_fl_output);\n+\tu16 tmp_output_op, tmp_flags;\n \tstruct net_device *out_dev;\n-\tu16 tmp_output_op;\n \tint ifindex;\n \n \t/* Set action opcode to output action. */\n@@ -97,25 +111,114 @@ nfp_fl_output(struct nfp_fl_output *output, const struct tc_action *action,\n \n \toutput->a_op = cpu_to_be16(tmp_output_op);\n \n-\t/* Set action output parameters. */\n-\toutput->flags = cpu_to_be16(last ? NFP_FL_OUT_FLAGS_LAST : 0);\n-\n \tifindex = tcf_mirred_ifindex(action);\n \tout_dev = __dev_get_by_index(dev_net(in_dev), ifindex);\n \tif (!out_dev)\n \t\treturn -EOPNOTSUPP;\n \n-\t/* Only offload egress ports are on the same device as the ingress\n-\t * port.\n+\ttmp_flags = last ? NFP_FL_OUT_FLAGS_LAST : 0;\n+\n+\tif (tun_type) {\n+\t\t/* Verify the egress netdev matches the tunnel type. */\n+\t\tif (!nfp_fl_netdev_is_tunnel_type(out_dev, tun_type))\n+\t\t\treturn -EOPNOTSUPP;\n+\n+\t\tif (*tun_out_cnt)\n+\t\t\treturn -EOPNOTSUPP;\n+\t\t(*tun_out_cnt)++;\n+\n+\t\toutput->flags = cpu_to_be16(tmp_flags |\n+\t\t\t\t\t NFP_FL_OUT_FLAGS_USE_TUN);\n+\t\toutput->port = cpu_to_be32(NFP_FL_PORT_TYPE_TUN | tun_type);\n+\t} else {\n+\t\t/* Set action output parameters. */\n+\t\toutput->flags = cpu_to_be16(tmp_flags);\n+\n+\t\t/* Only offload if egress ports are on the same device as the\n+\t\t * ingress port.\n+\t\t */\n+\t\tif (!switchdev_port_same_parent_id(in_dev, out_dev))\n+\t\t\treturn -EOPNOTSUPP;\n+\n+\t\toutput->port = cpu_to_be32(nfp_repr_get_port_id(out_dev));\n+\t\tif (!output->port)\n+\t\t\treturn -EOPNOTSUPP;\n+\t}\n+\tnfp_flow->meta.shortcut = output->port;\n+\n+\treturn 0;\n+}\n+\n+static bool nfp_fl_supported_tun_port(const struct tc_action *action)\n+{\n+\tstruct ip_tunnel_info *tun = tcf_tunnel_info(action);\n+\n+\treturn tun->key.tp_dst == htons(NFP_FL_VXLAN_PORT);\n+}\n+\n+static struct nfp_fl_pre_tunnel *nfp_fl_pre_tunnel(char *act_data, int act_len)\n+{\n+\tsize_t act_size = sizeof(struct nfp_fl_pre_tunnel);\n+\tstruct nfp_fl_pre_tunnel *pre_tun_act;\n+\tu16 tmp_pre_tun_op;\n+\n+\t/* Pre_tunnel action must be first on action list.\n+\t * If other actions already exist they need pushed forward.\n \t */\n-\tif (!switchdev_port_same_parent_id(in_dev, out_dev))\n-\t\treturn -EOPNOTSUPP;\n+\tif (act_len)\n+\t\tmemmove(act_data + act_size, act_data, act_len);\n+\n+\tpre_tun_act = (struct nfp_fl_pre_tunnel *)act_data;\n+\n+\tmemset(pre_tun_act, 0, act_size);\n+\n+\ttmp_pre_tun_op =\n+\t\tFIELD_PREP(NFP_FL_ACT_LEN_LW, act_size >> NFP_FL_LW_SIZ) |\n+\t\tFIELD_PREP(NFP_FL_ACT_JMP_ID, NFP_FL_ACTION_OPCODE_PRE_TUNNEL);\n+\n+\tpre_tun_act->a_op = cpu_to_be16(tmp_pre_tun_op);\n \n-\toutput->port = cpu_to_be32(nfp_repr_get_port_id(out_dev));\n-\tif (!output->port)\n+\treturn pre_tun_act;\n+}\n+\n+static int\n+nfp_fl_set_vxlan(struct nfp_fl_set_vxlan *set_vxlan,\n+\t\t const struct tc_action *action,\n+\t\t struct nfp_fl_pre_tunnel *pre_tun)\n+{\n+\tstruct ip_tunnel_info *vxlan = tcf_tunnel_info(action);\n+\tsize_t act_size = sizeof(struct nfp_fl_set_vxlan);\n+\tu32 tmp_set_vxlan_type_index = 0;\n+\tu16 tmp_set_vxlan_op;\n+\t/* Currently support one pre-tunnel so index is always 0. */\n+\tint pretun_idx = 0;\n+\n+\tif (vxlan->options_len) {\n+\t\t/* Do not support options e.g. vxlan gpe. */\n \t\treturn -EOPNOTSUPP;\n+\t}\n \n-\tnfp_flow->meta.shortcut = output->port;\n+\ttmp_set_vxlan_op =\n+\t\tFIELD_PREP(NFP_FL_ACT_LEN_LW, act_size >> NFP_FL_LW_SIZ) |\n+\t\tFIELD_PREP(NFP_FL_ACT_JMP_ID,\n+\t\t\t NFP_FL_ACTION_OPCODE_SET_IPV4_TUNNEL);\n+\n+\tset_vxlan->a_op = cpu_to_be16(tmp_set_vxlan_op);\n+\n+\t/* Set tunnel type and pre-tunnel index. */\n+\ttmp_set_vxlan_type_index |=\n+\t\tFIELD_PREP(NFP_FL_IPV4_TUNNEL_TYPE, NFP_FL_TUNNEL_VXLAN) |\n+\t\tFIELD_PREP(NFP_FL_IPV4_PRE_TUN_INDEX, pretun_idx);\n+\n+\tset_vxlan->tun_type_index = cpu_to_be32(tmp_set_vxlan_type_index);\n+\n+\tset_vxlan->tun_id = vxlan->key.tun_id;\n+\tset_vxlan->tun_flags = vxlan->key.tun_flags;\n+\tset_vxlan->ipv4_ttl = vxlan->key.ttl;\n+\tset_vxlan->ipv4_tos = vxlan->key.tos;\n+\n+\t/* Complete pre_tunnel action. */\n+\tpre_tun->ipv4_dst = vxlan->key.u.ipv4.dst;\n \n \treturn 0;\n }\n@@ -123,8 +226,11 @@ nfp_fl_output(struct nfp_fl_output *output, const struct tc_action *action,\n static int\n nfp_flower_loop_action(const struct tc_action *a,\n \t\t struct nfp_fl_payload *nfp_fl, int *a_len,\n-\t\t struct net_device *netdev)\n+\t\t struct net_device *netdev,\n+\t\t enum nfp_flower_tun_type *tun_type, int *tun_out_cnt)\n {\n+\tstruct nfp_fl_pre_tunnel *pre_tun;\n+\tstruct nfp_fl_set_vxlan *s_vxl;\n \tstruct nfp_fl_push_vlan *psh_v;\n \tstruct nfp_fl_pop_vlan *pop_v;\n \tstruct nfp_fl_output *output;\n@@ -137,7 +243,8 @@ nfp_flower_loop_action(const struct tc_action *a,\n \t\t\treturn -EOPNOTSUPP;\n \n \t\toutput = (struct nfp_fl_output *)&nfp_fl->action_data[*a_len];\n-\t\terr = nfp_fl_output(output, a, nfp_fl, true, netdev);\n+\t\terr = nfp_fl_output(output, a, nfp_fl, true, netdev, *tun_type,\n+\t\t\t\t tun_out_cnt);\n \t\tif (err)\n \t\t\treturn err;\n \n@@ -147,7 +254,8 @@ nfp_flower_loop_action(const struct tc_action *a,\n \t\t\treturn -EOPNOTSUPP;\n \n \t\toutput = (struct nfp_fl_output *)&nfp_fl->action_data[*a_len];\n-\t\terr = nfp_fl_output(output, a, nfp_fl, false, netdev);\n+\t\terr = nfp_fl_output(output, a, nfp_fl, false, netdev, *tun_type,\n+\t\t\t\t tun_out_cnt);\n \t\tif (err)\n \t\t\treturn err;\n \n@@ -170,6 +278,29 @@ nfp_flower_loop_action(const struct tc_action *a,\n \n \t\tnfp_fl_push_vlan(psh_v, a);\n \t\t*a_len += sizeof(struct nfp_fl_push_vlan);\n+\t} else if (is_tcf_tunnel_set(a) && nfp_fl_supported_tun_port(a)) {\n+\t\t/* Pre-tunnel action is required for tunnel encap.\n+\t\t * This checks for next hop entries on NFP.\n+\t\t * If none, the packet falls back before applying other actions.\n+\t\t */\n+\t\tif (*a_len + sizeof(struct nfp_fl_pre_tunnel) +\n+\t\t sizeof(struct nfp_fl_set_vxlan) > NFP_FL_MAX_A_SIZ)\n+\t\t\treturn -EOPNOTSUPP;\n+\n+\t\t*tun_type = NFP_FL_TUNNEL_VXLAN;\n+\t\tpre_tun = nfp_fl_pre_tunnel(nfp_fl->action_data, *a_len);\n+\t\tnfp_fl->meta.shortcut = cpu_to_be32(NFP_FL_SC_ACT_NULL);\n+\t\t*a_len += sizeof(struct nfp_fl_pre_tunnel);\n+\n+\t\ts_vxl = (struct nfp_fl_set_vxlan *)&nfp_fl->action_data[*a_len];\n+\t\terr = nfp_fl_set_vxlan(s_vxl, a, pre_tun);\n+\t\tif (err)\n+\t\t\treturn err;\n+\n+\t\t*a_len += sizeof(struct nfp_fl_set_vxlan);\n+\t} else if (is_tcf_tunnel_release(a)) {\n+\t\t/* Tunnel decap is handled by default so accept action. */\n+\t\treturn 0;\n \t} else {\n \t\t/* Currently we do not handle any other actions. */\n \t\treturn -EOPNOTSUPP;\n@@ -182,18 +313,22 @@ int nfp_flower_compile_action(struct tc_cls_flower_offload *flow,\n \t\t\t struct net_device *netdev,\n \t\t\t struct nfp_fl_payload *nfp_flow)\n {\n-\tint act_len, act_cnt, err;\n+\tint act_len, act_cnt, err, tun_out_cnt;\n+\tenum nfp_flower_tun_type tun_type;\n \tconst struct tc_action *a;\n \tLIST_HEAD(actions);\n \n \tmemset(nfp_flow->action_data, 0, NFP_FL_MAX_A_SIZ);\n \tnfp_flow->meta.act_len = 0;\n+\ttun_type = NFP_FL_TUNNEL_NONE;\n \tact_len = 0;\n \tact_cnt = 0;\n+\ttun_out_cnt = 0;\n \n \ttcf_exts_to_list(flow->exts, &actions);\n \tlist_for_each_entry(a, &actions, list) {\n-\t\terr = nfp_flower_loop_action(a, nfp_flow, &act_len, netdev);\n+\t\terr = nfp_flower_loop_action(a, nfp_flow, &act_len, netdev,\n+\t\t\t\t\t &tun_type, &tun_out_cnt);\n \t\tif (err)\n \t\t\treturn err;\n \t\tact_cnt++;\ndiff --git a/drivers/net/ethernet/netronome/nfp/flower/cmsg.h b/drivers/net/ethernet/netronome/nfp/flower/cmsg.h\nindex af9165b3b652..ff42ce8a1e9c 100644\n--- a/drivers/net/ethernet/netronome/nfp/flower/cmsg.h\n+++ b/drivers/net/ethernet/netronome/nfp/flower/cmsg.h\n@@ -67,10 +67,12 @@\n #define NFP_FL_LW_SIZ\t\t\t2\n \n /* Action opcodes */\n-#define NFP_FL_ACTION_OPCODE_OUTPUT\t0\n-#define NFP_FL_ACTION_OPCODE_PUSH_VLAN\t1\n-#define NFP_FL_ACTION_OPCODE_POP_VLAN\t2\n-#define NFP_FL_ACTION_OPCODE_NUM\t32\n+#define NFP_FL_ACTION_OPCODE_OUTPUT\t\t0\n+#define NFP_FL_ACTION_OPCODE_PUSH_VLAN\t\t1\n+#define NFP_FL_ACTION_OPCODE_POP_VLAN\t\t2\n+#define NFP_FL_ACTION_OPCODE_SET_IPV4_TUNNEL\t6\n+#define NFP_FL_ACTION_OPCODE_PRE_TUNNEL\t\t17\n+#define NFP_FL_ACTION_OPCODE_NUM\t\t32\n \n #define NFP_FL_ACT_JMP_ID\t\tGENMASK(15, 8)\n #define NFP_FL_ACT_LEN_LW\t\tGENMASK(7, 0)\n@@ -85,6 +87,8 @@\n \n /* Tunnel ports */\n #define NFP_FL_PORT_TYPE_TUN\t\t0x50000000\n+#define NFP_FL_IPV4_TUNNEL_TYPE\t\tGENMASK(7, 4)\n+#define NFP_FL_IPV4_PRE_TUN_INDEX\tGENMASK(2, 0)\n \n enum nfp_flower_tun_type {\n \tNFP_FL_TUNNEL_NONE =\t0,\n@@ -123,6 +127,25 @@ struct nfp_flower_meta_one {\n \tu16 reserved;\n };\n \n+struct nfp_fl_pre_tunnel {\n+\t__be16 a_op;\n+\t__be16 reserved;\n+\t__be32 ipv4_dst;\n+\t/* reserved for use with IPv6 addresses */\n+\t__be32 extra[3];\n+};\n+\n+struct nfp_fl_set_vxlan {\n+\t__be16 a_op;\n+\t__be16 reserved;\n+\t__be64 tun_id;\n+\t__be32 tun_type_index;\n+\t__be16 tun_flags;\n+\tu8 ipv4_ttl;\n+\tu8 ipv4_tos;\n+\t__be32 extra[2];\n+} __packed;\n+\n /* Metadata with L2 (1W/4B)\n * ----------------------------------------------------------------\n * 3 2 1\n", "prefixes": [ "net-next", "3/7" ] }