Index: head/net-mgmt/choparp/Makefile =================================================================== --- head/net-mgmt/choparp/Makefile (revision 388696) +++ head/net-mgmt/choparp/Makefile (revision 388697) @@ -1,19 +1,19 @@ # Created by: itojun@itojun.org # $FreeBSD$ PORTNAME= choparp PORTVERSION= 20021107 PORTREVISION= 4 CATEGORIES= net-mgmt MASTER_SITES= SF -MAINTAINER= ports@FreeBSD.org +MAINTAINER= garga@FreeBSD.org COMMENT= Simple proxy arp daemon LICENSE= BSD3CLAUSE USE_RC_SUBR= choparp PLIST_FILES= sbin/choparp man/man8/choparp.8.gz .include Index: head/net-mgmt/choparp/files/patch-Makefile =================================================================== --- head/net-mgmt/choparp/files/patch-Makefile (revision 388696) +++ head/net-mgmt/choparp/files/patch-Makefile (revision 388697) @@ -1,14 +1,14 @@ ---- /dev/null Tue Oct 7 23:33:35 1997 -+++ Makefile Tue Oct 7 23:42:51 1997 +--- Makefile.orig 2015-06-07 13:12:33 UTC ++++ Makefile @@ -0,0 +1,11 @@ +PROG= choparp +MAN8= choparp.8 + +BINOWN!= /usr/bin/id -n -u +BINGRP!= /usr/bin/id -n -g +MANOWN= ${BINOWN} +MANGRP= ${BINGRP} +BINDIR= ${PREFIX}/sbin +MANDIR= ${PREFIX}/man/man + +.include Index: head/net-mgmt/choparp/files/patch-choparp.8 =================================================================== --- head/net-mgmt/choparp/files/patch-choparp.8 (revision 388696) +++ head/net-mgmt/choparp/files/patch-choparp.8 (revision 388697) @@ -1,56 +1,56 @@ ---- choparp.8.orig 2002-11-08 07:36:03.000000000 +0900 -+++ choparp.8 2010-05-04 20:39:28.291199414 +0900 +--- choparp.8.orig 2002-11-07 22:36:03 UTC ++++ choparp.8 @@ -34,7 +34,8 @@ .Nm choparp .Nd cheap and omitted proxy ARP .Sh SYNOPSIS -.Nm chpoarp +.Nm choparp +.Op Fl v .Ar if_name mac_addr .Oo Fl Oc Ns Ar net_addr Ns .Op / Ns Ar net_mask @@ -42,7 +43,7 @@ .Sh DESCRIPTION .Pp .Nm choparp -is a easy-to-use proxy ARP daemon. +is an easy-to-use proxy ARP daemon. It watches ARP request packets visible on the interface specified by argument .Ar if_name , and sends proxy ARP reply to the sender if the ARP request queries the -@@ -52,7 +53,7 @@ +@@ -52,7 +53,7 @@ for the network specified by .Ar net_addr Ns / Ar net_mask . .Pp .Ar mac_addr -is th MAC address to be published for the specified hosts. +is the MAC address to be published for the specified hosts. It is normally the address of .Ar if_name . The format of -@@ -72,7 +73,7 @@ +@@ -72,7 +73,7 @@ or be a 32 bit hexadecimal value startin .Dq 0x .Pq for example Ad 0x858a0186 . .Ar net_mask -can likewise be speficied as a dotted quad or hexadecimal value, +can likewise be specified as a dotted quad or hexadecimal value, or alternatively as a mask length. The following address specifications are therefore equivalent: .Bl -item -offset indent -@@ -89,6 +90,16 @@ +@@ -89,6 +90,16 @@ Addresses can be .Em excluded by preceding them with .Fl +.Pp +.Fl v +option enables verbose mode, showing warning for invalid ARP packets. +.Pp +.Nm choparp +uses the Berkeley Packet Filter +.Nm bpf(4) +and so the kernel must be compiled with support for the +.Nm bpf +device. .Sh EXAMPLES If you have network interface .Dq ne0 Index: head/net-mgmt/choparp/files/patch-choparp.c =================================================================== --- head/net-mgmt/choparp/files/patch-choparp.c (revision 388696) +++ head/net-mgmt/choparp/files/patch-choparp.c (revision 388697) @@ -1,135 +1,135 @@ ---- choparp.c.orig 2002-11-08 07:36:03.000000000 +0900 -+++ choparp.c 2010-05-04 20:39:28.279310506 +0900 +--- choparp.c.orig 2002-11-07 22:36:03 UTC ++++ choparp.c @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include -@@ -75,6 +76,7 @@ +@@ -75,6 +76,7 @@ struct cidr { struct cidr *targets = NULL, *excludes = NULL; u_char target_mac[ETHER_ADDR_LEN]; /* target MAC address */ +int verbose = 0; /* ARP filter program -@@ -239,6 +241,16 @@ +@@ -239,6 +241,16 @@ checkarp(char *arpbuf){ fprintf(stderr,"checkarp: WARNING: received unknown type ARP request.\n"); return(0); } + if (ntohl(*(u_int32_t *)(arp->arp_tpa)) == ntohl(*(u_int32_t *)(arp->arp_spa))) { + if (verbose != 0) + fprintf(stderr,"checkarp: WARNING: sender equal dest.\n"); + return(0); + } + if (0 == ntohl(*(u_int32_t *)(arp->arp_spa))) { + if (verbose != 0) + fprintf(stderr,"checkarp: WARNING: zero sender address.\n"); + return(0); + } target_ip = ntohl(*(u_int32_t *)(arp->arp_tpa)); return match(target_ip, targets) && !match(target_ip, excludes); } -@@ -280,13 +292,22 @@ +@@ -280,13 +292,22 @@ loop(int fd, char *buf, size_t buflen){ char *rframe; char *sframe; size_t frame_len; - fd_set fdset; + int kq; + struct kevent kev; - FD_ZERO(&fdset); - FD_SET(fd,&fdset); + if ((kq = kqueue()) < 0) { + perror("kqueue"); + return; + } + + EV_SET(&kev, fd, EVFILT_READ, EV_ADD, 0, 0, NULL); + if (kevent(kq, &kev, 1, NULL, 0, NULL) < 0 ) { + perror("kevent"); + return; + } for(;;){ - int r = select(fd+1,&fdset, 0, 0, 0); + int r = kevent(kq, NULL, 0, &kev, 1, NULL); if (r < 0) { if (errno == EINTR) -@@ -295,7 +316,7 @@ +@@ -295,7 +316,7 @@ loop(int fd, char *buf, size_t buflen){ return; } - rlen = read(fd, buf, buflen); + rlen = read(kev.ident, buf, buflen); if (rlen < 0) { if (errno == EINTR) continue; -@@ -307,7 +328,7 @@ +@@ -307,7 +328,7 @@ loop(int fd, char *buf, size_t buflen){ while((rframe = getarp(p, rlen, &nextp, &nextlen)) != NULL){ if (checkarp(rframe)){ sframe = gen_arpreply(rframe, &frame_len); - write(fd, sframe, frame_len); + write(kev.ident, sframe, frame_len); } p = nextp; rlen = nextlen; -@@ -362,13 +383,13 @@ +@@ -362,13 +383,13 @@ atoip(char *buf, u_int32_t *ip_addr){ void usage(void){ - fprintf(stderr,"usage: choparp if_name mac_addr [-]addr/mask...\n"); + fprintf(stderr,"usage: choparp [-v] if_name mac_addr [-]addr/mask...\n"); exit(-1); } int main(int argc, char **argv){ - int fd; + int ch, fd; char *buf, *ifname; struct cidr **targets_tail = &targets, **excludes_tail = &excludes; #define APPEND(LIST,ADDR,MASK) \ -@@ -381,13 +402,24 @@ +@@ -381,13 +402,24 @@ main(int argc, char **argv){ } while (0) size_t buflen; - if (argc < 4) + while ((ch = getopt(argc, argv, "v")) != -1) + switch (ch) { + case 'v': + verbose++; + break; + default: + usage(); + } + argc -= optind; + argv += optind; + + if (argc < 3) usage(); - ifname = argv[1]; - if (setmac(argv[2], ifname)) + ifname = argv[0]; + if (setmac(argv[1], ifname)) usage(); - argv += 3; argc -= 3; + argv += 2; argc -= 2; while (argc > 0) { u_int32_t addr, mask = ~0; -@@ -437,6 +469,9 @@ +@@ -437,6 +469,9 @@ main(int argc, char **argv){ #endif if ((fd = openbpf(ifname, &buf, &buflen)) < 0) return(-1); + #ifndef DEBUG + daemon(0, 0); + #endif loop(fd, buf, buflen); return(-1); }