Home | History | Annotate | Line # | Download | only in mopprobe
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