1 /* $NetBSD: put.c,v 1.6 2009/11/17 18:58:07 drochner 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 #include <sys/cdefs.h> 28 #ifndef lint 29 __RCSID("$NetBSD: put.c,v 1.6 2009/11/17 18:58:07 drochner Exp $"); 30 #endif 31 32 #include "os.h" 33 #include "mopdef.h" 34 #include "put.h" 35 36 void 37 mopPutChar(u_char *pkt, int *idx, u_char value) 38 { 39 pkt[*idx] = value; 40 *idx = *idx + 1; 41 } 42 43 void 44 mopPutShort(u_char *pkt, int *idx, u_short value) 45 { 46 int i; 47 for (i = 0; i < 2; i++) { 48 pkt[*idx+i] = value % 256; 49 value = value / 256; 50 } 51 *idx = *idx + 2; 52 } 53 54 void 55 mopPutLong(u_char *pkt, int *idx, u_int32_t value) 56 { 57 int i; 58 for (i = 0; i < 4; i++) { 59 pkt[*idx+i] = value % 256; 60 value = value / 256; 61 } 62 *idx = *idx + 4; 63 } 64 65 void 66 mopPutMulti(u_char *pkt, int *idx, const u_char *value, int size) 67 { 68 int i; 69 70 for (i = 0; i < size; i++) { 71 pkt[*idx+i] = value[i]; 72 } 73 *idx = *idx + size; 74 } 75 76 void 77 mopPutTime(u_char *pkt, int *idx, time_t value) 78 { 79 time_t tnow; 80 struct tm *timenow; 81 82 if ((value == 0)) { 83 tnow = time(NULL); 84 } else { 85 tnow = value; 86 } 87 88 timenow = localtime(&tnow); 89 90 mopPutChar (pkt,idx,10); 91 mopPutChar (pkt,idx,(timenow->tm_year / 100) + 19); 92 mopPutChar (pkt,idx,(timenow->tm_year % 100)); 93 mopPutChar (pkt,idx,(timenow->tm_mon + 1)); 94 mopPutChar (pkt,idx,(timenow->tm_mday)); 95 mopPutChar (pkt,idx,(timenow->tm_hour)); 96 mopPutChar (pkt,idx,(timenow->tm_min)); 97 mopPutChar (pkt,idx,(timenow->tm_sec)); 98 mopPutChar (pkt,idx,0x00); 99 mopPutChar (pkt,idx,0x00); 100 mopPutChar (pkt,idx,0x00); 101 } 102 103 void 104 mopPutHeader(u_char *pkt, int *idx, const u_char *dst, const u_char *src, 105 u_short proto, int trans) 106 { 107 108 mopPutMulti(pkt, idx, dst, 6); 109 mopPutMulti(pkt, idx, src, 6); 110 if (trans == TRANS_8023) { 111 mopPutShort(pkt, idx, 0); 112 mopPutChar (pkt, idx, MOP_K_PROTO_802_DSAP); 113 mopPutChar (pkt, idx, MOP_K_PROTO_802_SSAP); 114 mopPutChar (pkt, idx, MOP_K_PROTO_802_CNTL); 115 mopPutChar (pkt, idx, 0x08); 116 mopPutChar (pkt, idx, 0x00); 117 mopPutChar (pkt, idx, 0x2b); 118 } 119 #if !defined(__FreeBSD__) 120 mopPutChar(pkt, idx, (proto / 256)); 121 mopPutChar(pkt, idx, (proto % 256)); 122 #else 123 if (trans == TRANS_8023) { 124 mopPutChar(pkt, idx, (proto / 256)); 125 mopPutChar(pkt, idx, (proto % 256)); 126 } else { 127 mopPutChar(pkt, idx, (proto % 256)); 128 mopPutChar(pkt, idx, (proto / 256)); 129 } 130 #endif 131 if (trans == TRANS_ETHER) 132 mopPutShort(pkt, idx, 0); 133 134 } 135 136 void 137 mopPutLength(u_char *pkt, int trans, u_short len) 138 { 139 int idx = 0; 140 141 switch(trans) { 142 case TRANS_ETHER: 143 idx = 14; 144 mopPutChar(pkt, &idx, ((len - 16) % 256)); 145 mopPutChar(pkt, &idx, ((len - 16) / 256)); 146 break; 147 case TRANS_8023: 148 idx = 12; 149 #if !defined(__FreeBSD__) 150 mopPutChar(pkt, &idx, ((len - 14) / 256)); 151 mopPutChar(pkt, &idx, ((len - 14) % 256)); 152 #else 153 mopPutChar(pkt, &idx, ((len - 14) % 256)); 154 mopPutChar(pkt, &idx, ((len - 14) / 256)); 155 #endif 156 break; 157 } 158 159 } 160