freebsd-ports/devel/libpdel/files/patch-arp
2009-03-10 19:27:14 +00:00

195 lines
5 KiB
Text

--- net/uroute.c.prev 2005-01-21 23:02:03.000000000 +0200
+++ net/uroute.c 2008-12-24 21:34:43.000000000 +0200
@@ -74,9 +74,15 @@
((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
#define ADVANCE(x, n) ((x) += ROUNDUP((n)->sa_len))
+#ifdef RTF_CLONING
#define WRITABLE_FLAGS (RTF_STATIC | RTF_LLINFO | RTF_REJECT | RTF_BLACKHOLE \
| RTF_PROTO1 | RTF_PROTO2 | RTF_CLONING \
| RTF_XRESOLVE | RTF_UP | RTF_GATEWAY)
+#else
+#define WRITABLE_FLAGS (RTF_STATIC | RTF_REJECT | RTF_BLACKHOLE \
+ | RTF_PROTO1 | RTF_PROTO2 \
+ | RTF_XRESOLVE | RTF_UP | RTF_GATEWAY)
+#endif
struct route_flag {
const char *name;
@@ -92,15 +98,21 @@ static const struct route_flag route_fla
FLAG(DYNAMIC),
FLAG(MODIFIED),
FLAG(DONE),
+#ifdef RTF_CLONING
FLAG(CLONING),
+#endif
FLAG(XRESOLVE),
+#ifdef RTF_LLINFO
FLAG(LLINFO),
+#endif
FLAG(STATIC),
FLAG(BLACKHOLE),
FLAG(PROTO2),
FLAG(PROTO1),
FLAG(PRCLONING),
+#ifdef RTF_WASCLONED
FLAG(WASCLONED),
+#endif
FLAG(PROTO3),
FLAG(PINNED),
FLAG(LOCAL),
--- net/if_arp.c.prev 2005-01-21 23:02:02.000000000 +0200
+++ net/if_arp.c 2008-12-24 23:01:46.000000000 +0200
@@ -68,7 +68,6 @@
#include "structs/type/array.h"
#include "net/if_util.h"
-#include "net/uroute.h"
#include "util/typed_mem.h"
#define ROUNDUP(a) \
@@ -124,7 +123,11 @@ if_get_arp(struct in_addr ip, u_char *et
mib[2] = 0;
mib[3] = AF_INET;
mib[4] = NET_RT_FLAGS;
+#ifdef RTF_LLINFO
mib[5] = RTF_LLINFO;
+#else
+ mib[5] = 0;
+#endif
if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0)
return (-1);
needed += 128;
@@ -227,9 +230,11 @@ tryagain:
sdl = (struct sockaddr_dl *)(void *)
(ROUNDUP(sin->sin_len) + (char *)sin);
if (sin->sin_addr.s_addr == sin_m.sin_addr.s_addr) {
- if (sdl->sdl_family == AF_LINK
- && (rtm->rtm_flags & (RTF_LLINFO|RTF_GATEWAY))
- == RTF_LLINFO) {
+ if (sdl->sdl_family == AF_LINK &&
+#ifdef RTF_LLINFO
+ (rtm->rtm_flags & RTF_LLINFO) != 0 &&
+#endif
+ (rtm->rtm_flags & RTF_GATEWAY) == 0) {
switch (sdl->sdl_type) {
case IFT_ETHER:
case IFT_FDDI:
@@ -278,6 +283,7 @@ arp_delete(int sock, struct in_addr ip)
struct rt_msghdr *const rtm = &m_rtmsg.m_rtm;
struct sockaddr_dl *sdl;
+ sdl_m = zero_sdl;
sin_m = zero_sin;
sin->sin_addr = ip;
tryagain:
@@ -286,14 +292,15 @@ tryagain:
sin = (struct sockaddr_inarp *)(rtm + 1);
sdl = (struct sockaddr_dl *)(void *)
(ROUNDUP(sin->sin_len) + (char *)sin);
- if (sin->sin_addr.s_addr == sin_m.sin_addr.s_addr) {
- if (sdl->sdl_family == AF_LINK &&
- (rtm->rtm_flags & RTF_LLINFO) &&
- !(rtm->rtm_flags & RTF_GATEWAY)) switch (sdl->sdl_type) {
+ if (sdl->sdl_family == AF_LINK &&
+#ifdef RTF_LLINFO
+ (rtm->rtm_flags & RTF_LLINFO) &&
+#endif
+ !(rtm->rtm_flags & RTF_GATEWAY)) switch (sdl->sdl_type) {
case IFT_ETHER: case IFT_FDDI: case IFT_ISO88023:
case IFT_ISO88024: case IFT_ISO88025:
+ sin->sin_addr.s_addr = sin_m.sin_addr.s_addr;
goto delete;
- }
}
if (sin_m.sin_other & SIN_PROXY) {
errno = ENOENT;
@@ -384,42 +391,55 @@ int
if_flush_arp(void)
{
int errno_save = errno;
- struct uroute **list;
- int rtn = 0;
- int num;
- int i;
-
- /* Get list of routes */
- if ((num = uroute_get_all(&list, TYPED_MEM_TEMP)) == -1)
- return (-1);
-
- /* Delete ARP routes */
- for (i = 0; i < num; i++) {
- struct uroute *const route = list[i];
- const struct sockaddr *dest;
- const struct sockaddr *gw;
-
- /* Is this an ARP entry? */
- dest = uroute_get_dest(route);
- gw = uroute_get_gateway(route);
- if ((uroute_get_flags(route)
- & (RTF_HOST|RTF_LLINFO|RTF_WASCLONED))
- != (RTF_HOST|RTF_LLINFO|RTF_WASCLONED)
- || dest->sa_family != AF_INET
- || gw->sa_family != AF_LINK)
- continue;
+ int mib[6];
+ size_t needed;
+ char *lim, *buf, *next;
+ struct rt_msghdr *rtm;
+ struct sockaddr_inarp *sin;
+ struct sockaddr_dl *sdl;
+ int sock, rtn = -1;
- /* Delete it */
- if (uroute_delete(route) == -1) {
- errno_save = errno;
- rtn = -1;
- }
+ /* Get socket */
+ if ((sock = socket(PF_ROUTE, SOCK_RAW, 0)) == -1)
+ return (-1);
+
+ /* Get ARP table */
+ mib[0] = CTL_NET;
+ mib[1] = PF_ROUTE;
+ mib[2] = 0;
+ mib[3] = AF_INET;
+ mib[4] = NET_RT_FLAGS;
+#ifdef RTF_LLINFO
+ mib[5] = RTF_LLINFO;
+#else
+ mib[5] = 0;
+#endif
+ if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0)
+ goto done;
+ needed += 128;
+ if ((buf = MALLOC(TYPED_MEM_TEMP, needed)) == NULL)
+ goto done;
+ if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) {
+ goto done2;
+ }
+
+ /* Find desired entry */
+ lim = buf + needed;
+ for (next = buf; next < lim; next += rtm->rtm_msglen) {
+ rtm = (struct rt_msghdr *)(void *)next;
+ sin = (struct sockaddr_inarp *)(rtm + 1);
+ sdl = (struct sockaddr_dl *)(void *)
+ ((char *)sin + ROUNDUP(sin->sin_len));
+ if (sdl->sdl_alen == 0)
+ break;
+ arp_delete(sock, sin->sin_addr);
}
- /* Clean up */
- while (num > 0)
- uroute_destroy(&list[--num]);
- FREE(TYPED_MEM_TEMP, list);
+ rtn = 0;
+done2:
+ FREE(TYPED_MEM_TEMP, buf);
+done:
+ (void)close(sock);
errno = errno_save;
return (rtn);
}