1 1.17 rillig /* $NetBSD: mopprobe.c,v 1.17 2025/05/04 19:54:05 rillig Exp $ */ 2 1.2 thorpej 3 1.1 cjs /* 4 1.1 cjs * Copyright (c) 1993-96 Mats O Jansson. All rights reserved. 5 1.1 cjs * 6 1.1 cjs * Redistribution and use in source and binary forms, with or without 7 1.1 cjs * modification, are permitted provided that the following conditions 8 1.1 cjs * are met: 9 1.1 cjs * 1. Redistributions of source code must retain the above copyright 10 1.1 cjs * notice, this list of conditions and the following disclaimer. 11 1.1 cjs * 2. Redistributions in binary form must reproduce the above copyright 12 1.1 cjs * notice, this list of conditions and the following disclaimer in the 13 1.1 cjs * documentation and/or other materials provided with the distribution. 14 1.1 cjs * 15 1.1 cjs * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 1.1 cjs * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 1.1 cjs * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 1.1 cjs * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 1.1 cjs * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 1.1 cjs * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 1.1 cjs * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 1.1 cjs * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 1.1 cjs * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 1.1 cjs * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 1.1 cjs */ 26 1.1 cjs 27 1.13 christos #include "port.h" 28 1.17 rillig __RCSID("$NetBSD: mopprobe.c,v 1.17 2025/05/04 19:54:05 rillig Exp $"); 29 1.1 cjs 30 1.4 christos #include "os.h" 31 1.5 lukem #include "cmp.h" 32 1.5 lukem #include "common.h" 33 1.5 lukem #include "device.h" 34 1.5 lukem #include "get.h" 35 1.5 lukem #include "mopdef.h" 36 1.5 lukem #include "nmadef.h" 37 1.5 lukem #include "pf.h" 38 1.5 lukem #include "print.h" 39 1.8 christos #include "log.h" 40 1.1 cjs 41 1.1 cjs /* 42 1.1 cjs * The list of all interfaces that are being listened to. rarp_loop() 43 1.1 cjs * "selects" on the descriptors in this list. 44 1.1 cjs */ 45 1.14 joerg extern struct if_info *iflist; 46 1.1 cjs 47 1.11 joerg __dead static void Usage(void); 48 1.11 joerg void mopProcess(struct if_info *, u_char *); 49 1.1 cjs 50 1.1 cjs int promisc = 1; /* Need promisc mode */ 51 1.1 cjs 52 1.5 lukem int 53 1.11 joerg main(int argc, char **argv) 54 1.1 cjs { 55 1.17 rillig int op, AllFlag = 0; 56 1.1 cjs char *interface; 57 1.1 cjs 58 1.8 christos mopInteractive = 1; 59 1.1 cjs 60 1.17 rillig while ((op = getopt(argc, argv, "a")) != -1) { 61 1.1 cjs switch (op) { 62 1.1 cjs case 'a': 63 1.1 cjs AllFlag++; 64 1.1 cjs break; 65 1.1 cjs 66 1.1 cjs default: 67 1.1 cjs Usage(); 68 1.1 cjs } 69 1.1 cjs } 70 1.1 cjs interface = argv[optind++]; 71 1.17 rillig 72 1.17 rillig if ((AllFlag != 0) == (interface != NULL)) 73 1.1 cjs Usage(); 74 1.1 cjs 75 1.1 cjs if (AllFlag) 76 1.1 cjs deviceInitAll(); 77 1.1 cjs else 78 1.1 cjs deviceInitOne(interface); 79 1.1 cjs 80 1.1 cjs Loop(); 81 1.1 cjs } 82 1.1 cjs 83 1.11 joerg static void 84 1.11 joerg Usage(void) 85 1.1 cjs { 86 1.17 rillig (void)fprintf(stderr, "usage: %s -a|interface\n", getprogname()); 87 1.1 cjs exit(1); 88 1.1 cjs } 89 1.1 cjs 90 1.1 cjs /* 91 1.15 andvar * Process incoming packages. 92 1.1 cjs */ 93 1.1 cjs void 94 1.11 joerg mopProcess(struct if_info *ii, u_char *pkt) 95 1.1 cjs { 96 1.1 cjs u_char *dst, *src, *p, mopcode, tmpc, ilen; 97 1.12 christos u_short *ptype, moplen, itype, len; 98 1.16 rillig int idx, i, trans; 99 1.1 cjs 100 1.1 cjs dst = pkt; 101 1.1 cjs src = pkt+6; 102 1.1 cjs ptype = (u_short *)(pkt+12); 103 1.9 lukem idx = 0; 104 1.17 rillig 105 1.1 cjs if (*ptype < 1600) { 106 1.1 cjs len = *ptype; 107 1.1 cjs trans = TRANS_8023; 108 1.1 cjs ptype = (u_short *)(pkt+20); 109 1.1 cjs p = pkt+22; 110 1.1 cjs } else { 111 1.1 cjs len = 0; 112 1.1 cjs trans = TRANS_ETHER; 113 1.1 cjs p = pkt+14; 114 1.1 cjs } 115 1.17 rillig 116 1.1 cjs /* Ignore our own messages */ 117 1.1 cjs 118 1.1 cjs if (mopCmpEAddr(ii->eaddr,src) == 0) { 119 1.1 cjs return; 120 1.1 cjs } 121 1.1 cjs 122 1.1 cjs /* Just check multicast */ 123 1.1 cjs 124 1.1 cjs if (mopCmpEAddr(rc_mcst,dst) != 0) { 125 1.1 cjs return; 126 1.1 cjs } 127 1.17 rillig 128 1.1 cjs switch (trans) { 129 1.1 cjs case TRANS_8023: 130 1.1 cjs moplen = len; 131 1.1 cjs break; 132 1.1 cjs default: 133 1.9 lukem moplen = mopGetShort(pkt,&idx); 134 1.1 cjs } 135 1.9 lukem mopcode = mopGetChar(p,&idx); 136 1.1 cjs 137 1.1 cjs /* Just process System Information */ 138 1.1 cjs 139 1.1 cjs if (mopcode != MOP_K_CODE_SID) { 140 1.1 cjs return; 141 1.1 cjs } 142 1.17 rillig 143 1.9 lukem tmpc = mopGetChar(pkt,&idx); /* Reserved */ 144 1.12 christos (void)mopGetShort(pkt,&idx); /* Receipt # */ 145 1.1 cjs 146 1.9 lukem itype = mopGetShort(pkt,&idx); 147 1.1 cjs 148 1.9 lukem while (idx < (int)(moplen + 2)) { 149 1.9 lukem ilen = mopGetChar(pkt,&idx); 150 1.1 cjs switch (itype) { 151 1.1 cjs case 0: 152 1.9 lukem tmpc = mopGetChar(pkt,&idx); 153 1.9 lukem idx = idx + tmpc; 154 1.1 cjs break; 155 1.1 cjs case MOP_K_INFO_VER: 156 1.9 lukem idx = idx + 3; 157 1.1 cjs break; 158 1.1 cjs case MOP_K_INFO_MFCT: 159 1.9 lukem idx = idx + 2; 160 1.1 cjs break; 161 1.1 cjs case MOP_K_INFO_CNU: 162 1.9 lukem idx = idx + 6; 163 1.1 cjs break; 164 1.1 cjs case MOP_K_INFO_RTM: 165 1.9 lukem idx = idx + 2; 166 1.1 cjs break; 167 1.1 cjs case MOP_K_INFO_CSZ: 168 1.9 lukem idx = idx + 2; 169 1.1 cjs break; 170 1.1 cjs case MOP_K_INFO_RSZ: 171 1.9 lukem idx = idx + 2; 172 1.1 cjs break; 173 1.1 cjs case MOP_K_INFO_HWA: 174 1.9 lukem idx = idx + 6; 175 1.1 cjs break; 176 1.1 cjs case MOP_K_INFO_TIME: 177 1.9 lukem idx = idx + 10; 178 1.1 cjs break; 179 1.1 cjs case MOP_K_INFO_SOFD: 180 1.16 rillig (void)mopGetChar(pkt, &idx); 181 1.1 cjs break; 182 1.1 cjs case MOP_K_INFO_SFID: 183 1.9 lukem tmpc = mopGetChar(pkt,&idx); 184 1.17 rillig if ((idx > 0) && (idx < 17)) 185 1.9 lukem idx = idx + tmpc; 186 1.1 cjs break; 187 1.1 cjs case MOP_K_INFO_PRTY: 188 1.9 lukem idx = idx + 1; 189 1.1 cjs break; 190 1.1 cjs case MOP_K_INFO_DLTY: 191 1.9 lukem idx = idx + 1; 192 1.1 cjs break; 193 1.1 cjs case MOP_K_INFO_DLBSZ: 194 1.9 lukem idx = idx + 2; 195 1.1 cjs break; 196 1.1 cjs default: 197 1.16 rillig if (itype > 101 && itype < 107) { 198 1.1 cjs switch (itype) { 199 1.1 cjs case 102: 200 1.9 lukem idx = idx + ilen; 201 1.1 cjs break; 202 1.1 cjs case 103: 203 1.9 lukem idx = idx + ilen; 204 1.1 cjs break; 205 1.1 cjs case 104: 206 1.9 lukem idx = idx + 2; 207 1.1 cjs break; 208 1.1 cjs case 105: 209 1.1 cjs (void)fprintf(stdout,"%x:%x:%x:%x:%x:%x\t", 210 1.1 cjs src[0],src[1],src[2],src[3],src[4],src[5]); 211 1.1 cjs for (i = 0; i < ilen; i++) { 212 1.9 lukem (void)fprintf(stdout, "%c",pkt[idx+i]); 213 1.1 cjs } 214 1.9 lukem idx = idx + ilen; 215 1.1 cjs (void)fprintf(stdout, "\n"); 216 1.1 cjs break; 217 1.1 cjs case 106: 218 1.9 lukem idx = idx + ilen; 219 1.1 cjs break; 220 1.17 rillig } 221 1.1 cjs } else { 222 1.9 lukem idx = idx + ilen; 223 1.17 rillig } 224 1.1 cjs } 225 1.17 rillig itype = mopGetShort(pkt,&idx); 226 1.1 cjs } 227 1.1 cjs } 228