interface ip arp

Li, Qing qing.li at bluecoat.com
Mon May 2 08:04:04 UTC 2011


Please give this patch a try for IPv4 ARP

http://people.freebsd.org/~qingli/arp2.patch

--Qing

________________________________________
From: owner-freebsd-net at freebsd.org [owner-freebsd-net at freebsd.org] on behalf of Li, Qing
Sent: Monday, May 02, 2011 12:45 AM
To: Arnaud Lacombe
Cc: freebsd-net at freebsd.org; Ingo Flaschberger
Subject: RE: interface ip arp

Your patch doesn't work because the in_lltable_prefix_free() is  a generic function.

The static entries are kept only when issuing if-down command, however, if the interface
address is being removed, permanent static entries are gone and have to be reinstalled.

I already have a working patch for IPv4, just going over the IPv6 code.

I will post the patch in a few minutes.

-- Qing

________________________________________
From: Arnaud Lacombe [lacombar at gmail.com]
Sent: Monday, May 02, 2011 12:41 AM
To: Li, Qing
Cc: Ingo Flaschberger; freebsd-net at freebsd.org
Subject: Re: interface ip arp

Hi,

On Sun, May 1, 2011 at 10:50 PM, Li, Qing <qing.li at bluecoat.com> wrote:
> jeez, this bug has been around for quite a while ...
>
> Please try patch at  http://people.freebsd.org/~qingli/arp.patch
>
d'oh!... Concerning Ingo's bug, your patch do the job, my report was
bad, 4.9-RELEASE and 7.x show the same behavior:

# uname -a
FreeBSD server 7.1-RELEASE-p13 FreeBSD 7.1-RELEASE-p13
# ifconfig em0 up 192.168.45.200/24
# arp -n 192.168.45.200
? (192.168.45.200) at 00:03:2d:16:6e:fc on em0 permanent [ethernet]
# ifconfig em0 down
# arp -n 192.168.45.200
192.168.45.200 (192.168.45.200) -- no entry
# ifconfig em0 up
# arp -n 192.168.45.200
192.168.45.200 (192.168.45.200) -- no entry

The behavioral change I noticed is that permanent address (manually
added) in the ARP table are flushed along with all other addresses on
>8.x (cf. the script output of my previous mail) while they are kept
in the cache on <7.x during a down/up transition. The following patch:

diff --git a/sys/netinet/in.c b/sys/netinet/in.c
index 1012012..27e44a2 100644
--- a/sys/netinet/in.c
+++ b/sys/netinet/in.c
@@ -1372,6 +1372,8 @@ in_lltable_prefix_free(struct lltable *llt,

        for (i=0; i < LLTBL_HASHTBL_SIZE; i++) {
                LIST_FOREACH_SAFE(lle, &llt->lle_head[i], lle_next, next) {
+                       if (lle->la_flags & LLE_STATIC)
+                               continue;
                        if (IN_ARE_MASKED_ADDR_EQUAL((struct
sockaddr_in *)L3_ADDR(lle),
                                                     pfx, msk)) {

partially restores the old behavior. Only partially as before 8.x,
interface addresses were not marked as 'permanent'. You could manually
add a 'permanent' entry for this address in such a way it would
survive the down/up transition. In 8.x, the interface address is
marked as 'permanent', but is removed explicitly by arp_ifscrub(). So
even the above change would not work for the interface address.

Shouldn't this address be removed later when "removing all L2 entries
on the given prefix", in which case it would not have to be re-added
again, if marking it 'permanent' is deliberate ?

Thanks,
 - Arnaud
_______________________________________________
freebsd-net at freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscribe at freebsd.org"


More information about the freebsd-net mailing list