1 1.8 kalvisd /* $NetBSD: get.c,v 1.8 2024/12/03 05:57:02 kalvisd Exp $ */ 2 1.2 thorpej 3 1.1 cjs /* 4 1.1 cjs * Copyright (c) 1993-95 Mats O Jansson. All rights reserved. 5 1.1 cjs * 6 1.1 cjs * Redistribution and use in source and binary forms, with or without 7 1.1 cjs * modification, are permitted provided that the following conditions 8 1.1 cjs * are met: 9 1.1 cjs * 1. Redistributions of source code must retain the above copyright 10 1.1 cjs * notice, this list of conditions and the following disclaimer. 11 1.1 cjs * 2. Redistributions in binary form must reproduce the above copyright 12 1.1 cjs * notice, this list of conditions and the following disclaimer in the 13 1.1 cjs * documentation and/or other materials provided with the distribution. 14 1.1 cjs * 15 1.1 cjs * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 1.1 cjs * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 1.1 cjs * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 1.1 cjs * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 1.1 cjs * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 1.1 cjs * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 1.1 cjs * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 1.1 cjs * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 1.1 cjs * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 1.1 cjs * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 1.1 cjs */ 26 1.1 cjs 27 1.8 kalvisd #if defined (HAVE_NBTOOL_CONFIG_H) 28 1.8 kalvisd # include "nbtool_config.h" 29 1.8 kalvisd #else 30 1.8 kalvisd # include "port.h" 31 1.8 kalvisd #endif /* defined (HAVE_NBTOOL_CONFIG_H) */ 32 1.3 lukem #ifndef lint 33 1.8 kalvisd __RCSID("$NetBSD: get.c,v 1.8 2024/12/03 05:57:02 kalvisd Exp $"); 34 1.1 cjs #endif 35 1.1 cjs 36 1.3 lukem #include "os.h" 37 1.3 lukem #include "get.h" 38 1.3 lukem #include "mopdef.h" 39 1.1 cjs 40 1.1 cjs u_char 41 1.6 drochner mopGetChar(const u_char *pkt, int *idx) 42 1.1 cjs { 43 1.1 cjs u_char ret; 44 1.1 cjs 45 1.4 lukem ret = pkt[*idx]; 46 1.4 lukem *idx = *idx + 1; 47 1.1 cjs return(ret); 48 1.1 cjs } 49 1.1 cjs 50 1.1 cjs u_short 51 1.6 drochner mopGetShort(const u_char *pkt, int *idx) 52 1.1 cjs { 53 1.1 cjs u_short ret; 54 1.1 cjs 55 1.4 lukem ret = pkt[*idx] + pkt[*idx+1]*256; 56 1.4 lukem *idx = *idx + 2; 57 1.1 cjs return(ret); 58 1.1 cjs } 59 1.1 cjs 60 1.3 lukem u_int32_t 61 1.6 drochner mopGetLong(const u_char *pkt, int *idx) 62 1.1 cjs { 63 1.3 lukem u_int32_t ret; 64 1.1 cjs 65 1.4 lukem ret = pkt[*idx] + 66 1.4 lukem pkt[*idx+1]*0x100 + 67 1.4 lukem pkt[*idx+2]*0x10000 + 68 1.4 lukem pkt[*idx+3]*0x1000000; 69 1.4 lukem *idx = *idx + 4; 70 1.1 cjs return(ret); 71 1.1 cjs } 72 1.1 cjs 73 1.1 cjs void 74 1.6 drochner mopGetMulti(const u_char *pkt, int *idx, u_char *dest, int size) 75 1.1 cjs { 76 1.1 cjs int i; 77 1.1 cjs 78 1.1 cjs for (i = 0; i < size; i++) { 79 1.4 lukem dest[i] = pkt[*idx+i]; 80 1.1 cjs } 81 1.4 lukem *idx = *idx + size; 82 1.1 cjs 83 1.1 cjs } 84 1.1 cjs 85 1.1 cjs int 86 1.6 drochner mopGetTrans(const u_char *pkt, int trans) 87 1.1 cjs { 88 1.6 drochner const u_short *ptype; 89 1.1 cjs 90 1.1 cjs if (trans == 0) { 91 1.6 drochner ptype = (const u_short *)(pkt+12); 92 1.1 cjs if (ntohs(*ptype) < 1600) { 93 1.1 cjs trans = TRANS_8023; 94 1.1 cjs } else { 95 1.1 cjs trans = TRANS_ETHER; 96 1.1 cjs } 97 1.1 cjs } 98 1.1 cjs return(trans); 99 1.1 cjs } 100 1.1 cjs 101 1.1 cjs void 102 1.6 drochner mopGetHeader(const u_char *pkt, int *idx, const u_char **dst, const u_char **src, 103 1.6 drochner u_short *proto, int *len, int trans) 104 1.1 cjs { 105 1.1 cjs *dst = pkt; 106 1.1 cjs *src = pkt + 6; 107 1.4 lukem *idx = *idx + 12; 108 1.1 cjs 109 1.1 cjs switch(trans) { 110 1.1 cjs case TRANS_ETHER: 111 1.4 lukem *proto = (u_short)(pkt[*idx]*256 + pkt[*idx+1]); 112 1.4 lukem *idx = *idx + 2; 113 1.4 lukem *len = (int)(pkt[*idx+1]*256 + pkt[*idx]); 114 1.4 lukem *idx = *idx + 2; 115 1.1 cjs break; 116 1.1 cjs case TRANS_8023: 117 1.4 lukem *len = (int)(pkt[*idx]*256 + pkt[*idx+1]); 118 1.4 lukem *idx = *idx + 8; 119 1.4 lukem *proto = (u_short)(pkt[*idx]*256 + pkt[*idx+1]); 120 1.4 lukem *idx = *idx + 2; 121 1.1 cjs break; 122 1.1 cjs } 123 1.1 cjs } 124 1.1 cjs 125 1.1 cjs u_short 126 1.6 drochner mopGetLength(const u_char *pkt, int trans) 127 1.1 cjs { 128 1.1 cjs switch(trans) { 129 1.1 cjs case TRANS_ETHER: 130 1.1 cjs return(pkt[15]*256 + pkt[14]); 131 1.1 cjs break; 132 1.1 cjs case TRANS_8023: 133 1.1 cjs return(pkt[12]*256 + pkt[13]); 134 1.1 cjs break; 135 1.1 cjs } 136 1.1 cjs return(0); 137 1.1 cjs } 138