The Android Open Source Project | 2949f58 | 2009-03-03 19:30:46 -0800 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (c) 1990, 1992, 1993, 1994, 1995, 1996, 1997 |
| 3 | * The Regents of the University of California. All rights reserved. |
| 4 | * |
| 5 | * Redistribution and use in source and binary forms, with or without |
| 6 | * modification, are permitted provided that: (1) source code distributions |
| 7 | * retain the above copyright notice and this paragraph in its entirety, (2) |
| 8 | * distributions including binary code include the above copyright notice and |
| 9 | * this paragraph in its entirety in the documentation or other materials |
| 10 | * provided with the distribution, and (3) all advertising materials mentioning |
| 11 | * features or use of this software display the following acknowledgement: |
| 12 | * ``This product includes software developed by the University of California, |
| 13 | * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of |
| 14 | * the University nor the names of its contributors may be used to endorse |
| 15 | * or promote products derived from this software without specific prior |
| 16 | * written permission. |
| 17 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED |
| 18 | * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF |
| 19 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
The Android Open Source Project | 2949f58 | 2009-03-03 19:30:46 -0800 | [diff] [blame] | 20 | */ |
| 21 | |
Elliott Hughes | 820eced | 2021-08-20 18:00:50 -0700 | [diff] [blame] | 22 | #include "extract.h" |
| 23 | |
Elliott Hughes | e2e3bd1 | 2017-05-15 10:59:29 -0700 | [diff] [blame] | 24 | /* |
Elliott Hughes | 820eced | 2021-08-20 18:00:50 -0700 | [diff] [blame] | 25 | * Definition to let us compile most of the IPv6 code even on systems |
Elliott Hughes | e2e3bd1 | 2017-05-15 10:59:29 -0700 | [diff] [blame] | 26 | * without IPv6 support. |
| 27 | */ |
| 28 | #ifndef INET6_ADDRSTRLEN |
| 29 | #define INET6_ADDRSTRLEN 46 |
| 30 | #endif |
| 31 | |
The Android Open Source Project | 2949f58 | 2009-03-03 19:30:46 -0800 | [diff] [blame] | 32 | /* Name to address translation routines. */ |
| 33 | |
JP Abgrall | 53f17a9 | 2014-02-12 14:02:41 -0800 | [diff] [blame] | 34 | enum { |
| 35 | LINKADDR_ETHER, |
| 36 | LINKADDR_FRELAY, |
| 37 | LINKADDR_IEEE1394, |
Elliott Hughes | cec480a | 2017-12-19 16:54:57 -0800 | [diff] [blame] | 38 | LINKADDR_ATM, |
| 39 | LINKADDR_OTHER |
JP Abgrall | 53f17a9 | 2014-02-12 14:02:41 -0800 | [diff] [blame] | 40 | }; |
| 41 | |
| 42 | #define BUFSIZE 128 |
| 43 | |
Elliott Hughes | 820eced | 2021-08-20 18:00:50 -0700 | [diff] [blame] | 44 | extern const char *linkaddr_string(netdissect_options *, const uint8_t *, const unsigned int, const unsigned int); |
| 45 | extern const char *etheraddr_string(netdissect_options *, const uint8_t *); |
| 46 | extern const char *le64addr_string(netdissect_options *, const uint8_t *); |
Elliott Hughes | e2e3bd1 | 2017-05-15 10:59:29 -0700 | [diff] [blame] | 47 | extern const char *tcpport_string(netdissect_options *, u_short); |
| 48 | extern const char *udpport_string(netdissect_options *, u_short); |
Elliott Hughes | 820eced | 2021-08-20 18:00:50 -0700 | [diff] [blame] | 49 | extern const char *isonsap_string(netdissect_options *, const uint8_t *, u_int); |
Elliott Hughes | 892a68b | 2015-10-19 14:43:53 -0700 | [diff] [blame] | 50 | extern const char *dnaddr_string(netdissect_options *, u_short); |
Elliott Hughes | e2e3bd1 | 2017-05-15 10:59:29 -0700 | [diff] [blame] | 51 | extern const char *ipxsap_string(netdissect_options *, u_short); |
Elliott Hughes | 820eced | 2021-08-20 18:00:50 -0700 | [diff] [blame] | 52 | extern const char *ipaddr_string(netdissect_options *, const u_char *); |
| 53 | extern const char *ip6addr_string(netdissect_options *, const u_char *); |
Elliott Hughes | 892a68b | 2015-10-19 14:43:53 -0700 | [diff] [blame] | 54 | extern const char *intoa(uint32_t); |
The Android Open Source Project | 2949f58 | 2009-03-03 19:30:46 -0800 | [diff] [blame] | 55 | |
Elliott Hughes | 892a68b | 2015-10-19 14:43:53 -0700 | [diff] [blame] | 56 | extern void init_addrtoname(netdissect_options *, uint32_t, uint32_t); |
Elliott Hughes | e2e3bd1 | 2017-05-15 10:59:29 -0700 | [diff] [blame] | 57 | extern struct hnamemem *newhnamemem(netdissect_options *); |
| 58 | extern struct h6namemem *newh6namemem(netdissect_options *); |
Elliott Hughes | 892a68b | 2015-10-19 14:43:53 -0700 | [diff] [blame] | 59 | extern const char * ieee8021q_tci_string(const uint16_t); |
The Android Open Source Project | 2949f58 | 2009-03-03 19:30:46 -0800 | [diff] [blame] | 60 | |
Elliott Hughes | 820eced | 2021-08-20 18:00:50 -0700 | [diff] [blame] | 61 | /* macro(s) and inline function(s) with setjmp/longjmp logic to call |
| 62 | * the X_string() function(s) after bounds checking. |
| 63 | * The macro(s) must be used on a packet buffer pointer. |
| 64 | */ |
| 65 | |
| 66 | static inline const char * |
| 67 | get_linkaddr_string(netdissect_options *ndo, const uint8_t *p, |
| 68 | const unsigned int type, const unsigned int len) |
| 69 | { |
| 70 | if (!ND_TTEST_LEN(p, len)) |
| 71 | nd_trunc_longjmp(ndo); |
| 72 | return linkaddr_string(ndo, p, type, len); |
| 73 | } |
| 74 | |
| 75 | static inline const char * |
| 76 | get_etheraddr_string(netdissect_options *ndo, const uint8_t *p) |
| 77 | { |
| 78 | if (!ND_TTEST_LEN(p, MAC_ADDR_LEN)) |
| 79 | nd_trunc_longjmp(ndo); |
| 80 | return etheraddr_string(ndo, p); |
| 81 | } |
| 82 | |
| 83 | static inline const char * |
| 84 | get_le64addr_string(netdissect_options *ndo, const u_char *p) |
| 85 | { |
| 86 | if (!ND_TTEST_8(p)) |
| 87 | nd_trunc_longjmp(ndo); |
| 88 | return le64addr_string(ndo, p); |
| 89 | } |
| 90 | |
| 91 | static inline const char * |
| 92 | get_isonsap_string(netdissect_options *ndo, const uint8_t *nsap, |
| 93 | u_int nsap_length) |
| 94 | { |
| 95 | if (!ND_TTEST_LEN(nsap, nsap_length)) |
| 96 | nd_trunc_longjmp(ndo); |
| 97 | return isonsap_string(ndo, nsap, nsap_length); |
| 98 | } |
| 99 | |
| 100 | static inline const char * |
| 101 | get_ipaddr_string(netdissect_options *ndo, const u_char *p) |
| 102 | { |
| 103 | if (!ND_TTEST_4(p)) |
| 104 | nd_trunc_longjmp(ndo); |
| 105 | return ipaddr_string(ndo, p); |
| 106 | } |
| 107 | |
| 108 | static inline const char * |
| 109 | get_ip6addr_string(netdissect_options *ndo, const u_char *p) |
| 110 | { |
| 111 | if (!ND_TTEST_16(p)) |
| 112 | nd_trunc_longjmp(ndo); |
| 113 | return ip6addr_string(ndo, p); |
| 114 | } |
| 115 | |
| 116 | #define GET_LINKADDR_STRING(p, type, len) get_linkaddr_string(ndo, (const u_char *)(p), type, len) |
| 117 | #define GET_ETHERADDR_STRING(p) get_etheraddr_string(ndo, (const u_char *)(p)) |
| 118 | #define GET_LE64ADDR_STRING(p) get_le64addr_string(ndo, (const u_char *)(p)) |
| 119 | #define GET_ISONSAP_STRING(nsap, nsap_length) get_isonsap_string(ndo, (const u_char *)(nsap), nsap_length) |
| 120 | #define GET_IPADDR_STRING(p) get_ipaddr_string(ndo, (const u_char *)(p)) |
| 121 | #define GET_IP6ADDR_STRING(p) get_ip6addr_string(ndo, (const u_char *)(p)) |