summaryrefslogtreecommitdiffstats
path: root/src/plugins/http_static
AgeCommit message (Expand)AuthorFilesLines
2021-05-07session: connects seg manager is always firstFlorin Coras1-2/+2
2021-04-22vcl session: refactor passing of crypto contextFlorin Coras1-2/+18
2021-01-07vcl session: switch to generic cert key apisFlorin Coras2-16/+24
2020-12-14misc: move to new pool_foreach macrosDamjan Marion1-3/+3
2020-10-19misc: don't export symbols from pluginsDamjan Marion1-1/+1
2020-07-28http_static: fix session cleanupFlorin Coras1-41/+30
2020-06-16misc: fix sonarclound warningsDave Barach1-1/+1
2020-05-06docs: clean up make docs jobPaul Vinciguerra2-5/+8
2020-04-03session: improve error reportingFlorin Coras1-1/+2
2020-03-12vppinfra: refactor clib_timebase_tDave Barach1-1/+2
2020-02-26api: improve api string safetyJakub Grajciar1-5/+2
2020-02-05vppinfra: numa vector placement supportDave Barach1-2/+4
2020-01-10docs: Edit FEATURE.yaml files so they can be publishedJohn DeNisco1-1/+1
2020-01-02http_static: add FEATURE.yamlDave Barach1-0/+10
2019-10-30http_static: fifo-size is u32Dave Wallace1-0/+5
2019-10-17http_static: pass http request type to builtin handlersDave Barach1-2/+2
2019-10-17http_static: add "http static cache clear" CLIDave Barach1-0/+75
2019-10-09hsa: use crypto_engine_type_t for TLSNathan Skrzypczak1-1/+1
2019-09-27http_static: remove api boilerplateOle Troan5-211/+8
2019-09-16http_static: add dynamic GET / POST method hooksDave Barach2-175/+302
2019-09-03api: enforce vla is last and fixed string typeOle Troan2-12/+6
2019-08-12http_static: fix session expiration timer bugsDave Barach1-33/+52
2019-08-12http_static: debug spew control, session expiration timersDave Barach1-18/+42
2019-08-10http_static: tls supportDave Barach1-100/+356
2019-07-09vat: unload unused vat pluginsDave Barach1-19/+1
2019-06-26api: Remove the inlines file and replace with library functionsNeale Ranns2-2/+0
2019-06-18api: string type to convert to vectorOle Troan2-8/+9
2019-06-12static_http: Typo in short_help.Paul Vinciguerra1-1/+1
2019-05-29plugins: http_static. Migrate to use api string type.Paul Vinciguerra3-11/+23
2019-05-17Fix punctuation fails in 2x pluginsDave Barach1-1/+1
2019-05-03plugins: clean up plugin descriptionsDave Wallace1-1/+1
2019-04-30svm: more fifo refactor/cleanupFlorin Coras1-1/+1
2019-04-25Clean up redirectsDave Barach1-21/+50
2019-04-17VPP-1649: Coverity warning in http serverDave Barach1-6/+0
2019-04-16Static http serverDave Barach8-0/+1954
r */ .highlight .k { color: #008800; font-weight: bold } /* Keyword */ .highlight .ch { color: #888888 } /* Comment.Hashbang */ .highlight .cm { color: #888888 } /* Comment.Multiline */ .highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */ .highlight .cpf { color: #888888 } /* Comment.PreprocFile */ .highlight .c1 { color: #888888 } /* Comment.Single */ .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */ }
/* Hey Emacs use -*- mode: C -*- */
/*
 * Copyright (c) 2016 Cisco and/or its affiliates.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/** \file
    This file defines the vpp control-plane API messages
    used to control the ACL plugin
*/

option version = "1.0.1";

/** \brief Get the plugin version
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
*/

define acl_plugin_get_version
{
  u32 client_index;
  u32 context;
};

/** \brief Reply to get the plugin version
    @param context - returned sender context, to match reply w/ request
    @param major - Incremented every time a known breaking behavior change is introduced
    @param minor - Incremented with small changes, may be used to avoid buggy versions
*/

define acl_plugin_get_version_reply
{
  u32 context;
  u32 major;
  u32 minor;
};

/** \brief Control ping from client to api server request
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
*/
define acl_plugin_control_ping
{
  u32 client_index;
  u32 context;
};

/** \brief Control ping from the client to the server response
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
    @param retval - return code for the request
    @param vpe_pid - the pid of the vpe, returned by the server
*/
define acl_plugin_control_ping_reply
{
  u32 context;
  i32 retval;
  u32 client_index;
  u32 vpe_pid;
};

/** \brief Get Connection table max entries
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
*/

define acl_plugin_get_conn_table_max_entries
{
  u32 client_index;
  u32 context;
};

/** \brief Reply to get connection table max entries
    @param context - sender context, to match reply w/ request
    @param conn_table_max_entries - the value of maximum entries of connection table
*/
define acl_plugin_get_conn_table_max_entries_reply
{
  u32 context;
  u64 conn_table_max_entries;
};

/** \brief Access List Rule entry
    @param is_permit - deny (0), permit (1), or permit+reflect(2) action on this rule.
    @param is_ipv6   - IP addresses in this rule are IPv6 (1) or IPv4 (0)
    @param src_ip_addr - Source prefix value
    @param src_ip_prefix_len - Source prefix length
    @param dst_ip_addr - Destination prefix value
    @param dst_ip_prefix_len - Destination prefix length
    @param proto - L4 protocol (http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml)
    @param srcport_or_icmptype_first - beginning of source port or ICMP4/6 type range
    @param srcport_or_icmptype_last - end of source port or ICMP4/6 type range
    @param dstport_or_icmpcode_first - beginning of destination port or ICMP4/6 code range
    @param dstport_or_icmpcode_last - end of destination port or ICMP4/6 code range
    @param tcp_flags_mask - if proto==6, match masked TCP flags with this value
    @param tcp_flags_value - if proto==6, mask to AND the TCP flags in the packet with
*/

typeonly manual_print define acl_rule
{
  u8 is_permit;
  u8 is_ipv6;
  u8 src_ip_addr[16];
  u8 src_ip_prefix_len;
  u8 dst_ip_addr[16];
  u8 dst_ip_prefix_len;
/*
 * L4 protocol. IANA number. 1 = ICMP, 58 = ICMPv6, 6 = TCP, 17 = UDP.
 * 0 => ignore L4 and ignore the ports/tcpflags when matching.
 */
  u8 proto;
/*
 * If the L4 protocol is TCP or UDP, the below
 * hold ranges of ports, else if the L4 is ICMP/ICMPv6
 * they hold ranges of ICMP(v6) types/codes.
 *
 * Ranges are inclusive, i.e. to match "any" TCP/UDP port,
 * use first=0,last=65535. For ICMP(v6),
 * use first=0,last=255.
 */
  u16 srcport_or_icmptype_first;
  u16 srcport_or_icmptype_last;
  u16 dstport_or_icmpcode_first;
  u16 dstport_or_icmpcode_last;
/*
 * for proto = 6, this matches if the
 * TCP flags in the packet, ANDed with tcp_flags_mask,
 * is equal to tcp_flags_value.
 */
  u8 tcp_flags_mask;
  u8 tcp_flags_value;
};

/** \brief MACIP Access List Rule entry
    @param is_permit - deny (0), permit (1) action on this rule.
    @param is_ipv6   - IP addresses in this rule are IPv6 (1) or IPv4 (0)
    @param src_mac - match masked source MAC address against this value
    @param src_mac_mask - AND source MAC address with this value before matching
    @param src_ip_addr - Source prefix value
    @param src_ip_prefix_len - Source prefix length
*/

typeonly manual_print define macip_acl_rule
{
  u8 is_permit;
  u8 is_ipv6;
/*
 * The source mac of the packet ANDed with src_mac_mask.
 * The source ip[46] address in the packet is matched
 * against src_ip_addr, with src_ip_prefix_len set to 0.
 *
 * For better performance, minimize the number of
 * (src_mac_mask, src_ip_prefix_len) combinations
 * in a MACIP ACL.
 */
  u8 src_mac[6];
  u8 src_mac_mask[6];
  u8 src_ip_addr[16];
  u8 src_ip_prefix_len;
};

/** \brief Replace an existing ACL in-place or create a new ACL
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
    @param acl_index - an existing ACL entry (0..0xfffffffe) to replace, or 0xffffffff to make new ACL
    @param tag - a string value stored along with the ACL, for descriptive purposes
    @param count - number of ACL rules
    @r - Rules for this access-list
*/

manual_print manual_endian define acl_add_replace
{
  u32 client_index;
  u32 context;
  u32 acl_index; /* ~0 to add, existing ACL# to replace */
  u8 tag[64]; /* What gets in here gets out in the corresponding tag field when dumping the ACLs. */
  u32 count;
  vl_api_acl_rule_t r[count];
};

/** \brief Reply to add/replace ACL
    @param context - returned sender context, to match reply w/ request
    @param acl_index - index of the updated or newly created ACL
    @param retval 0 - no error
*/

define acl_add_replace_reply
{
  u32 context;
  u32 acl_index;
  i32 retval;
};

/** \brief Delete an ACL
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
    @param acl_index - ACL index to delete
*/

autoreply manual_print define acl_del
{
  u32 client_index;
  u32 context;
  u32 acl_index;
};

/* acl_interface_add_del(_reply) to be deprecated in lieu of acl_interface_set_acl_list */
/** \brief Use acl_interface_set_acl_list instead
    Append/remove an ACL index to/from the list of ACLs checked for an interface
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
    @param is_add - add or delete the ACL index from the list
    @param is_input - check the ACL on input (1) or output (0)
    @param sw_if_index - the interface to alter the list of ACLs on
    @param acl_index - index of ACL for the operation
*/

autoreply manual_print define acl_interface_add_del
{
  u32 client_index;
  u32 context;
  u8 is_add;
/*
 * is_input = 0 => ACL applied on interface egress
 * is_input = 1 => ACL applied on interface ingress
 */
  u8 is_input;
  u32 sw_if_index;
  u32 acl_index;
};

/** \brief Set the vector of input/output ACLs checked for an interface
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
    @param sw_if_index - the interface to alter the list of ACLs on
    @param count - total number of ACL indices in the vector
    @param n_input - this many first elements correspond to input ACLs, the rest - output
    @param acls - vector of ACL indices
*/

autoreply manual_print define acl_interface_set_acl_list
{
  u32 client_index;
  u32 context;
  u32 sw_if_index;
  u8 count;
  u8 n_input; /* First n_input ACLs are set as a list of input ACLs, the rest are applied as output */
  u32 acls[count];
};

/** \brief Reply to set the ACL list on an interface
    @param context - returned sender context, to match reply w/ request
    @param retval 0 - no error
*/

/** \brief Dump the specific ACL contents or all of the ACLs' contents
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
    @param acl_index - ACL index to dump, ~0 to dump all ACLs
*/

define acl_dump
{
  u32 client_index;
  u32 context;
  u32 acl_index; /* ~0 for all ACLs */
};

/** \brief Details about a single ACL contents
    @param context - returned sender context, to match reply w/ request
    @param acl_index - ACL index whose contents are being sent in this message
    @param tag - Descriptive tag value which was supplied at ACL creation
    @param count - Number of rules in this ACL
    @param r - Array of rules within this ACL
*/

manual_endian manual_print define acl_details
{
  u32 context;
  u32 acl_index;
  u8 tag[64]; /* Same blob that was supplied to us when creating the ACL, one hopes. */
  u32 count;
  vl_api_acl_rule_t r[count];
};

/** \brief Dump the list(s) of ACL applied to specific or all interfaces
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
    @param sw_if_index - interface to dump the ACL list for
*/

define acl_interface_list_dump
{
  u32 client_index;
  u32 context;
  u32 sw_if_index; /* ~0 for all interfaces */
};

/** \brief Details about a single ACL contents
    @param context - returned sender context, to match reply w/ request
    @param sw_if_index - interface for which the list of ACLs is applied
    @param count - total length of acl indices vector
    @param n_input - this many of indices in the beginning are input ACLs, the rest - output
    @param acls - the vector of ACL indices
*/

define acl_interface_list_details
{
  u32 context;
  u32 sw_if_index;
  u8 count;
  u8 n_input;
  u32 acls[count];
};

/** \brief Add a MACIP ACL
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
    @param tag - descriptive value for this MACIP ACL
    @param count - number of rules in this MACIP ACL
    @param r - vector of MACIP ACL rules
*/

manual_endian manual_print define macip_acl_add
{
  u32 client_index;
  u32 context;
  u8 tag[64];
  u32 count;
  vl_api_macip_acl_rule_t r[count];
};

/** \brief Reply to add MACIP ACL
    @param context - returned sender context, to match reply w/ request
    @param acl_index - index of the newly created MACIP ACL
    @param retval 0 - no error
*/

define macip_acl_add_reply
{
  u32 context;
  u32 acl_index;
  i32 retval;
};

/** \brief Add/Replace a MACIP ACL
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
    @param acl_index - an existing MACIP ACL entry (0..0xfffffffe) to replace, or 0xffffffff to make new MACIP ACL
    @param tag - descriptive value for this MACIP ACL
    @param count - number of rules in this MACIP ACL
    @param r - vector of MACIP ACL rules
*/

manual_endian manual_print define macip_acl_add_replace
{
  u32 client_index;
  u32 context;
  u32 acl_index; /* ~0 to add, existing MACIP ACL# to replace */
  u8 tag[64];
  u32 count;
  vl_api_macip_acl_rule_t r[count];
};

/** \brief Reply to add/replace MACIP ACL
    @param context - returned sender context, to match reply w/ request
    @param acl_index - index of the newly created MACIP ACL
    @param retval 0 - no error
*/

define macip_acl_add_replace_reply
{
  u32 context;
  u32 acl_index;
  i32 retval;
};

/** \brief Delete a MACIP ACL
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
    @param acl_index - MACIP ACL index to delete
*/

autoreply manual_print define macip_acl_del
{
  u32 client_index;
  u32 context;
  u32 acl_index;
};

/** \brief Add or delete a MACIP ACL to/from interface
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
    @param is_add - add (1) or delete (0) MACIP ACL from being used on an interface
    @param sw_if_index - interface to apply the action to
    @param acl_index - MACIP ACL index
*/

autoreply manual_print define macip_acl_interface_add_del
{
  u32 client_index;
  u32 context;
  u8 is_add;
  /* MACIP ACLs are always input */
  u32 sw_if_index;
  u32 acl_index;
};

/** \brief Dump one or all defined MACIP ACLs
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
    @param acl_index - MACIP ACL index or ~0 to dump all MACIP ACLs
*/

define macip_acl_dump
{
  u32 client_index;
  u32 context;
  u32 acl_index; /* ~0 for all ACLs */
};

/** \brief Details about one MACIP ACL
    @param context - returned sender context, to match reply w/ request
    @param acl_index - index of this MACIP ACL
    @param tag - descriptive tag which was supplied during the creation
    @param count - length of the vector of MACIP ACL rules
    @param r - rules comprising this MACIP ACL
*/

manual_endian manual_print define macip_acl_details
{
  u32 context;
  u32 acl_index;
  u8 tag[64];
  u32 count;
  vl_api_macip_acl_rule_t r[count];
};

/** \brief Get the vector of MACIP ACL IDs applied to the interfaces
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
*/

define macip_acl_interface_get
{
  u32 client_index;
  u32 context;
};

/** \brief Reply with the vector of MACIP ACLs by sw_if_index
    @param context - returned sender context, to match reply w/ request
    @param count - total number of elements in the vector
    @param acls - the vector of active MACIP ACL indices per sw_if_index
*/

define macip_acl_interface_get_reply
{
  u32 context;
  u32 count;
  u32 acls[count];
};

/** \brief Dump the list(s) of MACIP ACLs applied to specific or all interfaces
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
    @param sw_if_index - interface to dump the MACIP ACL list for
*/

define macip_acl_interface_list_dump
{
  u32 client_index;
  u32 context;
  u32 sw_if_index; /* ~0 for all interfaces */
};

/** \brief Details about a single MACIP ACL contents
    @param context - returned sender context, to match reply w/ request
    @param sw_if_index - interface for which the list of MACIP ACLs is applied
    @param count - total length of acl indices vector
    @param acls - the vector of MACIP ACL indices
*/

define macip_acl_interface_list_details
{
  u32 context;
  u32 sw_if_index;
  u8 count;
  u32 acls[count];
};

/** \brief Set the ethertype whitelists on an interface. Takes effect when applying ACLs on the interface, so must be given prior.
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
    @param sw_if_index - the interface to alter the list of ACLs on
    @param count - total number of whitelisted ethertypes in the vector
    @param n_input - this many first elements correspond to input whitelisted ethertypes, the rest - output
    @param whitelist - vector of whitelisted ethertypes
*/

autoreply manual_print define acl_interface_set_etype_whitelist
{
  u32 client_index;
  u32 context;
  u32 sw_if_index;
  u8 count; /* Total number of ethertypes in the whitelist */
  u8 n_input; /* first n_input ethertypes are input, the rest - output */
  u16 whitelist[count];
};

/** \brief Dump the list(s) of Ethertype whitelists applied to specific or all interfaces
    @param client_index - opaque cookie to identify the sender
    @param context - sender context, to match reply w/ request
    @param sw_if_index - interface to dump the ethertype whitelist for
*/

define acl_interface_etype_whitelist_dump
{
  u32 client_index;
  u32 context;
  u32 sw_if_index; /* ~0 for all interfaces */
};

/** \brief Details about ethertype whitelist on a single interface
    @param context - returned sender context, to match reply w/ request
    @param sw_if_index - interface for which the list of MACIP ACLs is applied
    @param count - total number of whitelisted ethertypes in the vector
    @param n_input - this many first elements correspond to input whitelisted ethertypes, the rest - output
    @param whitelist - vector of whitelisted ethertypes
*/

define acl_interface_etype_whitelist_details
{
  u32 context;
  u32 sw_if_index;
  u8 count;
  u8 n_input; /* first n_input ethertypes are input, the rest - output */
  u16 whitelist[count];
};