📄 ppp_vxworks.c
字号:
return 1;}/* * cifaddr - Clear the interface IP addresses, and delete routes * through the interface if possible. */intcifaddr(u, o, h) int u, o, h;{ struct ortentry rt; SET_SA_FAMILY(rt.rt_dst, AF_INET); rt.rt_dst.sa_len = sizeof (struct sockaddr_in); ((struct sockaddr_in *) &rt.rt_dst)->sin_addr.s_addr = h; SET_SA_FAMILY(rt.rt_gateway, AF_INET); rt.rt_gateway.sa_len = sizeof (struct sockaddr_in); ((struct sockaddr_in *) &rt.rt_gateway)->sin_addr.s_addr = o; rt.rt_flags = RTF_HOST; if (ioctl(ppp_if[u]->s, SIOCDELRT, (int) &rt) < 0) { syslog(LOG_WARNING, "ioctl(SIOCDELRT) error"); return 0; } return 1;}/* * sifdefaultroute - assign a default route through the address given. */intsifdefaultroute(u, g) int u, g;{ struct ortentry rt; SET_SA_FAMILY(rt.rt_dst, AF_INET); rt.rt_dst.sa_len = sizeof (struct sockaddr_in); SET_SA_FAMILY(rt.rt_gateway, AF_INET); rt.rt_gateway.sa_len = sizeof (struct sockaddr_in); ((struct sockaddr_in *) &rt.rt_gateway)->sin_addr.s_addr = g; rt.rt_flags = RTF_GATEWAY; if (ioctl(ppp_if[u]->s, SIOCADDRT, (int) &rt) < 0) { syslog(LOG_ERR, "default route ioctl(SIOCADDRT): error"); return 0; } return 1;}/* * cifdefaultroute - delete a default route through the address given. */intcifdefaultroute(u, g) int u, g;{ struct ortentry rt; SET_SA_FAMILY(rt.rt_dst, AF_INET); rt.rt_dst.sa_len = sizeof (struct sockaddr_in); SET_SA_FAMILY(rt.rt_gateway, AF_INET); rt.rt_gateway.sa_len = sizeof (struct sockaddr_in); ((struct sockaddr_in *) &rt.rt_gateway)->sin_addr.s_addr = g; rt.rt_flags = RTF_GATEWAY; if (ioctl(ppp_if[u]->s, SIOCDELRT, (int) &rt) < 0) syslog(LOG_WARNING, "default route ioctl(SIOCDELRT): error"); return 1;}/* * sifproxyarp - Make a proxy ARP entry for the peer. */intsifproxyarp(unit, hisaddr) int unit; u_long hisaddr;{ struct arpreq arpreq; BZERO((char *)&arpreq, sizeof(arpreq)); /* * Get the hardware address of an interface on the same subnet * as our local address. */ if (!get_ether_addr(hisaddr, &arpreq.arp_ha)) { syslog(LOG_ERR, "Cannot determine ethernet address for proxy ARP"); return 0; } SET_SA_FAMILY(arpreq.arp_pa, AF_INET); arpreq.arp_pa.sa_len = sizeof (struct sockaddr_in); ((struct sockaddr_in *) &arpreq.arp_pa)->sin_addr.s_addr = hisaddr; arpreq.arp_flags = ATF_PERM | ATF_PUBL; pppArpCmd (SIOCSARP, &arpreq); return 1;}pppArpCmd ( int cmd, struct arpreq * ar ) { struct sockaddr_in * soInAddr; struct llinfo_arp * la = NULL; struct rtentry * rt = NULL; struct sockaddr_dl * sdl= NULL; if (ar->arp_pa.sa_family != AF_INET || ar->arp_ha.sa_family != AF_UNSPEC) return (EAFNOSUPPORT); soInAddr = (struct sockaddr_in *)&ar->arp_pa; switch (cmd) { case SIOCSARP: { register struct rtentry *rt; static struct sockaddr_inarp sin = {sizeof(sin), AF_INET }; int proxy = 1; int create = 1;#define rt_expire rt_rmx.rmx_expire#define SDL(s) ((struct sockaddr_dl *)s) sin.sin_addr.s_addr = soInAddr->sin_addr.s_addr; sin.sin_other = proxy ? SIN_PROXY : 0; rt = rtalloc1((struct sockaddr *)&sin, create); if (rt == 0) return (0); rt->rt_refcnt--; if ((rt->rt_flags & RTF_GATEWAY) || (rt->rt_flags & RTF_LLINFO) == 0 || rt->rt_gateway->sa_family != AF_LINK) { if (create) logMsg("arptnew failed on %x\n", (int)ntohl(soInAddr->sin_addr.s_addr), 0,0,0,0,0); return (0); } la = (struct llinfo_arp *)rt->rt_llinfo; } rt = la->la_rt; sdl = SDL(rt->rt_gateway); bcopy((caddr_t)ar->arp_ha.sa_data, LLADDR(sdl), sdl->sdl_alen = sizeof(struct ether_addr)); rt->rt_flags &= ~RTF_REJECT; rt->rt_flags |= RTF_STATIC; /* manually added route. */ la->la_asked = 0; break; case SIOCDARP: /* delete entry */ { register struct rtentry *rt; static struct sockaddr_inarp sin = {sizeof(sin), AF_INET }; int proxy = 1; int create = 0; sin.sin_addr.s_addr = soInAddr->sin_addr.s_addr; sin.sin_other = proxy ? SIN_PROXY : 0; rt = rtalloc1((struct sockaddr *)&sin, create); if (rt == 0) return (0); rt->rt_refcnt--; if ((rt->rt_flags & RTF_GATEWAY) || (rt->rt_flags & RTF_LLINFO) == 0 || rt->rt_gateway->sa_family != AF_LINK) { if (create) logMsg("arptnew failed on %x\n", (int)ntohl(soInAddr->sin_addr.s_addr), 0,0,0,0,0); return (0); } la = (struct llinfo_arp *)rt->rt_llinfo; arptfree(la); } break; } }/* * cifproxyarp - Delete the proxy ARP entry for the peer. */intcifproxyarp(unit, hisaddr) int unit; u_long hisaddr;{ struct arpreq arpreq; BZERO((char *)&arpreq, sizeof(arpreq)); SET_SA_FAMILY(arpreq.arp_pa, AF_INET); arpreq.arp_pa.sa_len = sizeof (struct sockaddr_in); ((struct sockaddr_in *) &arpreq.arp_pa)->sin_addr.s_addr = hisaddr; pppArpCmd (SIOCDARP, &arpreq); return 1;}/* * get_ether_addr - get the hardware address of an interface on the * the same subnet as ipaddr. */#define MAX_IFS 32intget_ether_addr(ipaddr, hwaddr) u_long ipaddr; struct sockaddr *hwaddr;{ struct ifnet *ifp; struct ifreq *ifr, *ifend; u_long ina, mask; struct ifreq ifreq; struct ifconf ifc; struct ifreq ifs[MAX_IFS]; ifc.ifc_len = sizeof(ifs); ifc.ifc_req = ifs; if (ioctl(ppp_if[ppp_unit]->s, SIOCGIFCONF, (int) &ifc) < 0) { syslog(LOG_ERR, "ioctl(SIOCGIFCONF) error"); 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; ifr = (struct ifreq *)((char *)ifr + sizeof(ifr->ifr_name) + ifr->ifr_addr.sa_len)) { 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)); /* * Check that the interface is up, and not point-to-point * or loopback. */ if (ioctl(ppp_if[ppp_unit]->s, SIOCGIFFLAGS, (int) &ifreq) < 0) continue; if ((ifreq.ifr_flags & (IFF_UP|IFF_BROADCAST|IFF_POINTOPOINT|IFF_LOOPBACK|IFF_NOARP)) != (IFF_UP|IFF_BROADCAST)) continue; /* * Get its netmask and check that it's on the right subnet. */ if (ioctl(ppp_if[ppp_unit]->s, SIOCGIFNETMASK, (int) &ifreq) < 0) continue; mask = ((struct sockaddr_in *) &ifreq.ifr_addr)->sin_addr.s_addr; if ((ipaddr & mask) != (ina & mask)) continue; break; } } if (ifr >= ifend) return 0; if ((ifp = ifunit (ifr->ifr_name)) == NULL) return 0; syslog(LOG_INFO, "found interface %s for proxy arp", ifr->ifr_name); /* stuff the ethernet hw address for the arp add call */ bcopy ((caddr_t) ((struct arpcom *)ifp)->ac_enaddr, (caddr_t) hwaddr->sa_data, sizeof(((struct arpcom *)ifp)->ac_enaddr)); hwaddr->sa_family = AF_UNSPEC; return 1;}/* * ppp_available - check whether the system has any ppp interfaces * (in fact we check whether we can do an ioctl on ppp0). */intppp_available(){#ifdef notyet int s, ok; struct ifreq ifr; if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) return 1; /* can't tell - maybe we're not root */ strncpy(ifr.ifr_name, "ppp0", sizeof (ifr.ifr_name)); ok = ioctl(s, SIOCGIFFLAGS, (int) &ifr) >= 0; close(s); return ok;#else /* notyet */ return 1;#endif /* notyet */}#ifdef __STDC__#include <stdarg.h>voidsyslog(int level, char *fmt, ...){ va_list pvar; char buf[256]; va_start(pvar, fmt); vsprintf(buf, fmt, pvar); va_end(pvar); printf("ppp%d: %s\r\n", ppp_unit, buf);}#else /* __STDC__ */#include <varargs.h>voidsyslog(level, fmt, va_alist)int level;char *fmt;va_dcl{ va_list pvar; char buf[256]; va_start(pvar); vprintf(fmt, pvar); va_end(pvar); printf("ppp%d: %s\r\n", ppp_unit, buf);}#endif /* __STDC__ */char *stringdup(in)char *in;{ char* dup; if ((dup = (char *)malloc(strlen(in) + 1)) == NULL) return NULL; (void) strcpy(dup, in); return (dup);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -