getifaddrs() and PPP
Andrew Lunn
andrew@lunn.ch
Thu Jun 17 14:21:00 GMT 2004
On Thu, Jun 10, 2004 at 05:16:48PM +0100, Kelvin Lawson wrote:
> Hi Folks,
>
> I've attached a patch for getifaddrs() to enable support for P2P
> destination addresses.
After talking with Kelvin a while i've commited the following patch.
Andrew
-------------- next part --------------
Index: net/common/current/ChangeLog
===================================================================
RCS file: /cvs/ecos/ecos-opt/net/net/common/current/ChangeLog,v
retrieving revision 1.63
diff -u -r1.63 ChangeLog
--- net/common/current/ChangeLog 8 Jun 2004 17:58:20 -0000 1.63
+++ net/common/current/ChangeLog 17 Jun 2004 14:17:58 -0000
@@ -1,3 +1,10 @@
+2004-06-17 Andrew Lunn <andrew.lunn@ascom.ch>
+
+ * src/ifaddrs.c (getifaddrs): Return destination address for P2P
+ devices. Also don't bother trying to get the broadcast address for
+ interfaces that don't have a valid broadcast address. Inspired by
+ Kelvin Lawson
+
2004-06-08 Andrew Lunn <andrew.lunn@ascom.ch>
* include/network.h: Added a __THROW to perror so that it matches
Index: net/common/current/src/ifaddrs.c
===================================================================
RCS file: /cvs/ecos/ecos-opt/net/net/common/current/src/ifaddrs.c,v
retrieving revision 1.5
diff -u -r1.5 ifaddrs.c
--- net/common/current/src/ifaddrs.c 16 Sep 2003 22:05:06 -0000 1.5
+++ net/common/current/src/ifaddrs.c 17 Jun 2004 14:17:59 -0000
@@ -201,7 +201,8 @@
if ((sa->sa_family == AF_INET) || (sa->sa_family == AF_INET6)) {
struct sockaddr *sa_netmask = NULL;
struct sockaddr *sa_broadcast = NULL;
-
+ struct sockaddr *sa_dst = NULL;
+
memset(&ifrq,0,sizeof(ifrq));
strcpy(ifrq.ifr_name,ifr->ifr_name);
ioctl( sock, SIOCGIFFLAGS, &ifrq );
@@ -228,7 +229,7 @@
data += SA_RLEN(sa_netmask);
memcpy(&ifrq.ifr_addr, ift->ifa_addr,sizeof(struct sockaddr));
- if (sa->sa_family == AF_INET) {
+ if ((sa->sa_family == AF_INET) && (ift->ifa_flags & IFF_BROADCAST)) {
if (ioctl(sock, SIOCGIFBRDADDR, &ifrq) == 0) {
sa_broadcast = &ifrq.ifr_addr;
ift->ifa_broadaddr = (struct sockaddr *)data;
@@ -236,7 +237,19 @@
data += SA_RLEN(sa_broadcast);
}
}
+
+ memcpy(&ifrq.ifr_addr, ift->ifa_addr,sizeof(struct sockaddr));
+ if ((sa->sa_family == AF_INET) &&
+ (ift->ifa_flags & IFF_POINTOPOINT)) {
+ if (ioctl(sock, SIOCGIFDSTADDR, &ifrq) == 0) {
+ sa_dst = &ifrq.ifr_addr;
+ ift->ifa_dstaddr = (struct sockaddr *)data;
+ memcpy(data, sa_dst, SA_LEN(sa_dst));
+ data += SA_RLEN(sa_dst);
+ }
+ }
}
+
if (SA_LEN(sa) < sizeof(*sa))
ifr = (struct ifreq *)(((char *)sa) + sizeof(*sa));
else
More information about the Ecos-patches
mailing list