Date: Fri, 28 Sep 2001 17:34:15 PDT From: Craig Leres <leres@ee.lbl.gov> To: FreeBSD-gnats-submit@freebsd.org Cc: leres@ee.lbl.gov (Craig Leres) Subject: bin/30904: [PATCH] allow route(8) to create "proxy only" arp entries Message-ID: <200109290034.f8T0YFR60869@fun.ee.lbl.gov>
next in thread | raw e-mail | index | archive | help
>Number: 30904 >Category: bin >Synopsis: [PATCH] allow route to create "proxy only" arp entries >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Fri Sep 28 17:40:01 PDT 2001 >Closed-Date: >Last-Modified: >Originator: Craig Leres >Release: FreeBSD 4.4-RELEASE i386 >Organization: Lawrence Berkeley National Laboratory >Environment: >Description: It would be really nice if route(8) could add the necessary magic to create "proxy only" arp entries. >How-To-Repeat: >Fix: There is background about this change here: http://www.FreeBSD.org/cgi/query-pr.cgi?pr=12357 It looks like The appended context diffs add -announce and -proxy flags to route(8). I've also included some minor gcc/lint and prototype fixes. But the actual code changes to add the new flags are minimal. BTW, the route(8) man page says it was last modified on March 19th, 1994 but it's obviously been updated many times since then. =================================================================== RCS file: RCS/Makefile,v retrieving revision 1.1 diff -c -r1.1 Makefile *** Makefile 2001/09/28 23:38:08 1.1 --- Makefile 2001/09/29 00:07:17 *************** *** 6,11 **** --- 6,12 ---- SRCS= route.c keywords.h CFLAGS+=-I. -Wall -DNS CFLAGS+=-DINET6 + CFLAGS+=-DLBL CLEANFILES+=keywords.h BINMODE=4555 =================================================================== RCS file: RCS/keywords,v retrieving revision 1.1 diff -c -r1.1 keywords *** keywords 2001/09/28 23:38:08 1.1 --- keywords 2001/09/28 23:38:22 *************** *** 2,7 **** --- 2,8 ---- # $FreeBSD: src/sbin/route/keywords,v 1.4 1999/12/07 17:38:53 shin Exp $ add + announce atalk blackhole change *************** *** 36,41 **** --- 37,43 ---- prefixlen proto1 proto2 + proxy recvpipe reject rtt =================================================================== RCS file: RCS/route.c,v retrieving revision 1.1 diff -c -r1.1 route.c *** route.c 2001/09/28 23:38:08 1.1 --- route.c 2001/09/29 00:00:21 *************** *** 56,61 **** --- 56,64 ---- #include <net/route.h> #include <net/if_dl.h> #include <netinet/in.h> + #ifdef LBL + #include <netinet/if_ether.h> + #endif #include <netatalk/at.h> #ifdef NS #include <netns/ns.h> *************** *** 94,120 **** struct sockaddr_ns sns; #endif struct sockaddr_dl sdl; struct sockaddr_storage ss; /* added to avoid memory overrun */ } so_dst, so_gate, so_mask, so_genmask, so_ifa, so_ifp; typedef union sockunion *sup; int pid, rtm_addrs, uid; int s; ! int forcehost, forcenet, doflush, nflag, af, qflag, tflag, keyword(); int iflag, verbose, aflen = sizeof (struct sockaddr_in); int locking, lockrest, debugonly; struct rt_metrics rt_metrics; u_long rtm_inits; int atalk_aton __P((const char *, struct at_addr *)); char *atalk_ntoa __P((struct at_addr)); ! const char *routename(), *netname(); ! void flushroutes(), newroute(), monitor(), sockaddr(), sodump(), bprintf(); ! void print_getmsg(), print_rtmsg(), pmsg_common(), pmsg_addrs(), mask_addr(); ! int getaddr(), rtmsg(), x25_makemask(); ! int prefixlen(); ! extern char *iso_ntoa(); ! ! void usage __P((const char *)) __dead2; void usage(cp) --- 97,144 ---- struct sockaddr_ns sns; #endif struct sockaddr_dl sdl; + #ifdef LBL + struct sockaddr_inarp sia; + #endif struct sockaddr_storage ss; /* added to avoid memory overrun */ } so_dst, so_gate, so_mask, so_genmask, so_ifa, so_ifp; typedef union sockunion *sup; int pid, rtm_addrs, uid; int s; ! int forcehost, forcenet, doflush, nflag, af, qflag, tflag; int iflag, verbose, aflen = sizeof (struct sockaddr_in); int locking, lockrest, debugonly; struct rt_metrics rt_metrics; u_long rtm_inits; + + /* Forwards */ int atalk_aton __P((const char *, struct at_addr *)); char *atalk_ntoa __P((struct at_addr)); ! void bprintf __P((FILE *, int, u_char *)); ! const char *routename __P((struct sockaddr *)); ! const char *netname __P((struct sockaddr *)); ! void flushroutes __P((int, char **)); ! int getaddr __P((int, char *, struct hostent **)); ! void inet_makenetandmask __P((u_long, struct sockaddr_in *, u_long)); ! void interfaces __P((void)); ! int keyword __P((char *)); ! void mask_addr __P((void)); ! void monitor __P((void)); ! void newroute __P((int, char **)); ! #ifdef NS ! char *ns_print __P((struct sockaddr_ns *)); ! #endif ! int prefixlen __P((char *)); ! void print_getmsg __P((struct rt_msghdr *, int)); ! void print_rtmsg __P((struct rt_msghdr *, int)); ! void pmsg_common __P((struct rt_msghdr *)); ! void pmsg_addrs __P((char *, int)); ! int rtmsg __P((int, int)); ! void set_metric __P((char *, int)); ! void sockaddr __P((char *, struct sockaddr *)); ! void sodump __P((sup, char *)); ! void usage __P((const char *)) __dead2; void usage(cp) *************** *** 310,318 **** struct hostent *hp; static char domain[MAXHOSTNAMELEN + 1]; static int first = 1; - #ifdef NS - char *ns_print(); - #endif if (first) { first = 0; --- 334,339 ---- *************** *** 433,441 **** u_long net, mask; register u_long i; int subnetshift; - #ifdef NS - char *ns_print(); - #endif switch (sa->sa_family) { --- 454,459 ---- *************** *** 586,591 **** --- 604,612 ---- { char *cmd, *dest = "", *gateway = "", *err; int ishost = 0, ret, attempts, oerrno, flags = RTF_STATIC; + #ifdef LBL + int proxy = 0; + #endif int key; struct hostent *hp = 0; *************** *** 657,662 **** --- 678,691 ---- case K_PROTO2: flags |= RTF_PROTO2; break; + #ifdef LBL + case K_ANNOUNCE: + flags |= RTF_ANNOUNCE; + break; + case K_PROXY: + ++proxy; + break; + #endif case K_CLONING: flags |= RTF_CLONING; break; *************** *** 754,759 **** --- 783,792 ---- flags |= RTF_HOST; if (iflag == 0) flags |= RTF_GATEWAY; + #ifdef LBL + if (proxy) + so_dst.sia.sin_other = SIN_PROXY; + #endif for (attempts = 1; ; attempts++) { errno = 0; if ((ret = rtmsg(*cmd, flags)) == 0) *************** *** 1396,1402 **** register char *cp; register int i; ! (void) printf(" route to: %s\n", routename(&so_dst)); if (rtm->rtm_version != RTM_VERSION) { warnx("routing message version %d not understood", rtm->rtm_version); --- 1429,1435 ---- register char *cp; register int i; ! (void) printf(" route to: %s\n", routename(&so_dst.sa)); if (rtm->rtm_version != RTM_VERSION) { warnx("routing message version %d not understood", rtm->rtm_version); =================================================================== RCS file: RCS/route.8,v retrieving revision 1.1 diff -c -r1.1 route.8 *** route.8 2001/09/29 00:10:57 1.1 --- route.8 2001/09/29 00:32:31 *************** *** 32,38 **** .\" @(#)route.8 8.3 (Berkeley) 3/19/94 .\" $FreeBSD: src/sbin/route/route.8,v 1.17.2.6 2001/07/22 11:32:33 dd Exp $ .\" ! .Dd March 19, 1994 .Dt ROUTE 8 .Os BSD 4.4 .Sh NAME --- 32,38 ---- .\" @(#)route.8 8.3 (Berkeley) 3/19/94 .\" $FreeBSD: src/sbin/route/route.8,v 1.17.2.6 2001/07/22 11:32:33 dd Exp $ .\" ! .Dd September 28, 2001 .Dt ROUTE 8 .Os BSD 4.4 .Sh NAME *************** *** 273,278 **** --- 273,280 ---- -nostatic ~RTF_STATIC - pretend route added by kernel or daemon -reject RTF_REJECT - emit an ICMP unreachable when matched -blackhole RTF_BLACKHOLE - silently discard pkts (during updates) + -announce RTF_ANNOUNCE - announce new arp entry + -proxy SIN_PROXY - create a proxy arp entry -proto1 RTF_PROTO1 - set protocol specific routing flag #1 -proto2 RTF_PROTO2 - set protocol specific routing flag #2 -llinfo RTF_LLINFO - validly translates proto addr to link addr >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200109290034.f8T0YFR60869>