mopprobe.c revision 1.17 1 /* $NetBSD: mopprobe.c,v 1.17 2025/05/04 19:54:05 rillig Exp $ */
2
3 /*
4 * Copyright (c) 1993-96 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 __RCSID("$NetBSD: mopprobe.c,v 1.17 2025/05/04 19:54:05 rillig Exp $");
29
30 #include "os.h"
31 #include "cmp.h"
32 #include "common.h"
33 #include "device.h"
34 #include "get.h"
35 #include "mopdef.h"
36 #include "nmadef.h"
37 #include "pf.h"
38 #include "print.h"
39 #include "log.h"
40
41 /*
42 * The list of all interfaces that are being listened to. rarp_loop()
43 * "selects" on the descriptors in this list.
44 */
45 extern struct if_info *iflist;
46
47 __dead static void Usage(void);
48 void mopProcess(struct if_info *, u_char *);
49
50 int promisc = 1; /* Need promisc mode */
51
52 int
53 main(int argc, char **argv)
54 {
55 int op, AllFlag = 0;
56 char *interface;
57
58 mopInteractive = 1;
59
60 while ((op = getopt(argc, argv, "a")) != -1) {
61 switch (op) {
62 case 'a':
63 AllFlag++;
64 break;
65
66 default:
67 Usage();
68 }
69 }
70 interface = argv[optind++];
71
72 if ((AllFlag != 0) == (interface != NULL))
73 Usage();
74
75 if (AllFlag)
76 deviceInitAll();
77 else
78 deviceInitOne(interface);
79
80 Loop();
81 }
82
83 static void
84 Usage(void)
85 {
86 (void)fprintf(stderr, "usage: %s -a|interface\n", getprogname());
87 exit(1);
88 }
89
90 /*
91 * Process incoming packages.
92 */
93 void
94 mopProcess(struct if_info *ii, u_char *pkt)
95 {
96 u_char *dst, *src, *p, mopcode, tmpc, ilen;
97 u_short *ptype, moplen, itype, len;
98 int idx, i, trans;
99
100 dst = pkt;
101 src = pkt+6;
102 ptype = (u_short *)(pkt+12);
103 idx = 0;
104
105 if (*ptype < 1600) {
106 len = *ptype;
107 trans = TRANS_8023;
108 ptype = (u_short *)(pkt+20);
109 p = pkt+22;
110 } else {
111 len = 0;
112 trans = TRANS_ETHER;
113 p = pkt+14;
114 }
115
116 /* Ignore our own messages */
117
118 if (mopCmpEAddr(ii->eaddr,src) == 0) {
119 return;
120 }
121
122 /* Just check multicast */
123
124 if (mopCmpEAddr(rc_mcst,dst) != 0) {
125 return;
126 }
127
128 switch (trans) {
129 case TRANS_8023:
130 moplen = len;
131 break;
132 default:
133 moplen = mopGetShort(pkt,&idx);
134 }
135 mopcode = mopGetChar(p,&idx);
136
137 /* Just process System Information */
138
139 if (mopcode != MOP_K_CODE_SID) {
140 return;
141 }
142
143 tmpc = mopGetChar(pkt,&idx); /* Reserved */
144 (void)mopGetShort(pkt,&idx); /* Receipt # */
145
146 itype = mopGetShort(pkt,&idx);
147
148 while (idx < (int)(moplen + 2)) {
149 ilen = mopGetChar(pkt,&idx);
150 switch (itype) {
151 case 0:
152 tmpc = mopGetChar(pkt,&idx);
153 idx = idx + tmpc;
154 break;
155 case MOP_K_INFO_VER:
156 idx = idx + 3;
157 break;
158 case MOP_K_INFO_MFCT:
159 idx = idx + 2;
160 break;
161 case MOP_K_INFO_CNU:
162 idx = idx + 6;
163 break;
164 case MOP_K_INFO_RTM:
165 idx = idx + 2;
166 break;
167 case MOP_K_INFO_CSZ:
168 idx = idx + 2;
169 break;
170 case MOP_K_INFO_RSZ:
171 idx = idx + 2;
172 break;
173 case MOP_K_INFO_HWA:
174 idx = idx + 6;
175 break;
176 case MOP_K_INFO_TIME:
177 idx = idx + 10;
178 break;
179 case MOP_K_INFO_SOFD:
180 (void)mopGetChar(pkt, &idx);
181 break;
182 case MOP_K_INFO_SFID:
183 tmpc = mopGetChar(pkt,&idx);
184 if ((idx > 0) && (idx < 17))
185 idx = idx + tmpc;
186 break;
187 case MOP_K_INFO_PRTY:
188 idx = idx + 1;
189 break;
190 case MOP_K_INFO_DLTY:
191 idx = idx + 1;
192 break;
193 case MOP_K_INFO_DLBSZ:
194 idx = idx + 2;
195 break;
196 default:
197 if (itype > 101 && itype < 107) {
198 switch (itype) {
199 case 102:
200 idx = idx + ilen;
201 break;
202 case 103:
203 idx = idx + ilen;
204 break;
205 case 104:
206 idx = idx + 2;
207 break;
208 case 105:
209 (void)fprintf(stdout,"%x:%x:%x:%x:%x:%x\t",
210 src[0],src[1],src[2],src[3],src[4],src[5]);
211 for (i = 0; i < ilen; i++) {
212 (void)fprintf(stdout, "%c",pkt[idx+i]);
213 }
214 idx = idx + ilen;
215 (void)fprintf(stdout, "\n");
216 break;
217 case 106:
218 idx = idx + ilen;
219 break;
220 }
221 } else {
222 idx = idx + ilen;
223 }
224 }
225 itype = mopGetShort(pkt,&idx);
226 }
227 }
228