xref: /openbsd/usr.sbin/mopd/common/put.c (revision 916fc46c)
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