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