summaryrefslogtreecommitdiff
path: root/zebra
diff options
context:
space:
mode:
Diffstat (limited to 'zebra')
-rw-r--r--zebra/ChangeLog7
-rw-r--r--zebra/kernel_socket.c10
2 files changed, 16 insertions, 1 deletions
diff --git a/zebra/ChangeLog b/zebra/ChangeLog
index 0bf262fb..c346ce1a 100644
--- a/zebra/ChangeLog
+++ b/zebra/ChangeLog
@@ -1,3 +1,10 @@
+2004-01-05 Greg Troxel <gdt@fnord.ir.bbn.com>
+
+ * kernel_socket.c (kernel_read): Add a sockaddr_dl to the ifmsg
+ structure, because on Solaris sockaddr_dl is far larger than the
+ base sockaddr structure. (The code had previously been failing to
+ read all the data.)
+
2004-01-05 Greg Troxel <gdt@ahi.ir.bbn.com>
* kernel_socket.c (kernel_read): Look up interfaces by index
diff --git a/zebra/kernel_socket.c b/zebra/kernel_socket.c
index e2e25d49..59bb023b 100644
--- a/zebra/kernel_socket.c
+++ b/zebra/kernel_socket.c
@@ -872,6 +872,13 @@ kernel_read (struct thread *thread)
int nbytes;
struct rt_msghdr *rtm;
+ /*
+ * This must be big enough for any message the kernel might send.
+ * The code previously used RTAX_MAX struct sockaddrs in all cases,
+ * but now that sockaddrs are variable size, this doesn't work
+ * (Solaris has 244 bytes of sdl_data!). For now, add a struct
+ * sockaddr_dl to the case where it is used.
+ */
union
{
/* Routing information. */
@@ -885,7 +892,8 @@ kernel_read (struct thread *thread)
struct
{
struct if_msghdr ifm;
- struct sockaddr addr[RTAX_MAX];
+ struct sockaddr_dl;
+ struct sockaddr addr[RTAX_MAX-1];
} im;
/* Interface address information. */