1 /*- 2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3 * 4 * Copyright (c) 2006 Vadim Goncharov <vadimnuclight@tpu.ru> 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice unmodified, this list of conditions, and the following 12 * disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * $FreeBSD$ 30 */ 31 32 #ifndef _NETGRAPH_NG_TAG_H_ 33 #define _NETGRAPH_NG_TAG_H_ 34 35 /* Node type name and magic cookie. */ 36 #define NG_TAG_NODE_TYPE "tag" 37 #define NGM_TAG_COOKIE 1149771193 38 39 /* 40 * The types of tag_cookie, tag_len and tag_id in structures below 41 * must be the same as corresponding members m_tag_cookie, m_tag_len 42 * and m_tag_id in struct m_tag (defined in <sys/mbuf.h>). 43 */ 44 45 /* Tag match structure for every (input) hook. */ 46 struct ng_tag_hookin { 47 char thisHook[NG_HOOKSIZ]; /* name of hook */ 48 char ifMatch[NG_HOOKSIZ]; /* match dest hook */ 49 char ifNotMatch[NG_HOOKSIZ]; /* !match dest hook */ 50 uint8_t strip; /* strip tag if found */ 51 uint32_t tag_cookie; /* ABI/Module ID */ 52 uint16_t tag_id; /* tag ID */ 53 uint16_t tag_len; /* length of data */ 54 uint8_t tag_data[0]; /* tag data */ 55 }; 56 57 /* Tag set structure for every (output) hook. */ 58 struct ng_tag_hookout { 59 char thisHook[NG_HOOKSIZ]; /* name of hook */ 60 uint32_t tag_cookie; /* ABI/Module ID */ 61 uint16_t tag_id; /* tag ID */ 62 uint16_t tag_len; /* length of data */ 63 uint8_t tag_data[0]; /* tag data */ 64 }; 65 66 #define NG_TAG_HOOKIN_SIZE(taglen) \ 67 (sizeof(struct ng_tag_hookin) + (taglen)) 68 69 #define NG_TAG_HOOKOUT_SIZE(taglen) \ 70 (sizeof(struct ng_tag_hookout) + (taglen)) 71 72 /* Keep this in sync with the above structures definitions. */ 73 #define NG_TAG_HOOKIN_TYPE_INFO(tdtype) { \ 74 { "thisHook", &ng_parse_hookbuf_type }, \ 75 { "ifMatch", &ng_parse_hookbuf_type }, \ 76 { "ifNotMatch", &ng_parse_hookbuf_type }, \ 77 { "strip", &ng_parse_uint8_type }, \ 78 { "tag_cookie", &ng_parse_uint32_type }, \ 79 { "tag_id", &ng_parse_uint16_type }, \ 80 { "tag_len", &ng_parse_uint16_type }, \ 81 { "tag_data", (tdtype) }, \ 82 { NULL } \ 83 } 84 85 #define NG_TAG_HOOKOUT_TYPE_INFO(tdtype) { \ 86 { "thisHook", &ng_parse_hookbuf_type }, \ 87 { "tag_cookie", &ng_parse_uint32_type }, \ 88 { "tag_id", &ng_parse_uint16_type }, \ 89 { "tag_len", &ng_parse_uint16_type }, \ 90 { "tag_data", (tdtype) }, \ 91 { NULL } \ 92 } 93 94 #ifdef NG_TAG_DEBUG 95 96 /* Statistics structure for one hook. */ 97 struct ng_tag_hookstat { 98 uint64_t recvFrames; 99 uint64_t recvOctets; 100 uint64_t recvMatchFrames; 101 uint64_t recvMatchOctets; 102 uint64_t xmitFrames; 103 uint64_t xmitOctets; 104 }; 105 106 /* Keep this in sync with the above structure definition. */ 107 #define NG_TAG_HOOKSTAT_TYPE_INFO { \ 108 { "recvFrames", &ng_parse_uint64_type }, \ 109 { "recvOctets", &ng_parse_uint64_type }, \ 110 { "recvMatchFrames", &ng_parse_uint64_type }, \ 111 { "recvMatchOctets", &ng_parse_uint64_type }, \ 112 { "xmitFrames", &ng_parse_uint64_type }, \ 113 { "xmitOctets", &ng_parse_uint64_type }, \ 114 { NULL } \ 115 } 116 117 #endif /* NG_TAG_DEBUG */ 118 119 /* Netgraph commands. */ 120 enum { 121 NGM_TAG_SET_HOOKIN = 1, /* supply a struct ng_tag_hookin */ 122 NGM_TAG_GET_HOOKIN, /* returns a struct ng_tag_hookin */ 123 NGM_TAG_SET_HOOKOUT, /* supply a struct ng_tag_hookout */ 124 NGM_TAG_GET_HOOKOUT, /* returns a struct ng_tag_hookout */ 125 #ifdef NG_TAG_DEBUG 126 NGM_TAG_GET_STATS, /* supply name as char[NG_HOOKSIZ] */ 127 NGM_TAG_CLR_STATS, /* supply name as char[NG_HOOKSIZ] */ 128 NGM_TAG_GETCLR_STATS, /* supply name as char[NG_HOOKSIZ] */ 129 #endif 130 }; 131 132 #endif /* _NETGRAPH_NG_TAG_H_ */ 133