1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
Author: Gleb Paharenko <gpaharenko@gmail.com>
Description: Workaround to this Debian bug
Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=420129
This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
@@ -70,6 +70,80 @@
{
}
+
+static int get_all_ifaces(struct ifreq **, int *);
+static unsigned int get_addr_from_ifreq(struct ifreq *);
+
+int all_local_ipaddrs_chksum_disable()
+{
+ struct ifreq *ifaces;
+ int ifaces_count;
+ int i, ind = 0;
+ struct nids_chksum_ctl *ctlp;
+ unsigned int tmp;
+
+ if (!get_all_ifaces(&ifaces, &ifaces_count))
+ return -1;
+ ctlp =
+ (struct nids_chksum_ctl *) malloc(ifaces_count *
+ sizeof(struct
+ nids_chksum_ctl));
+ if (!ctlp)
+ return -1;
+ for (i = 0; i < ifaces_count; i++) {
+ tmp = get_addr_from_ifreq(ifaces + i);
+ if (tmp) {
+ ctlp[ind].netaddr = tmp;
+ ctlp[ind].mask = inet_addr("255.255.255.255");
+ ctlp[ind].action = NIDS_DONT_CHKSUM;
+ ind++;
+ }
+ }
+ free(ifaces);
+ nids_register_chksum_ctl(ctlp, ind);
+}
+
+/* helper functions for Example 2 */
+unsigned int get_addr_from_ifreq(struct ifreq *iface)
+{
+ if (iface->ifr_addr.sa_family == AF_INET)
+ return ((struct sockaddr_in *) &(iface->ifr_addr))->
+ sin_addr.s_addr;
+ return 0;
+}
+
+static int get_all_ifaces(struct ifreq **ifaces, int *count)
+{
+ int ifaces_size = 8 * sizeof(struct ifreq);
+ struct ifconf param;
+ int sock;
+ unsigned int i;
+
+ *ifaces = malloc(ifaces_size);
+ sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
+ if (sock <= 0)
+ return 0;
+ for (;;) {
+ param.ifc_len = ifaces_size;
+ param.ifc_req = *ifaces;
+ if (ioctl(sock, SIOCGIFCONF, ¶m))
+ goto err;
+ if (param.ifc_len < ifaces_size)
+ break;
+ free(*ifaces);
+ ifaces_size *= 2;
+ ifaces = malloc(ifaces_size);
+ }
+ *count = param.ifc_len / sizeof(struct ifreq);
+ close(sock);
+ return 1;
+ err:
+ close(sock);
+ return 0;
+}
+
+
+
int
main(int argc, char *argv[])
{
@@ -189,6 +263,8 @@
warnx("using %s", nids_params.filename);
}
}
+
+ all_local_ipaddrs_chksum_disable();
nids_run();
|