Allow route(8) to create "proxy only" published ARP entries.

PR:		bin/12357
Submitted by:	Craig Leres <leres@ee.lbl.gov>
This commit is contained in:
Ruslan Ermilov 2001-06-12 13:31:53 +00:00
parent 86cd74127c
commit 1c59bf7de3
3 changed files with 24 additions and 5 deletions

View File

@ -36,6 +36,7 @@ osi
prefixlen
proto1
proto2
proxy
recvpipe
reject
rtt

View File

@ -313,6 +313,16 @@ or
.Fl ifa
modifiers may be used to determine the interface or interface address.
.Pp
The optional
.Fl proxy
modifier specifies that the
.Dv RTF_LLINFO
routing table entry is the
.Dq published Pq proxy-only
.Tn ARP
entry, as reported by
.Xr arp 8 .
.Pp
All symbolic names specified for a
.Ar destination
or
@ -325,11 +335,9 @@ is then used to interpret the name as that of a network.
.Pp
.Nm Route
uses a routing socket and the new message types
RTM_ADD,
RTM_DELETE,
RTM_GET,
.Dv RTM_ADD , RTM_DELETE , RTM_GET ,
and
RTM_CHANGE.
.Dv RTM_CHANGE .
As such, only the super-user may modify
the routing tables.
.Sh DIAGNOSTICS
@ -377,6 +385,7 @@ utility exits 0 on success or >0 if an error occurred.
.Xr netintro 4 ,
.Xr route 4 ,
.Xr IPXrouted 8 ,
.Xr arp 8 ,
.Xr routed 8
.\" .Xr XNSrouted 8
.\" Xr esis 4 ,

View File

@ -56,6 +56,7 @@ static const char rcsid[] =
#include <net/route.h>
#include <net/if_dl.h>
#include <netinet/in.h>
#include <netinet/if_ether.h>
#include <netatalk/at.h>
#ifdef NS
#include <netns/ns.h>
@ -94,6 +95,7 @@ union sockunion {
struct sockaddr_ns sns;
#endif
struct sockaddr_dl sdl;
struct sockaddr_inarp sinarp;
struct sockaddr_storage ss; /* added to avoid memory overrun */
} so_dst, so_gate, so_mask, so_genmask, so_ifa, so_ifp;
@ -581,7 +583,7 @@ newroute(argc, argv)
register char **argv;
{
char *cmd, *dest = "", *gateway = "", *err;
int ishost = 0, ret, attempts, oerrno, flags = RTF_STATIC;
int ishost = 0, proxy = 0, ret, attempts, oerrno, flags = RTF_STATIC;
int key;
struct hostent *hp = 0;
@ -653,6 +655,9 @@ newroute(argc, argv)
case K_PROTO2:
flags |= RTF_PROTO2;
break;
case K_PROXY:
proxy = 1;
break;
case K_CLONING:
flags |= RTF_CLONING;
break;
@ -750,6 +755,10 @@ newroute(argc, argv)
flags |= RTF_HOST;
if (iflag == 0)
flags |= RTF_GATEWAY;
if (proxy) {
so_dst.sinarp.sin_other = SIN_PROXY;
flags |= RTF_ANNOUNCE;
}
for (attempts = 1; ; attempts++) {
errno = 0;
if ((ret = rtmsg(*cmd, flags)) == 0)