8f195e9
Patch by Gleb Paharenko <gpaharenko@gmail.com> for dsniff >= 2.4b1, which
8f195e9
adds checksum for libnids. For further information, please have a look to
8f195e9
Debian bug ID #420129.
8f195e9
8f195e9
--- dsniff-2.4b1/dsniff.c		2007-08-11 01:37:33.000000000 -0300
8f195e9
+++ dsniff-2.4b1/dsniff.c.checksum	2007-08-11 01:38:55.000000000 -0300
8f195e9
@@ -70,6 +70,80 @@
8f195e9
 {
8f195e9
 }
8f195e9
 
8f195e9
+
8f195e9
+static int get_all_ifaces(struct ifreq **, int *);
8f195e9
+static unsigned int get_addr_from_ifreq(struct ifreq *);
8f195e9
+
8f195e9
+int all_local_ipaddrs_chksum_disable()
8f195e9
+{
8f195e9
+	struct ifreq *ifaces;
8f195e9
+	int ifaces_count;
8f195e9
+	int i, ind = 0;
8f195e9
+	struct nids_chksum_ctl *ctlp;
8f195e9
+	unsigned int tmp;
8f195e9
+
8f195e9
+	if (!get_all_ifaces(&ifaces, &ifaces_count))
8f195e9
+		return -1;
8f195e9
+	ctlp =
8f195e9
+	    (struct nids_chksum_ctl *) malloc(ifaces_count *
8f195e9
+					      sizeof(struct
8f195e9
+						     nids_chksum_ctl));
8f195e9
+	if (!ctlp)
8f195e9
+		return -1;
8f195e9
+	for (i = 0; i < ifaces_count; i++) {
8f195e9
+		tmp = get_addr_from_ifreq(ifaces + i);
8f195e9
+		if (tmp) {
8f195e9
+			ctlp[ind].netaddr = tmp;
8f195e9
+			ctlp[ind].mask = inet_addr("255.255.255.255");
8f195e9
+			ctlp[ind].action = NIDS_DONT_CHKSUM;
8f195e9
+			ind++;
8f195e9
+		}
8f195e9
+	}
8f195e9
+	free(ifaces);
8f195e9
+	nids_register_chksum_ctl(ctlp, ind);
8f195e9
+}
8f195e9
+
8f195e9
+/* helper functions for Example 2 */
8f195e9
+unsigned int get_addr_from_ifreq(struct ifreq *iface)
8f195e9
+{
8f195e9
+	if (iface->ifr_addr.sa_family == AF_INET)
8f195e9
+		return ((struct sockaddr_in *) &(iface->ifr_addr))->
8f195e9
+		    sin_addr.s_addr;
8f195e9
+	return 0;
8f195e9
+}
8f195e9
+
8f195e9
+static int get_all_ifaces(struct ifreq **ifaces, int *count)
8f195e9
+{
8f195e9
+	int ifaces_size = 8 * sizeof(struct ifreq);
8f195e9
+	struct ifconf param;
8f195e9
+	int sock;
8f195e9
+	unsigned int i;
8f195e9
+
8f195e9
+	*ifaces = malloc(ifaces_size);
8f195e9
+	sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
8f195e9
+	if (sock <= 0)
8f195e9
+		return 0;
8f195e9
+	for (;;) {
8f195e9
+		param.ifc_len = ifaces_size;
8f195e9
+		param.ifc_req = *ifaces;
8f195e9
+		if (ioctl(sock, SIOCGIFCONF, &param))
8f195e9
+			goto err;
8f195e9
+		if (param.ifc_len < ifaces_size)
8f195e9
+			break;
8f195e9
+		free(*ifaces);
8f195e9
+		ifaces_size *= 2;
8f195e9
+		ifaces = malloc(ifaces_size);
8f195e9
+	}
8f195e9
+	*count = param.ifc_len / sizeof(struct ifreq);
8f195e9
+	close(sock);
8f195e9
+	return 1;
8f195e9
+      err:
8f195e9
+	close(sock);
8f195e9
+	return 0;
8f195e9
+}
8f195e9
+
8f195e9
+
8f195e9
+
8f195e9
 int
8f195e9
 main(int argc, char *argv[])
8f195e9
 {
8f195e9
@@ -189,6 +263,8 @@
8f195e9
 			warnx("using %s", nids_params.filename);
8f195e9
 		}
8f195e9
 	}
8f195e9
+
8f195e9
+	all_local_ipaddrs_chksum_disable();
8f195e9
 	
8f195e9
 	nids_run();
8f195e9