LogoopenSUSE Build Service > Projects
Sign Up | Log In

View File arpwatch-2.1a11-tokenring.diff of Package arpwatch (Project openSUSE:11.4)

--- arpwatch-2.1a11/arpwatch.8
+++ arpwatch-2.1a11/arpwatch.8
@@ -47,12 +47,12 @@
 .ad
 .SH DESCRIPTION
 .B Arpwatch
-keeps track for ethernet/ip address pairings. It syslogs activity
+keeps track for MAC/IP address pairings. It syslogs activity
 and reports certain changes via email.
 .B Arpwatch
 uses
 .BR pcap (3)
-to listen for arp packets on a local ethernet interface.
+to listen for arp packets on a local ethernet/tokenring/fddi interface.
 .LP
 The
 .B -d
@@ -62,7 +62,7 @@
 .LP
 The
 .B -f
-flag is used to set the ethernet/ip address database filename.
+flag is used to set the MAC/IP address database filename.
 The default is
 .IR arp.dat .
 .LP
@@ -106,26 +106,26 @@
 .BR arpsnmp (1)):
 .TP
 .B "new activity"
-This ethernet/ip address pair has been used for the first time six
+This MAC/IP address pair has been used for the first time six
 months or more.
 .TP
 .B "new station"
-The ethernet address has not been seen before.
+The MAC address has not been seen before.
 .TP
 .B "flip flop"
-The ethernet address has changed from the most recently seen address to
+The MAC address has changed from the most recently seen address to
 the second most recently seen address.
-(If either the old or new ethernet address is a DECnet address and it
+(If either the old or new MAC address is a DECnet address and it
 is less than 24 hours, the email version of the report is suppressed.)
 .TP
-.B "changed ethernet address"
-The host switched to a new ethernet address.
+.B "changed MAC address"
+The host switched to a new MAC address.
 .SH "SYSLOG MESSAGES"
 Here are some of the syslog messages;
 note that messages that are reported are also sysloged.
 .TP
-.B "ethernet broadcast"
-The mac ethernet address of the host is a broadcast address.
+.B "MAC broadcast"
+The MAC address of the host is a broadcast address.
 .TP
 .B "ip broadcast"
 The ip address of the host is a broadcast address.
@@ -133,15 +133,15 @@
 .B "bogon"
 The source ip address is not local to the local subnet.
 .TP
-.B "ethernet broadcast"
-The source mac or arp ethernet address was all ones or all zeros.
+.B "MAC broadcast"
+The source MAC address was all ones or all zeros.
 .TP
-.B "ethernet mismatch"
-The source mac ethernet address didn't match the address inside
+.B "MAC mismatch"
+The source MAC address didn't match the address inside
 the arp packet.
 .TP
-.B "reused old ethernet address"
-The ethernet address has changed from the most recently seen address to
+.B "reused old MAC address"
+The MAC address has changed from the most recently seen address to
 the third (or greater) least recently seen address.
 (This is similar to a flip flop.)
 .TP
@@ -153,7 +153,7 @@
 .nh
 .nf
 /usr/operator/arpwatch - default directory
-arp.dat - ethernet/ip address database
+arp.dat - MAC/IP address database
 ethercodes.dat - vendor ethernet block list
 .ad
 .hy
--- arpwatch-2.1a11/arpwatch.c
+++ arpwatch-2.1a11/arpwatch.c
@@ -26,6 +26,8 @@
     "@(#) $Id: arpwatch.c,v 1.63 2000/10/14 02:07:28 leres Exp $ (LBL)";
 #endif
 
+#define TOKEN	1
+
 /*
  * arpwatch - keep track of ethernet/ip address pairings, report changes
  */
@@ -74,6 +76,9 @@
 #include "db.h"
 #include "ec.h"
 #include "fddi.h"
+#ifdef TOKEN
+#include "toring.h"
+#endif
 #include "file.h"
 #include "machdep.h"
 #include "setsignal.h"
@@ -135,10 +140,16 @@
 int	main(int, char **);
 void	process_ether(u_char *, const struct pcap_pkthdr *, const u_char *);
 void	process_fddi(u_char *, const struct pcap_pkthdr *, const u_char *);
+#ifdef TOKEN
+void	process_toring(u_char *, const struct pcap_pkthdr *, const u_char *);
+#endif
 int	readsnmp(char *);
 int	snmp_add(u_int32_t, u_char *, time_t, char *);
 int	sanity_ether(struct ether_header *, struct ether_arp *, int);
 int	sanity_fddi(struct fddi_header *, struct ether_arp *, int);
+#ifdef TOKEN
+int	sanity_toring(struct toring_header *, struct ether_arp *, int);
+#endif
 __dead	void usage(void) __attribute__((volatile));
 
 int
@@ -267,6 +278,7 @@
 		swapped = pcap_is_swapped(pd);
 	} else {
 		snaplen = max(sizeof(struct ether_header),
+//FIXME
 		    sizeof(struct fddi_header)) + sizeof(struct ether_arp);
 		timeout = 1000;
 		pd = pcap_open_live(interface, snaplen, 1, timeout, errbuf);
@@ -286,10 +298,14 @@
 	setgid(getgid());
 	setuid(getuid());
 
-	/* Must be ethernet or fddi */
+	/* Must be ethernet or fddi or tokenring */
 	linktype = pcap_datalink(pd);
-	if (linktype != DLT_EN10MB && linktype != DLT_FDDI) {
-		syslog(LOG_ERR, "Link layer type %d not ethernet or fddi",
+	if (linktype != DLT_EN10MB && linktype != DLT_FDDI
+#ifdef TOKEN
+&& linktype != DLT_IEEE802
+#endif
+		) {
+		syslog(LOG_ERR, "Link layer type %d not ethernet, fddi or tokenring",
 		    linktype);
 		exit(1);
 	}
@@ -337,7 +353,11 @@
 	case DLT_FDDI:
 		status = pcap_loop(pd, 0, process_fddi, NULL);
 		break;
-
+#ifdef TOKEN
+	case DLT_IEEE802:
+		status = pcap_loop(pd, 0, process_toring, NULL);
+		break;
+#endif
 	default:
 		syslog(LOG_ERR, "bad linktype %d (can't happen)", linktype);
 		exit(1);
@@ -393,13 +413,13 @@
 	/* Watch for ethernet broadcast */
 	if (MEMCMP(sea, zero, 6) == 0 || MEMCMP(sea, allones, 6) == 0 ||
 	    MEMCMP(sha, zero, 6) == 0 || MEMCMP(sha, allones, 6) == 0) {
-		dosyslog(LOG_INFO, "ethernet broadcast", sia, sea, sha);
+		dosyslog(LOG_INFO, "MAC broadcast (eth)", sia, sea, sha);
 		return;
 	}
 
 	/* Double check ethernet addresses */
 	if (MEMCMP(sea, sha, 6) != 0) {
-		dosyslog(LOG_INFO, "ethernet mismatch", sia, sea, sha);
+		dosyslog(LOG_INFO, "MAC mismatch (eth)", sia, sea, sha);
 		return;
 	}
 
@@ -542,13 +562,13 @@
 	/* Watch for ethernet broadcast */
 	if (MEMCMP(sea, zero, 6) == 0 || MEMCMP(sea, allones, 6) == 0 ||
 	    MEMCMP(sha, zero, 6) == 0 || MEMCMP(sha, allones, 6) == 0) {
-		dosyslog(LOG_INFO, "ethernet broadcast", sia, sea, sha);
+		dosyslog(LOG_INFO, "MAC broadcast (fddi)", sia, sea, sha);
 		return;
 	}
 
 	/* Double check ethernet addresses */
 	if (MEMCMP(sea, sha, 6) != 0) {
-		dosyslog(LOG_INFO, "ethernet mismatch", sia, sea, sha);
+		dosyslog(LOG_INFO, "MAC mismatch (fddi)", sia, sea, sha);
 		return;
 	}
 
@@ -639,6 +659,71 @@
 	return(1);
 }
 
+#ifdef TOKEN
+void
+process_toring(register u_char *u, register const struct pcap_pkthdr *h,
+    register const u_char *p)
+{
+	register struct toring_header *th;
+	register struct ether_arp *ea;
+	register u_char *sea, *sha;
+	register time_t t;
+	u_int32_t sia;
+
+	th = (struct toring_header *)p;
+	ea = (struct ether_arp *)(th + 1);
+
+	if (swapped) {
+		bit_reverse(th->src, 6);
+		bit_reverse(th->dst, 6);
+	}
+	if (!sanity_toring(th, ea, h->caplen))
+		return;
+
+	/* Source MAC hardware ethernet address */
+	sea = (u_char *)th->src;
+
+	/* Source ARP ethernet address */
+	sha = (u_char *)SHA(ea);
+
+	/* Source ARP ip address */
+	BCOPY(SPA(ea), &sia, 4);
+
+	/* Watch for bogons */
+	if (isbogon(sia)) {
+		dosyslog(LOG_INFO, "bogon", sia, sea, sha);
+		return;
+	}
+
+	/* Watch for broadcast */
+	if (MEMCMP(sea, zero, 6) == 0 || MEMCMP(sea, allones, 6) == 0 ||
+	    MEMCMP(sha, zero, 6) == 0 || MEMCMP(sha, allones, 6) == 0) {
+		dosyslog(LOG_INFO, "MAC broadcast (tr)", sia, sea, sha);
+		return;
+	}
+
+	/* Double check tokenring addresses */
+	if (MEMCMP(sea, sha, 6) != 0) {
+		dosyslog(LOG_INFO, "MAC mismatch (tr)", sia, sea, sha);
+		return;
+	}
+
+	/* Got a live one */
+	t = h->ts.tv_sec;
+	can_checkpoint = 0;
+	if (!ent_add(sia, sea, t, NULL))
+		syslog(LOG_ERR, "ent_add(%s, %s, %ld) failed",
+		    intoa(sia), e2str(sea), t);
+	can_checkpoint = 1;
+}
+int
+sanity_toring(register struct toring_header *th, register struct ether_arp *ea,
+    register int len)
+{
+	return (1);
+}
+#endif
+
 int
 addnet(register const char *str)
 {
--- arpwatch-2.1a11/db.c
+++ arpwatch-2.1a11/db.c
@@ -150,7 +150,7 @@
 			/* An old entry comes to life */
 			e2 = ap->elist[0]->e;
 			t2 = ap->elist[0]->t;
-			dosyslog(LOG_NOTICE, "reused old ethernet address",
+			dosyslog(LOG_NOTICE, "reused old MAC address",
 			    a, e, e2);
 			/* Shift entries down */
 			len = i * sizeof(ap->elist[0]);
@@ -165,7 +165,7 @@
 	/* New ether address */
 	e2 = ap->elist[0]->e;
 	t2 = ap->elist[0]->t;
-	report("changed ethernet address", a, e, e2, &t, &t2);
+	report("changed MAC address", a, e, e2, &t, &t2);
 	/* Make room at head of list */
 	alist_alloc(ap);
 	len = ap->ecount * sizeof(ap->elist[0]);
--- arpwatch-2.1a11/report.c
+++ arpwatch-2.1a11/report.c
@@ -312,19 +312,19 @@
 	(void)putc('\n', f);
 	(void)fprintf(f, fmt, "hostname", hn);
 	(void)fprintf(f, fmt, "ip address", intoa(a));
-	(void)fprintf(f, fmt, "ethernet address", e2str(e1));
+	(void)fprintf(f, fmt, "mac address", e2str(e1));
 	if ((cp = ec_find(e1)) == NULL)
 		cp = unknown;
-	(void)fprintf(f, fmt, "ethernet vendor", cp);
+	(void)fprintf(f, fmt, "mac vendor", cp);
 	if (hn != unknown && gethinfo(hn, cpu, sizeof(cpu), os, sizeof(os))) {
 		(void)sprintf(buf, "%s %s", cpu, os);
 		(void)fprintf(f, fmt, "dns cpu & os", buf);
 	}
 	if (e2) {
-		(void)fprintf(f, fmt, "old ethernet address", e2str(e2));
+		(void)fprintf(f, fmt, "old mac address", e2str(e2));
 		if ((cp = ec_find(e2)) == NULL)
 			cp = unknown;
-		(void)fprintf(f, fmt, "old ethernet vendor", cp);
+		(void)fprintf(f, fmt, "old mac vendor", cp);
 	}
 	if (t1p)
 		(void)fprintf(f, fmt, "timestamp", fmtdate(*t1p));
--- arpwatch-2.1a11/toring.h
+++ arpwatch-2.1a11/toring.h
@@ -0,0 +1,26 @@
+/* Support for tokenring */
+      
+/*
+ * 802.2 specific declarations
+ */
+//struct llchdr {
+//      u_char   llc_dsap;
+//      u_char   llc_ssap;
+//      u_char   llc_ctl;
+//};
+//
+//struct snaphdr {
+//      u_char          snap_oid[3];
+//      u_char          snap_type[2];
+//};
+
+struct toring_header {
+      u_char  acc_ctl;
+      u_char  frame_ctl;
+      u_char  dst[6];
+      u_char  src[6];
+      struct llchdr   llc;
+      struct snaphdr  snap;
+};
+
+