1 /* 2 * Copyright (c) 2016 George V. Neville-Neil 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * Translators and flags for the mbuf structure. FreeBSD specific code. 27 */ 28 29 #pragma D depends_on module kernel 30 31 /* 32 * mbuf flags of global significance and layer crossing. 33 * Those of only protocol/layer specific significance are to be mapped 34 * to M_PROTO[1-12] and cleared at layer handoff boundaries. 35 * NB: Limited to the lower 24 bits. 36 */ 37 38 #pragma D binding "1.6.3" M_EXT 39 inline int M_EXT = 0x00000001; /* has associated external storage */ 40 #pragma D binding "1.6.3" M_PKTHDR 41 inline int M_PKTHDR = 0x00000002; /* start of record */ 42 #pragma D binding "1.6.3" M_EOR 43 inline int M_EOR = 0x00000004; /* end of record */ 44 #pragma D binding "1.6.3" M_RDONLY 45 inline int M_RDONLY = 0x00000008; /* associated data is marked read-only */ 46 #pragma D binding "1.6.3" M_BCAST 47 inline int M_BCAST = 0x00000010; /* send/received as link-level broadcast */ 48 #pragma D binding "1.6.3" M_MCAST 49 inline int M_MCAST = 0x00000020; /* send/received as link-level multicast */ 50 #pragma D binding "1.6.3" M_PROMISC 51 inline int M_PROMISC = 0x00000040; /* packet was not for us */ 52 #pragma D binding "1.6.3" M_VLANTAG 53 inline int M_VLANTAG = 0x00000080; /* ether_vtag is valid */ 54 #pragma D binding "1.13" M_EXTPG 55 inline int M_EXTPG = 0x00000100; /* has array of unmapped pages and TLS */ 56 #pragma D binding "1.6.3" M_NOFREE 57 inline int M_NOFREE = 0x00000200; /* do not free mbuf, embedded in cluster */ 58 #pragma D binding "1.13" M_TSTMP 59 inline int M_TSTMP = 0x00000400; /* rcv_tstmp field is valid */ 60 #pragma D binding "1.13" M_TSTMP_HPREC 61 inline int M_TSTMP_HPREC = 0x00000800; /* rcv_tstmp is high-prec */ 62 #pragma D binding "1.13" M_TSTMP_LRO 63 inline int M_TSTMP_LRO = 0x00001000; /* Time LRO pushed in pkt is valid */ 64 65 #pragma D binding "1.13" M_PROTO1 66 inline int M_PROTO1 = 0x00002000; /* protocol-specific */ 67 #pragma D binding "1.13" M_PROTO2 68 inline int M_PROTO2 = 0x00004000; /* protocol-specific */ 69 #pragma D binding "1.13" M_PROTO3 70 inline int M_PROTO3 = 0x00008000; /* protocol-specific */ 71 #pragma D binding "1.13" M_PROTO4 72 inline int M_PROTO4 = 0x00010000; /* protocol-specific */ 73 #pragma D binding "1.13" M_PROTO5 74 inline int M_PROTO5 = 0x00020000; /* protocol-specific */ 75 #pragma D binding "1.13" M_PROTO6 76 inline int M_PROTO6 = 0x00040000; /* protocol-specific */ 77 #pragma D binding "1.13" M_PROTO7 78 inline int M_PROTO7 = 0x00080000; /* protocol-specific */ 79 #pragma D binding "1.13" M_PROTO8 80 inline int M_PROTO8 = 0x00100000; /* protocol-specific */ 81 #pragma D binding "1.13" M_PROTO9 82 inline int M_PROTO9 = 0x00200000; /* protocol-specific */ 83 #pragma D binding "1.13" M_PROTO10 84 inline int M_PROTO10 = 0x00400000; /* protocol-specific */ 85 #pragma D binding "1.13" M_PROTO11 86 inline int M_PROTO11 = 0x00800000; /* protocol-specific */ 87 88 #pragma D binding "1.13" mbufflags_string 89 inline string mbufflags_string[uint32_t flags] = 90 flags & M_EXT ? "M_EXT" : 91 flags & M_PKTHDR ? "M_PKTHDR" : 92 flags & M_EOR ? "M_EOR" : 93 flags & M_RDONLY ? "M_RDONLY" : 94 flags & M_BCAST ? "M_BCAST" : 95 flags & M_MCAST ? "M_MCAST" : 96 flags & M_PROMISC ? "M_PROMISC" : 97 flags & M_VLANTAG ? "M_VLANTAG" : 98 flags & M_EXTPG ? "M_EXTPG" : 99 flags & M_NOFREE ? "M_NOFREE" : 100 flags & M_TSTMP ? "M_TSTMP" : 101 flags & M_TSTMP_HPREC ? "M_TSTMP_HPREC" : 102 flags & M_TSTMP_LRO ? "M_TSTMP_LRO" : 103 flags & M_PROTO1 ? "M_PROTO1" : 104 flags & M_PROTO2 ? "M_PROTO2" : 105 flags & M_PROTO3 ? "M_PROTO3" : 106 flags & M_PROTO4 ? "M_PROTO4" : 107 flags & M_PROTO5 ? "M_PROTO5" : 108 flags & M_PROTO6 ? "M_PROTO6" : 109 flags & M_PROTO7 ? "M_PROTO7" : 110 flags & M_PROTO8 ? "M_PROTO8" : 111 flags & M_PROTO9 ? "M_PROTO9" : 112 flags & M_PROTO10 ? "M_PROTO10" : 113 flags & M_PROTO11 ? "M_PROTO11" : 114 "none" ; 115 116 typedef struct mbufinfo { 117 uintptr_t mbuf_addr; 118 caddr_t m_data; 119 int32_t m_len; 120 uint8_t m_type; 121 uint32_t m_flags; 122 } mbufinfo_t; 123 124 translator mbufinfo_t < struct mbuf *p > { 125 mbuf_addr = (uintptr_t)p; 126 m_data = p->m_data; 127 m_len = p->m_len; 128 m_type = p->m_type & 0xff000000; 129 m_flags = p->m_type & 0x00ffffff; 130 }; 131