Add static ARP support.
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Sat, 14 Mar 2009 03:41:35 +0000 (11:41 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Sat, 14 Mar 2009 03:41:35 +0000 (11:41 +0800)
Obtained-from: FreeBSD

sbin/ifconfig/ifconfig.8
sbin/ifconfig/ifconfig.c
sys/net/if.h
sys/netinet/if_ether.c

index 59399c9..0e39068 100644 (file)
@@ -229,6 +229,14 @@ addresses and
 .It Fl arp
 Disable the use of the Address Resolution Protocol
 .Pq Xr arp 4 .
+.It Cm staticarp
+If the Address Resolution Protocol is enabled,
+the host will only reply to requests for its addresses,
+and will never send any requests.
+.It Fl staticarp
+If the Address Resolution Protocol is enabled,
+the host will perform normally,
+sending out requests and listening for replies.
 .It Cm broadcast
 (Inet only.)
 Specify the address to use to represent broadcasts to the
index 6a8ebcf..e04875c 100644 (file)
@@ -1072,10 +1072,8 @@ static struct cmd basic_cmds[] = {
        DEF_CMD("-link2",       -IFF_LINK2,     setifflags),
        DEF_CMD("monitor",      IFF_MONITOR,    setifflags),
        DEF_CMD("-monitor",     -IFF_MONITOR,   setifflags),
-#ifdef notyet
        DEF_CMD("staticarp",    IFF_STATICARP,  setifflags),
        DEF_CMD("-staticarp",   -IFF_STATICARP, setifflags),
-#endif
        DEF_CMD("polling",      IFF_POLLING,    setifflags),
        DEF_CMD("-polling",     -IFF_POLLING,   setifflags),
        DEF_CMD("rxcsum",       IFCAP_RXCSUM,   setifcap),
index 4f2af95..bad78f7 100644 (file)
@@ -137,6 +137,7 @@ struct if_data {
 #define        IFF_POLLING     0x10000         /* Interface is in polling mode. */
 #define        IFF_PPROMISC    0x20000         /* user-requested promisc mode */
 #define        IFF_MONITOR     0x40000         /* user-requested monitor mode */
+#define IFF_STATICARP  0x80000         /* static ARP */
 
 /* flags set internally only: */
 #define        IFF_CANTCHANGE \
index bfb5665..ec2ffa8 100644 (file)
@@ -509,12 +509,12 @@ arpresolve(struct ifnet *ifp, struct rtentry *rt0, struct mbuf *m,
                return 1;
        }
        /*
-        * If ARP is disabled on this interface, stop.
+        * If ARP is disabled or static on this interface, stop.
         * XXX
         * Probably should not allocate empty llinfo struct if we are
         * not going to be sending out an arp request.
         */
-       if (ifp->if_flags & IFF_NOARP) {
+       if (ifp->if_flags & (IFF_NOARP | IFF_STATICARP)) {
                m_freem(m);
                return (0);
        }
@@ -893,6 +893,8 @@ match:
                itaddr = myaddr;
                goto reply;
        }
+       if (ifp->if_flags & IFF_STATICARP)
+               goto reply;
 #ifdef SMP
        netmsg_init(&msg.netmsg, &curthread->td_msgport, 0, 
                    arp_update_msghandler);