⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ppp_vxworks.c

📁 vxworks的tcpip协议栈源码
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -