1 /* 2 * Copyright (c) 2016 Fabien Siron <fabien.siron@epita.fr> 3 * Copyright (c) 2017 JingPiao Chen <chenjingpiao@gmail.com> 4 * Copyright (c) 2016-2018 The strace developers. 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, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. The name of the author may not be used to endorse or promote products 16 * derived from this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30 #ifndef STRACE_NLATTR_H 31 #define STRACE_NLATTR_H 32 33 #include "xlat.h" 34 35 struct decode_nla_xlat_opts { 36 const struct xlat *xlat; 37 size_t xlat_size; /* is not needed for XT_NORMAL */ 38 const char *dflt; 39 enum xlat_type xt; 40 enum xlat_style style; 41 const char *prefix; 42 const char *suffix; 43 uint64_t (*process_fn)(uint64_t val); 44 size_t size; 45 }; 46 47 /* 48 * Used for IFLA_LINKINFO decoding. Since there are no other indicators 49 * regarding the nature of data except for previously provided string 50 * in an IFLA_LINKINFO_KIND attribute, we have to store it in order to pass 51 * between calls as an opaque data. 52 */ 53 struct ifla_linkinfo_ctx { 54 char kind[16]; 55 }; 56 57 typedef bool (*nla_decoder_t)(struct tcb *, kernel_ulong_t addr, 58 unsigned int len, const void *opaque_data); 59 60 /** 61 * The case of non-NULL decoders and zero size is handled in a special way: 62 * the zeroth decoder is always called with nla_type being passed as opaque 63 * data. 64 */ 65 extern void 66 decode_nlattr(struct tcb *, 67 kernel_ulong_t addr, 68 unsigned int len, 69 const struct xlat *, 70 const char *dflt, 71 const nla_decoder_t *decoders, 72 unsigned int size, 73 const void *opaque_data); 74 75 #define DECL_NLA(name) \ 76 extern bool \ 77 decode_nla_ ## name(struct tcb *, kernel_ulong_t addr, \ 78 unsigned int len, const void *) \ 79 /* End of DECL_NLA definition. */ 80 81 DECL_NLA(x8); 82 DECL_NLA(x16); 83 DECL_NLA(x32); 84 DECL_NLA(x64); 85 DECL_NLA(u8); 86 DECL_NLA(u16); 87 DECL_NLA(u32); 88 DECL_NLA(u64); 89 DECL_NLA(s8); 90 DECL_NLA(s16); 91 DECL_NLA(s32); 92 DECL_NLA(s64); 93 DECL_NLA(be16); 94 DECL_NLA(be64); 95 DECL_NLA(xval); 96 DECL_NLA(flags); 97 DECL_NLA(str); 98 DECL_NLA(strn); 99 DECL_NLA(fd); 100 DECL_NLA(uid); 101 DECL_NLA(gid); 102 DECL_NLA(ifindex); 103 DECL_NLA(ether_proto); 104 DECL_NLA(ip_proto); 105 DECL_NLA(in_addr); 106 DECL_NLA(in6_addr); 107 DECL_NLA(meminfo); 108 DECL_NLA(rt_class); 109 DECL_NLA(rt_proto); 110 DECL_NLA(tc_stats); 111 112 #endif /* !STRACE_NLATTR_H */ 113