summaryrefslogtreecommitdiffstats
path: root/usr.sbin/ppp/arp.c
diff options
context:
space:
mode:
authorbrian <brian@FreeBSD.org>1997-08-25 00:29:32 +0000
committerbrian <brian@FreeBSD.org>1997-08-25 00:29:32 +0000
commit1a67d257255b14fb46fc02630bf861a49bebd625 (patch)
tree5a0190bb42d398d91fc5bbdd17de31f54aec2459 /usr.sbin/ppp/arp.c
parentbbf38e6e36ecd35771c55badcb09ca745a61d881 (diff)
downloadFreeBSD-src-1a67d257255b14fb46fc02630bf861a49bebd625.zip
FreeBSD-src-1a67d257255b14fb46fc02630bf861a49bebd625.tar.gz
Make the code format more in line with style(9).
Update loadalias to use the new libalias api. Update to version 1.1.
Diffstat (limited to 'usr.sbin/ppp/arp.c')
-rw-r--r--usr.sbin/ppp/arp.c441
1 files changed, 212 insertions, 229 deletions
diff --git a/usr.sbin/ppp/arp.c b/usr.sbin/ppp/arp.c
index 24f691c..ded4d98 100644
--- a/usr.sbin/ppp/arp.c
+++ b/usr.sbin/ppp/arp.c
@@ -17,7 +17,7 @@
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * $Id: arp.c,v 1.11 1997/04/15 00:03:35 brian Exp $
+ * $Id: arp.c,v 1.12 1997/06/09 03:27:11 brian Exp $
*
*/
@@ -75,156 +75,142 @@ static int get_ether_addr(int, u_long, struct sockaddr_dl *);
* sifproxyarp - Make a proxy ARP entry for the peer.
*/
static struct {
- struct rt_msghdr hdr;
- struct sockaddr_inarp dst;
- struct sockaddr_dl hwa;
- char extra[128];
-} arpmsg;
+ struct rt_msghdr hdr;
+ struct sockaddr_inarp dst;
+ struct sockaddr_dl hwa;
+ char extra[128];
+} arpmsg;
static int arpmsg_valid;
int
-sifproxyarp(unit, hisaddr)
- int unit;
- u_long hisaddr;
+sifproxyarp(int unit, u_long hisaddr)
{
- int routes;
-
- /*
- * Get the hardware address of an interface on the same subnet
- * as our local address.
- */
- memset(&arpmsg, 0, sizeof(arpmsg));
- if (!get_ether_addr(unit, hisaddr, &arpmsg.hwa)) {
- LogPrintf(LogERROR, "Cannot determine ethernet address"
- " for proxy ARP\n");
- return 0;
- }
-
- if ((routes = socket(PF_ROUTE, SOCK_RAW, AF_INET)) < 0) {
- LogPrintf(LogERROR, "sifproxyarp: opening routing socket: %s\n",
- strerror(errno));
- return 0;
- }
-
- arpmsg.hdr.rtm_type = RTM_ADD;
- arpmsg.hdr.rtm_flags = RTF_ANNOUNCE | RTF_HOST | RTF_STATIC;
- arpmsg.hdr.rtm_version = RTM_VERSION;
- arpmsg.hdr.rtm_seq = ++rtm_seq;
- arpmsg.hdr.rtm_addrs = RTA_DST | RTA_GATEWAY;
- arpmsg.hdr.rtm_inits = RTV_EXPIRE;
- arpmsg.dst.sin_len = sizeof(struct sockaddr_inarp);
- arpmsg.dst.sin_family = AF_INET;
- arpmsg.dst.sin_addr.s_addr = hisaddr;
- arpmsg.dst.sin_other = SIN_PROXY;
-
- arpmsg.hdr.rtm_msglen = (char *) &arpmsg.hwa - (char *) &arpmsg
- + arpmsg.hwa.sdl_len;
- if (write(routes, &arpmsg, arpmsg.hdr.rtm_msglen) < 0) {
- LogPrintf(LogERROR, "Add proxy arp entry: %s\n", strerror(errno));
- close(routes);
- return 0;
- }
-
+ int routes;
+
+ /*
+ * Get the hardware address of an interface on the same subnet as our local
+ * address.
+ */
+ memset(&arpmsg, 0, sizeof(arpmsg));
+ if (!get_ether_addr(unit, hisaddr, &arpmsg.hwa)) {
+ LogPrintf(LogERROR, "Cannot determine ethernet address"
+ " for proxy ARP\n");
+ return 0;
+ }
+ if ((routes = socket(PF_ROUTE, SOCK_RAW, AF_INET)) < 0) {
+ LogPrintf(LogERROR, "sifproxyarp: opening routing socket: %s\n",
+ strerror(errno));
+ return 0;
+ }
+ arpmsg.hdr.rtm_type = RTM_ADD;
+ arpmsg.hdr.rtm_flags = RTF_ANNOUNCE | RTF_HOST | RTF_STATIC;
+ arpmsg.hdr.rtm_version = RTM_VERSION;
+ arpmsg.hdr.rtm_seq = ++rtm_seq;
+ arpmsg.hdr.rtm_addrs = RTA_DST | RTA_GATEWAY;
+ arpmsg.hdr.rtm_inits = RTV_EXPIRE;
+ arpmsg.dst.sin_len = sizeof(struct sockaddr_inarp);
+ arpmsg.dst.sin_family = AF_INET;
+ arpmsg.dst.sin_addr.s_addr = hisaddr;
+ arpmsg.dst.sin_other = SIN_PROXY;
+
+ arpmsg.hdr.rtm_msglen = (char *) &arpmsg.hwa - (char *) &arpmsg
+ + arpmsg.hwa.sdl_len;
+ if (write(routes, &arpmsg, arpmsg.hdr.rtm_msglen) < 0) {
+ LogPrintf(LogERROR, "Add proxy arp entry: %s\n", strerror(errno));
close(routes);
- arpmsg_valid = 1;
- return 1;
+ return 0;
+ }
+ close(routes);
+ arpmsg_valid = 1;
+ return 1;
}
/*
* cifproxyarp - Delete the proxy ARP entry for the peer.
*/
int
-cifproxyarp(unit, hisaddr)
- int unit;
- u_long hisaddr;
+cifproxyarp(int unit, u_long hisaddr)
{
- int routes;
+ int routes;
- if (!arpmsg_valid)
- return 0;
- arpmsg_valid = 0;
-
- arpmsg.hdr.rtm_type = RTM_DELETE;
- arpmsg.hdr.rtm_seq = ++rtm_seq;
-
- if ((routes = socket(PF_ROUTE, SOCK_RAW, AF_INET)) < 0) {
- LogPrintf(LogERROR, "sifproxyarp: opening routing socket: %s\n",
- strerror(errno));
- return 0;
- }
+ if (!arpmsg_valid)
+ return 0;
+ arpmsg_valid = 0;
- if (write(routes, &arpmsg, arpmsg.hdr.rtm_msglen) < 0) {
- LogPrintf(LogERROR, "Delete proxy arp entry: %s\n", strerror(errno));
- close(routes);
- return 0;
- }
+ arpmsg.hdr.rtm_type = RTM_DELETE;
+ arpmsg.hdr.rtm_seq = ++rtm_seq;
+ if ((routes = socket(PF_ROUTE, SOCK_RAW, AF_INET)) < 0) {
+ LogPrintf(LogERROR, "sifproxyarp: opening routing socket: %s\n",
+ strerror(errno));
+ return 0;
+ }
+ if (write(routes, &arpmsg, arpmsg.hdr.rtm_msglen) < 0) {
+ LogPrintf(LogERROR, "Delete proxy arp entry: %s\n", strerror(errno));
close(routes);
- return 1;
+ return 0;
+ }
+ close(routes);
+ return 1;
}
-#else /* RTM_VERSION */
+#else /* RTM_VERSION */
/*
* sifproxyarp - Make a proxy ARP entry for the peer.
*/
int
-sifproxyarp(unit, hisaddr)
- int unit;
- u_long hisaddr;
+sifproxyarp(int unit, u_long hisaddr)
{
- struct arpreq arpreq;
- struct {
- struct sockaddr_dl sdl;
- char space[128];
- } dls;
-
- BZERO(&arpreq, sizeof(arpreq));
-
- /*
- * Get the hardware address of an interface on the same subnet
- * as our local address.
- */
- if (!get_ether_addr(unit, hisaddr, &dls.sdl)) {
- LogPrintf(LOG_PHASE_BIT, "Cannot determine ethernet address for proxy ARP\n");
- return 0;
- }
-
- arpreq.arp_ha.sa_len = sizeof(struct sockaddr);
- arpreq.arp_ha.sa_family = AF_UNSPEC;
- BCOPY(LLADDR(&dls.sdl), arpreq.arp_ha.sa_data, dls.sdl.sdl_alen);
- SET_SA_FAMILY(arpreq.arp_pa, AF_INET);
- ((struct sockaddr_in *) &arpreq.arp_pa)->sin_addr.s_addr = hisaddr;
- arpreq.arp_flags = ATF_PERM | ATF_PUBL;
- if (ioctl(unit, SIOCSARP, (caddr_t)&arpreq) < 0) {
- LogPrintf(LogERROR, "sifproxyarp: ioctl(SIOCSARP): \n");
- return 0;
- }
-
- return 1;
+ struct arpreq arpreq;
+ struct {
+ struct sockaddr_dl sdl;
+ char space[128];
+ } dls;
+
+ BZERO(&arpreq, sizeof(arpreq));
+
+ /*
+ * Get the hardware address of an interface on the same subnet as our local
+ * address.
+ */
+ if (!get_ether_addr(unit, hisaddr, &dls.sdl)) {
+ LogPrintf(LOG_PHASE_BIT, "Cannot determine ethernet address for proxy ARP\n");
+ return 0;
+ }
+ arpreq.arp_ha.sa_len = sizeof(struct sockaddr);
+ arpreq.arp_ha.sa_family = AF_UNSPEC;
+ BCOPY(LLADDR(&dls.sdl), arpreq.arp_ha.sa_data, dls.sdl.sdl_alen);
+ SET_SA_FAMILY(arpreq.arp_pa, AF_INET);
+ ((struct sockaddr_in *) & arpreq.arp_pa)->sin_addr.s_addr = hisaddr;
+ arpreq.arp_flags = ATF_PERM | ATF_PUBL;
+ if (ioctl(unit, SIOCSARP, (caddr_t) & arpreq) < 0) {
+ LogPrintf(LogERROR, "sifproxyarp: ioctl(SIOCSARP): \n");
+ return 0;
+ }
+ return 1;
}
/*
* cifproxyarp - Delete the proxy ARP entry for the peer.
*/
int
-cifproxyarp(unit, hisaddr)
- int unit;
- u_long hisaddr;
+cifproxyarp(int unit, u_long hisaddr)
{
- struct arpreq arpreq;
-
- BZERO(&arpreq, sizeof(arpreq));
- SET_SA_FAMILY(arpreq.arp_pa, AF_INET);
- ((struct sockaddr_in *) &arpreq.arp_pa)->sin_addr.s_addr = hisaddr;
- if (ioctl(unit, SIOCDARP, (caddr_t)&arpreq) < 0) {
- LogPrintf(LogERROR, "cifproxyarp: ioctl(SIOCDARP): \n");
- return 0;
- }
- return 1;
+ struct arpreq arpreq;
+
+ BZERO(&arpreq, sizeof(arpreq));
+ SET_SA_FAMILY(arpreq.arp_pa, AF_INET);
+ ((struct sockaddr_in *) & arpreq.arp_pa)->sin_addr.s_addr = hisaddr;
+ if (ioctl(unit, SIOCDARP, (caddr_t) & arpreq) < 0) {
+ LogPrintf(LogERROR, "cifproxyarp: ioctl(SIOCDARP): \n");
+ return 0;
+ }
+ return 1;
}
-#endif /* RTM_VERSION */
+
+#endif /* RTM_VERSION */
/*
@@ -234,87 +220,86 @@ cifproxyarp(unit, hisaddr)
#define MAX_IFS 32
int
-get_ether_addr(s, ipaddr, hwaddr)
- int s;
- u_long ipaddr;
- struct sockaddr_dl *hwaddr;
+get_ether_addr(int s, u_long ipaddr, struct sockaddr_dl * hwaddr)
{
- struct ifreq *ifr, *ifend, *ifp;
- u_long ina, mask;
- struct sockaddr_dl *dla;
- struct ifreq ifreq;
- struct ifconf ifc;
- struct ifreq ifs[MAX_IFS];
-
- ifc.ifc_len = sizeof(ifs);
- ifc.ifc_req = ifs;
- if (ioctl(s, SIOCGIFCONF, &ifc) < 0) {
- LogPrintf(LogERROR, "get_ether_addr: ioctl(SIOCGIFCONF): \n");
- return 0;
- }
+ struct ifreq *ifr, *ifend, *ifp;
+ u_long ina, mask;
+ struct sockaddr_dl *dla;
+ struct ifreq ifreq;
+ struct ifconf ifc;
+ struct ifreq ifs[MAX_IFS];
+
+ ifc.ifc_len = sizeof(ifs);
+ ifc.ifc_req = ifs;
+ if (ioctl(s, SIOCGIFCONF, &ifc) < 0) {
+ LogPrintf(LogERROR, "get_ether_addr: ioctl(SIOCGIFCONF): \n");
+ return 0;
+ }
- /*
- * Scan through looking for an interface with an Internet
- * address on the same subnet as `ipaddr'.
- */
- ifend = (struct ifreq *) (ifc.ifc_buf + ifc.ifc_len);
- for (ifr = ifc.ifc_req; ifr < ifend; ) {
- if (ifr->ifr_addr.sa_family == AF_INET) {
- ina = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr.s_addr;
- strncpy(ifreq.ifr_name, ifr->ifr_name, sizeof(ifreq.ifr_name));
- ifreq.ifr_name[sizeof(ifreq.ifr_name)-1]='\0';
- /*
- * Check that the interface is up, and not point-to-point
- * or loopback.
- */
- if (ioctl(s, SIOCGIFFLAGS, &ifreq) < 0)
- continue;
- if ((ifreq.ifr_flags &
- (IFF_UP|IFF_BROADCAST|IFF_POINTOPOINT|IFF_LOOPBACK|IFF_NOARP))
- != (IFF_UP|IFF_BROADCAST))
- goto nextif;
- /*
- * Get its netmask and check that it's on the right subnet.
- */
- if (ioctl(s, SIOCGIFNETMASK, &ifreq) < 0)
- continue;
- mask = ((struct sockaddr_in *) &ifreq.ifr_addr)->sin_addr.s_addr;
- if ((ipaddr & mask) != (ina & mask))
- goto nextif;
-
- break;
- }
-nextif:
- ifr = (struct ifreq *) ((char *)&ifr->ifr_addr + ifr->ifr_addr.sa_len);
+ /*
+ * Scan through looking for an interface with an Internet address on the
+ * same subnet as `ipaddr'.
+ */
+ ifend = (struct ifreq *) (ifc.ifc_buf + ifc.ifc_len);
+ for (ifr = ifc.ifc_req; ifr < ifend;) {
+ if (ifr->ifr_addr.sa_family == AF_INET) {
+ ina = ((struct sockaddr_in *) & ifr->ifr_addr)->sin_addr.s_addr;
+ strncpy(ifreq.ifr_name, ifr->ifr_name, sizeof(ifreq.ifr_name));
+ ifreq.ifr_name[sizeof(ifreq.ifr_name) - 1] = '\0';
+
+ /*
+ * Check that the interface is up, and not point-to-point or loopback.
+ */
+ if (ioctl(s, SIOCGIFFLAGS, &ifreq) < 0)
+ continue;
+ if ((ifreq.ifr_flags &
+ (IFF_UP | IFF_BROADCAST | IFF_POINTOPOINT | IFF_LOOPBACK | IFF_NOARP))
+ != (IFF_UP | IFF_BROADCAST))
+ goto nextif;
+
+ /*
+ * Get its netmask and check that it's on the right subnet.
+ */
+ if (ioctl(s, SIOCGIFNETMASK, &ifreq) < 0)
+ continue;
+ mask = ((struct sockaddr_in *) & ifreq.ifr_addr)->sin_addr.s_addr;
+ if ((ipaddr & mask) != (ina & mask))
+ goto nextif;
+
+ break;
}
+nextif:
+ ifr = (struct ifreq *) ((char *) &ifr->ifr_addr + ifr->ifr_addr.sa_len);
+ }
- if (ifr >= ifend)
- return 0;
- LogPrintf(LogPHASE, "Found interface %s for proxy arp\n", ifr->ifr_name);
-
- /*
- * Now scan through again looking for a link-level address
- * for this interface.
- */
- ifp = ifr;
- for (ifr = ifc.ifc_req; ifr < ifend; ) {
- if (strcmp(ifp->ifr_name, ifr->ifr_name) == 0
- && ifr->ifr_addr.sa_family == AF_LINK) {
- /*
- * Found the link-level address - copy it out
- */
- dla = (struct sockaddr_dl *) &ifr->ifr_addr;
+ if (ifr >= ifend)
+ return 0;
+ LogPrintf(LogPHASE, "Found interface %s for proxy arp\n", ifr->ifr_name);
+
+ /*
+ * Now scan through again looking for a link-level address for this
+ * interface.
+ */
+ ifp = ifr;
+ for (ifr = ifc.ifc_req; ifr < ifend;) {
+ if (strcmp(ifp->ifr_name, ifr->ifr_name) == 0
+ && ifr->ifr_addr.sa_family == AF_LINK) {
+
+ /*
+ * Found the link-level address - copy it out
+ */
+ dla = (struct sockaddr_dl *) & ifr->ifr_addr;
#ifdef __bsdi__
- if (dla->sdl_alen == 0)
- kmemgetether(ifr->ifr_name, dla);
+ if (dla->sdl_alen == 0)
+ kmemgetether(ifr->ifr_name, dla);
#endif
- BCOPY(dla, hwaddr, dla->sdl_len);
- return 1;
- }
- ifr = (struct ifreq *) ((char *)&ifr->ifr_addr + ifr->ifr_addr.sa_len);
+ BCOPY(dla, hwaddr, dla->sdl_len);
+ return 1;
}
+ ifr = (struct ifreq *) ((char *) &ifr->ifr_addr + ifr->ifr_addr.sa_len);
+ }
- return 0;
+ return 0;
}
#ifdef __bsdi__
@@ -322,8 +307,8 @@ nextif:
struct nlist nl[] = {
#define N_IFNET 0
- { "_ifnet" },
- "",
+ {"_ifnet"},
+ "",
};
@@ -333,10 +318,7 @@ kvm_t *kvmd;
* Read kernel memory, return 0 on success.
*/
int
-kread(addr, buf, size)
- u_long addr;
- char *buf;
- int size;
+kread(u_long addr, char *buf, int size)
{
if (kvm_read(kvmd, addr, buf, size) != size) {
/* XXX this duplicates kvm_read's error printout */
@@ -346,21 +328,20 @@ kread(addr, buf, size)
return 0;
}
-kmemgetether(ifname, dlo)
-char *ifname;
-struct sockaddr_dl *dlo;
+void
+kmemgetether(char *ifname, struct sockaddr_dl * dlo)
{
struct ifnet ifnet;
int n;
u_long addr, ifaddraddr, ifnetfound, ifaddrfound;
- char name[16+32];
+ char name[16 + 32];
struct sockaddr *sa;
char *cp;
struct sockaddr_dl *sdl;
union {
- struct ifaddr ifa;
- struct in_ifaddr in;
- } ifaddr;
+ struct ifaddr ifa;
+ struct in_ifaddr in;
+ } ifaddr;
struct arpcom ac;
kvmd = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL);
@@ -368,62 +349,64 @@ struct sockaddr_dl *dlo;
n = kvm_nlist(kvmd, nl);
if (n >= 0) {
addr = nl[N_IFNET].n_value;
- kread(addr, (char *)&addr, sizeof(addr));
+ kread(addr, (char *) &addr, sizeof(addr));
ifaddraddr = ifnetfound = 0;
while (addr || ifaddraddr) {
ifnetfound = addr;
if (ifaddraddr == 0) {
- if (kread(addr, (char *)&ifnet, sizeof(ifnet)) ||
- kread((u_long)ifnet.if_name, name, 16))
- return;
+ if (kread(addr, (char *) &ifnet, sizeof(ifnet)) ||
+ kread((u_long) ifnet.if_name, name, 16))
+ return;
name[15] = 0;
addr = (u_long) ifnet.if_next;
- cp = (char *)index(name, '\0');
+ cp = (char *) index(name, '\0');
cp += sprintf(cp, "%d", ifnet.if_unit);
*cp = '\0';
- ifaddraddr = (u_long)ifnet.if_addrlist;
+ ifaddraddr = (u_long) ifnet.if_addrlist;
}
ifaddrfound = ifaddraddr;
if (ifaddraddr) {
- if (kread(ifaddraddr, (char *)&ifaddr, sizeof ifaddr)) {
+ if (kread(ifaddraddr, (char *) &ifaddr, sizeof ifaddr)) {
ifaddraddr = 0;
continue;
}
#define CP(x) ((char *)(x))
cp = (CP(ifaddr.ifa.ifa_addr) - CP(ifaddraddr)) + CP(&ifaddr);
- sa = (struct sockaddr *)cp;
+ sa = (struct sockaddr *) cp;
if (sa->sa_family == AF_LINK && strcmp(ifname, name) == 0) {
- sdl = (struct sockaddr_dl *)sa;
- cp = (char *)LLADDR(sdl);
+ sdl = (struct sockaddr_dl *) sa;
+ cp = (char *) LLADDR(sdl);
n = sdl->sdl_alen;
if (ifnet.if_type == IFT_ETHER) {
- if (n == 0) {
- kread(ifnetfound, (char *)&ac, sizeof(ac));
- cp = (char *)LLADDR(sdl);
- bcopy((char *)ac.ac_enaddr, cp, 6);
- sdl->sdl_alen = 6;
- }
- bcopy(sdl, dlo, sizeof(*sdl));
- return;
+ if (n == 0) {
+ kread(ifnetfound, (char *) &ac, sizeof(ac));
+ cp = (char *) LLADDR(sdl);
+ bcopy((char *) ac.ac_enaddr, cp, 6);
+ sdl->sdl_alen = 6;
+ }
+ bcopy(sdl, dlo, sizeof(*sdl));
+ return;
}
}
- ifaddraddr = (u_long)ifaddr.ifa.ifa_next;
+ ifaddraddr = (u_long) ifaddr.ifa.ifa_next;
}
}
}
}
}
+
#endif
#ifdef DEBUG
main()
{
- u_long ipaddr;
- int s;
+ u_long ipaddr;
+ int s;
- s = socket(AF_INET, SOCK_DGRAM, 0);
- ipaddr = inet_addr("192.168.1.32");
- sifproxyarp(s, ipaddr);
- close(s);
+ s = socket(AF_INET, SOCK_DGRAM, 0);
+ ipaddr = inet_addr("192.168.1.32");
+ sifproxyarp(s, ipaddr);
+ close(s);
}
+
#endif
OpenPOWER on IntegriCloud