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

📄 if.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lintstatic        char sccsid[] = "@(#)if.c 1.1 92/07/30 Copyr 1986 Sun Micro";#endif#include <sys/param.h>#include "boot/systm.h"#include <sys/socket.h>#include <sys/socketvar.h>#include "boot/protosw.h"#include <sys/dir.h>#include <sys/user.h>#include <sys/kernel.h>#include <sys/ioctl.h>#include <sys/errno.h>#include <net/if.h>#include <net/af.h>#include <net/route.h>#include <net/raw_cb.h>#include <net/nit.h>#include "../netinet/in.h"int     ifqmaxlen = IFQ_MAXLEN;/* * Network interface utility routines. * * Routines with if_ifwith* names take sockaddr *'s as * parameters.  Other routines take value parameters, * e.g. if_ifonnetof takes the network number. */ifinit(){        register struct ifnet *ifp;        for (ifp = ifnet; ifp; ifp = ifp->if_next)                if (ifp->if_init) {                        (*ifp->if_init)(ifp->if_unit);                        if (ifp->if_snd.ifq_maxlen == 0)                                ifp->if_snd.ifq_maxlen = ifqmaxlen;                }}/* * Attach an interface to the * list of "active" interfaces. */if_attach(ifp)        struct ifnet *ifp;{        register struct ifnet **p = &ifnet;         while (*p)                p = &((*p)->if_next);        *p = ifp; 	ifp->if_next = (struct ifnet *)0;}/* * Find an interface using a specific address family */struct ifnet *if_ifwithaf(af)        register int af;{        register struct ifnet *ifp;	register struct ifaddr *ifa;        for (ifp = ifnet; ifp; ifp = ifp->if_next) {	    for (ifa = ifp->if_addrlist; ifa; ifa = ifa->ifa_next) {                if (ifa->ifa_addr.sa_family == af)			return (ifp);	    }	}        return ((struct ifnet *)0);}/* * Find an UP interface using a specific address family */struct ifnet *if_ifwithafup(af)        register int af;{        register struct ifnet *ifp;	register struct ifaddr *ifa;         for (ifp = ifnet; ifp; ifp = ifp->if_next)	   for (ifa = ifp->if_addrlist; ifa; ifa = ifa->ifa_next) {                if ((ifp->if_flags & IFF_UP) && ifa->ifa_addr.sa_family == af)                        return (ifp);	   }        return ((struct ifnet *)0);}/* * Locate an interface based on a complete address. *//*ARGSUSED*/struct ifnet *if_ifwithaddr(addr)        struct sockaddr *addr;{        register struct ifnet *ifp;	register struct ifaddr *ifa; #define equal(a1, a2) \        (bcmp((caddr_t)((a1)->sa_data), (caddr_t)((a2)->sa_data), 14) == 0)        for (ifp = ifnet; ifp; ifp = ifp->if_next) {	    for (ifa = ifp->if_addrlist; ifa; ifa = ifa->ifa_next) {                if (ifa->ifa_addr.sa_family != addr->sa_family)                        continue;                if (equal(&ifa->ifa_addr, addr))			return (ifp);                if ((ifp->if_flags & IFF_BROADCAST) &&                    equal(&ifa->ifa_broadaddr, addr))			return (ifp);	    }        }        return ((struct ifnet *)0);}/* * Locate an interface based on a complete destination. *//*ARGSUSED*/struct ifnet *if_ifwithdstaddr(addr)        struct sockaddr *addr;{        register struct ifnet *ifp;        register struct ifnet *bifp = (struct ifnet *)0;	register struct ifaddr *ifa;        for (ifp = ifnet; ifp; ifp = ifp->if_next) {	    for (ifa = ifp->if_addrlist; ifa; ifa = ifa->ifa_next) {                if (ifa->ifa_addr.sa_family != addr->sa_family)                        continue;                if ((ifp->if_flags & IFF_POINTOPOINT) &&                        equal(&ifa->ifa_dstaddr, addr))			return (ifp);                if (equal(&ifa->ifa_addr, addr))			return (ifp);                if ((ifp->if_flags & IFF_BROADCAST) &&                    equal(&ifa->ifa_broadaddr, addr))                        bifp = ifp;	   }        }        return (ifp==0 ? bifp : ifp);}/* * Find an interface which reaches a specific destination.  If many, choice * is first found. */struct ifnet *if_ifwithnet(addr)        register struct sockaddr *addr;{        register struct ifnet *ifp;        register u_int af = addr->sa_family;        register int (*netmatch)();	register struct ifaddr *ifa;         if (af >= AF_MAX)                return (0);        netmatch = afswitch[af].af_netmatch;        for (ifp = ifnet; ifp; ifp = ifp->if_next) {	    for (ifa = ifp->if_addrlist; ifa; ifa = ifa->ifa_next) {                if (af != ifa->ifa_addr.sa_family)                        continue;                if (ifp->if_flags&IFF_POINTOPOINT) {                        if (equal(&ifa->ifa_dstaddr, addr))				return (ifp);                } else if ((*netmatch)(addr, &ifa->ifa_addr))			return (ifp);	    }        }        return ((struct ifnet *)0);}     /* * Set a new interface address. * Called by ND address assignment as well as above * XXX Most of what the drivers do is device independent! */if_setaddr(ifp, sa)        register struct ifnet *ifp;        struct sockaddr *sa;{        if (ifp->if_ioctl == 0)                return (EOPNOTSUPP);        return ((*ifp->if_ioctl)(ifp, SIOCSIFADDR, (caddr_t)sa));}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -