1 /* $NetBSD: put.c,v 1.8 2016/06/08 01:11:49 christos 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 "port.h"
28 #ifndef lint
29 __RCSID("$NetBSD: put.c,v 1.8 2016/06/08 01:11:49 christos Exp $");
30 #endif
31
32 #include "os.h"
33 #include "mopdef.h"
34 #include "put.h"
35
36 void
mopPutChar(u_char * pkt,int * idx,u_char value)37 mopPutChar(u_char *pkt, int *idx, u_char value)
38 {
39 pkt[*idx] = value;
40 *idx = *idx + 1;
41 }
42
43 void
mopPutShort(u_char * pkt,int * idx,u_short value)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
mopPutLong(u_char * pkt,int * idx,u_int32_t value)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
mopPutMulti(u_char * pkt,int * idx,const u_char * value,int size)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
mopPutTime(u_char * pkt,int * idx,time_t value)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
mopPutHeader(u_char * pkt,int * idx,const u_char * dst,const u_char * src,u_short proto,int trans)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
mopPutLength(u_char * pkt,int trans,u_short len)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