1a1fd9364Slogwang /*- 2*22ce4affSfengbojiang * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3*22ce4affSfengbojiang * 4*22ce4affSfengbojiang * Copyright (c) 2010 Maxim Ignatenko <[email protected]> 5*22ce4affSfengbojiang * Copyright (c) 2015 Dmitry Vagin <[email protected]> 6a1fd9364Slogwang * All rights reserved. 7a1fd9364Slogwang * 8a1fd9364Slogwang * Redistribution and use in source and binary forms, with or without 9a1fd9364Slogwang * modification, are permitted provided that the following conditions 10a1fd9364Slogwang * are met: 11a1fd9364Slogwang * 1. Redistributions of source code must retain the above copyright 12a1fd9364Slogwang * notice, this list of conditions and the following disclaimer. 13a1fd9364Slogwang * 2. Redistributions in binary form must reproduce the above copyright 14a1fd9364Slogwang * notice, this list of conditions and the following disclaimer in the 15a1fd9364Slogwang * documentation and/or other materials provided with the distribution. 16a1fd9364Slogwang * 17a1fd9364Slogwang * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18a1fd9364Slogwang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19a1fd9364Slogwang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20a1fd9364Slogwang * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21a1fd9364Slogwang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22a1fd9364Slogwang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23a1fd9364Slogwang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24a1fd9364Slogwang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25a1fd9364Slogwang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26a1fd9364Slogwang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27a1fd9364Slogwang * SUCH DAMAGE. 28a1fd9364Slogwang * 29a1fd9364Slogwang * $FreeBSD$ 30a1fd9364Slogwang */ 31a1fd9364Slogwang 32a1fd9364Slogwang #ifndef _NETGRAPH_NG_PATCH_H_ 33a1fd9364Slogwang #define _NETGRAPH_NG_PATCH_H_ 34a1fd9364Slogwang 35a1fd9364Slogwang /* Node type name. */ 36a1fd9364Slogwang #define NG_PATCH_NODE_TYPE "patch" 37a1fd9364Slogwang 38a1fd9364Slogwang /* Node type cookie. */ 39a1fd9364Slogwang #define NGM_PATCH_COOKIE 1262445509 40a1fd9364Slogwang 41a1fd9364Slogwang /* Hook names */ 42a1fd9364Slogwang #define NG_PATCH_HOOK_IN "in" 43a1fd9364Slogwang #define NG_PATCH_HOOK_OUT "out" 44a1fd9364Slogwang 45*22ce4affSfengbojiang /* Checksum flags */ 46*22ce4affSfengbojiang #define NG_PATCH_CSUM_IPV4 (CSUM_IP|CSUM_TCP|CSUM_UDP|CSUM_SCTP) 47*22ce4affSfengbojiang #define NG_PATCH_CSUM_IPV6 (CSUM_TCP_IPV6|CSUM_UDP_IPV6|CSUM_SCTP_IPV6) 48*22ce4affSfengbojiang 49a1fd9364Slogwang /* Netgraph commands understood by this node type */ 50a1fd9364Slogwang enum { 51a1fd9364Slogwang NGM_PATCH_SETCONFIG = 1, 52a1fd9364Slogwang NGM_PATCH_GETCONFIG, 53a1fd9364Slogwang NGM_PATCH_GET_STATS, 54a1fd9364Slogwang NGM_PATCH_CLR_STATS, 55*22ce4affSfengbojiang NGM_PATCH_GETCLR_STATS, 56*22ce4affSfengbojiang NGM_PATCH_GETDLT, 57*22ce4affSfengbojiang NGM_PATCH_SETDLT 58a1fd9364Slogwang }; 59a1fd9364Slogwang 60a1fd9364Slogwang /* Patching modes */ 61a1fd9364Slogwang enum { 62a1fd9364Slogwang NG_PATCH_MODE_SET = 1, 63a1fd9364Slogwang NG_PATCH_MODE_ADD = 2, 64a1fd9364Slogwang NG_PATCH_MODE_SUB = 3, 65a1fd9364Slogwang NG_PATCH_MODE_MUL = 4, 66a1fd9364Slogwang NG_PATCH_MODE_DIV = 5, 67a1fd9364Slogwang NG_PATCH_MODE_NEG = 6, 68a1fd9364Slogwang NG_PATCH_MODE_AND = 7, 69a1fd9364Slogwang NG_PATCH_MODE_OR = 8, 70a1fd9364Slogwang NG_PATCH_MODE_XOR = 9, 71a1fd9364Slogwang NG_PATCH_MODE_SHL = 10, 72a1fd9364Slogwang NG_PATCH_MODE_SHR = 11 73a1fd9364Slogwang }; 74a1fd9364Slogwang 75*22ce4affSfengbojiang /* Parsing declarations */ 76a1fd9364Slogwang 77*22ce4affSfengbojiang #define NG_PATCH_CONFIG_TYPE { \ 78*22ce4affSfengbojiang { "count", &ng_parse_uint32_type }, \ 79*22ce4affSfengbojiang { "csum_flags", &ng_parse_uint64_type }, \ 80*22ce4affSfengbojiang { "relative_offset", &ng_parse_uint32_type }, \ 81*22ce4affSfengbojiang { "ops", &ng_patch_ops_array_type }, \ 82*22ce4affSfengbojiang { NULL } \ 83*22ce4affSfengbojiang } 84*22ce4affSfengbojiang 85*22ce4affSfengbojiang #define NG_PATCH_OP_TYPE { \ 86a1fd9364Slogwang { "offset", &ng_parse_uint32_type }, \ 87a1fd9364Slogwang { "length", &ng_parse_uint16_type }, \ 88a1fd9364Slogwang { "mode", &ng_parse_uint16_type }, \ 89*22ce4affSfengbojiang { "value", &ng_parse_uint64_type }, \ 90a1fd9364Slogwang { NULL } \ 91a1fd9364Slogwang } 92a1fd9364Slogwang 93*22ce4affSfengbojiang #define NG_PATCH_STATS_TYPE { \ 94*22ce4affSfengbojiang { "Received", &ng_parse_uint64_type }, \ 95*22ce4affSfengbojiang { "Patched", &ng_parse_uint64_type }, \ 96*22ce4affSfengbojiang { "Dropped", &ng_parse_uint64_type }, \ 97*22ce4affSfengbojiang { NULL } \ 98*22ce4affSfengbojiang } 99*22ce4affSfengbojiang 100*22ce4affSfengbojiang union ng_patch_op_val { 101*22ce4affSfengbojiang uint8_t v1; 102*22ce4affSfengbojiang uint16_t v2; 103*22ce4affSfengbojiang uint32_t v4; 104*22ce4affSfengbojiang uint64_t v8; 105*22ce4affSfengbojiang }; 106*22ce4affSfengbojiang 107*22ce4affSfengbojiang struct ng_patch_op { 108*22ce4affSfengbojiang uint32_t offset; 109*22ce4affSfengbojiang uint16_t length; /* 1, 2, 4 or 8 (bytes) */ 110*22ce4affSfengbojiang uint16_t mode; 111*22ce4affSfengbojiang union ng_patch_op_val val; 112*22ce4affSfengbojiang }; 113*22ce4affSfengbojiang 114a1fd9364Slogwang struct ng_patch_config { 115a1fd9364Slogwang uint32_t count; 116*22ce4affSfengbojiang uint64_t csum_flags; 117*22ce4affSfengbojiang uint32_t relative_offset; 118a1fd9364Slogwang struct ng_patch_op ops[]; 119a1fd9364Slogwang }; 120a1fd9364Slogwang 121a1fd9364Slogwang struct ng_patch_stats { 122a1fd9364Slogwang uint64_t received; 123a1fd9364Slogwang uint64_t patched; 124a1fd9364Slogwang uint64_t dropped; 125a1fd9364Slogwang }; 126a1fd9364Slogwang 127*22ce4affSfengbojiang struct ng_patch_vlan_header { 128*22ce4affSfengbojiang u_int16_t tag; 129*22ce4affSfengbojiang u_int16_t etype; 130*22ce4affSfengbojiang }; 131*22ce4affSfengbojiang 132*22ce4affSfengbojiang #define NG_PATCH_CONF_SIZE(count) (sizeof(struct ng_patch_config) + \ 133*22ce4affSfengbojiang (count) * sizeof(struct ng_patch_op)) 134a1fd9364Slogwang 135a1fd9364Slogwang #endif /* _NETGRAPH_NG_PATCH_H_ */ 136