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