1 /* $OpenBSD: put.c,v 1.9 2017/07/29 07:18:03 florian Exp $ */
2
3 /*
4 * Copyright (c) 1993-2006 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 <stddef.h>
28 #include <sys/types.h>
29 #include <time.h>
30 #include "common/mopdef.h"
31
32 void
mopPutChar(u_char * pkt,int * idx,u_char value)33 mopPutChar(u_char *pkt, int *idx, u_char value)
34 {
35 pkt[*idx] = value;
36 (*idx)++;
37 }
38
39 void
mopPutShort(u_char * pkt,int * idx,u_short value)40 mopPutShort(u_char *pkt, int *idx, u_short value)
41 {
42 pkt[*idx] = value % 256;
43 pkt[*idx+1] = value / 256;
44 *idx += 2;
45 }
46
47 void
mopPutNShort(u_char * pkt,int * idx,u_short value)48 mopPutNShort(u_char *pkt, int *idx, u_short value)
49 {
50 pkt[*idx] = value / 256;
51 pkt[*idx+1] = value % 256;
52 *idx += 2;
53 }
54
55 void
mopPutLong(u_char * pkt,int * idx,u_long value)56 mopPutLong(u_char *pkt, int *idx, u_long value)
57 {
58 int i;
59
60 for (i = 0; i < 4; i++) {
61 pkt[*idx+i] = (u_char)(value % 256);
62 value /= 256;
63 }
64 *idx += 4;
65 }
66
67 void
mopPutMulti(u_char * pkt,int * idx,u_char * value,int size)68 mopPutMulti(u_char *pkt, int *idx, u_char *value, int size)
69 {
70 int i;
71
72 for (i = 0; i < size; i++)
73 pkt[*idx+i] = value[i];
74 *idx += size;
75 }
76
77 void
mopPutTime(u_char * pkt,int * idx,time_t value)78 mopPutTime(u_char *pkt, int *idx, time_t value)
79 {
80 time_t tnow;
81 struct tm *timenow;
82
83 if (value == 0)
84 tnow = time(NULL);
85 else
86 tnow = value;
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,u_char * dst,u_char * src,u_short proto,int trans)104 mopPutHeader(u_char *pkt, int *idx, u_char *dst, u_char *src, u_short proto,
105 int trans)
106 {
107 mopPutMulti(pkt, idx, dst, 6);
108 mopPutMulti(pkt, idx, src, 6);
109 if (trans == TRANS_8023) {
110 mopPutShort(pkt, idx, 0);
111 mopPutChar(pkt, idx, MOP_K_PROTO_802_DSAP);
112 mopPutChar(pkt, idx, MOP_K_PROTO_802_SSAP);
113 mopPutChar(pkt, idx, MOP_K_PROTO_802_CNTL);
114 mopPutChar(pkt, idx, 0x08);
115 mopPutChar(pkt, idx, 0x00);
116 mopPutChar(pkt, idx, 0x2b);
117 }
118 #if !defined(__FreeBSD__)
119 mopPutNShort(pkt, idx, proto);
120 #else
121 if (trans == TRANS_8023) {
122 mopPutNShort(pkt, idx, proto);
123 } else {
124 mopPutShort(pkt, idx, proto);
125 }
126 #endif
127 if (trans == TRANS_ETHER)
128 mopPutShort(pkt, idx, 0);
129
130 }
131
132 void
mopPutLength(u_char * pkt,int trans,u_short len)133 mopPutLength(u_char *pkt, int trans, u_short len)
134 {
135 int idx;
136
137 switch (trans) {
138 case TRANS_ETHER:
139 idx = 14;
140 mopPutShort(pkt, &idx, len-16);
141 break;
142 case TRANS_8023:
143 idx = 12;
144 #if !defined(__FreeBSD__)
145 mopPutNShort(pkt, &idx, len-14);
146 #else
147 mopPutShort(pkt, &idx, len-14);
148 #endif
149 break;
150 }
151 }
152