Skip site navigation (1)Skip section navigation (2)
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>