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

📄 in.c

📁 很好的一个嵌入式linux平台下的bootloader
💻 C
📖 第 1 页 / 共 2 页
字号:
				in_ifaddr = mtod(m, struct in_ifaddr *);			ia = mtod(m, struct in_ifaddr *);			if (ifa = ifp->if_addrlist) {				for ( ; ifa->ifa_next; ifa = ifa->ifa_next)					;				ifa->ifa_next = (struct ifaddr *) ia;			} else				ifp->if_addrlist = (struct ifaddr *) ia;			ia->ia_ifa.ifa_addr = (struct sockaddr *)&ia->ia_addr;			ia->ia_ifa.ifa_dstaddr					= (struct sockaddr *)&ia->ia_dstaddr;			ia->ia_ifa.ifa_netmask					= (struct sockaddr *)&ia->ia_sockmask;			ia->ia_sockmask.sin_len = 8;			if (ifp->if_flags & IFF_BROADCAST) {				ia->ia_broadaddr.sin_len = sizeof(ia->ia_addr);				ia->ia_broadaddr.sin_family = AF_INET;			}			ia->ia_ifp = ifp;			if (ifp != &loif)				in_interfaces++;		}		break;	case SIOCSIFBRDADDR:		if ((so->so_state & SS_PRIV) == 0)			return (EPERM);		/* FALLTHROUGH */	case SIOCGIFADDR:	case SIOCGIFNETMASK:	case SIOCGIFDSTADDR:	case SIOCGIFBRDADDR:		if (ia == (struct in_ifaddr *)0)			return (EADDRNOTAVAIL);		break;	default:		return (EOPNOTSUPP);		break;	}	switch (cmd) {	case SIOCGIFADDR:		*((struct sockaddr_in *)&ifr->ifr_addr) = ia->ia_addr;		break;	case SIOCGIFBRDADDR:		if ((ifp->if_flags & IFF_BROADCAST) == 0)			return (EINVAL);		*((struct sockaddr_in *)&ifr->ifr_dstaddr) = ia->ia_broadaddr;		break;	case SIOCGIFDSTADDR:		if ((ifp->if_flags & IFF_POINTOPOINT) == 0)			return (EINVAL);		*((struct sockaddr_in *)&ifr->ifr_dstaddr) = ia->ia_dstaddr;		break;	case SIOCGIFNETMASK:		*((struct sockaddr_in *)&ifr->ifr_addr) = ia->ia_sockmask;		break;	case SIOCSIFDSTADDR:		if ((ifp->if_flags & IFF_POINTOPOINT) == 0)			return (EINVAL);		oldaddr = ia->ia_dstaddr;		ia->ia_dstaddr = *(struct sockaddr_in *)&ifr->ifr_dstaddr;		if (ifp->if_ioctl &&		    (error = (*ifp->if_ioctl)(ifp, SIOCSIFDSTADDR, ia))) {			ia->ia_dstaddr = oldaddr;			return (error);		}		if (ia->ia_flags & IFA_ROUTE) {			ia->ia_ifa.ifa_dstaddr = (struct sockaddr *)&oldaddr;			rtinit(&(ia->ia_ifa), (int)RTM_DELETE, RTF_HOST);			ia->ia_ifa.ifa_dstaddr =					(struct sockaddr *)&ia->ia_dstaddr;			rtinit(&(ia->ia_ifa), (int)RTM_ADD, RTF_HOST|RTF_UP);		}		break;	case SIOCSIFBRDADDR:		if ((ifp->if_flags & IFF_BROADCAST) == 0)			return (EINVAL);		ia->ia_broadaddr = *(struct sockaddr_in *)&ifr->ifr_broadaddr;		break;	case SIOCSIFADDR:		return (in_ifinit(ifp, ia,		    (struct sockaddr_in *) &ifr->ifr_addr, 1));	case SIOCSIFNETMASK:		i = ifra->ifra_addr.sin_addr.s_addr;		ia->ia_subnetmask = ntohl(ia->ia_sockmask.sin_addr.s_addr = i);		break;	case SIOCAIFADDR:		maskIsNew = 0;		hostIsNew = 1;		error = 0;		if (ia->ia_addr.sin_family == AF_INET) {			if (ifra->ifra_addr.sin_len == 0) {				ifra->ifra_addr = ia->ia_addr;				hostIsNew = 0;			} else if (ifra->ifra_addr.sin_addr.s_addr ==					       ia->ia_addr.sin_addr.s_addr)				hostIsNew = 0;		}		if (ifra->ifra_mask.sin_len) {			in_ifscrub(ifp, ia);			ia->ia_sockmask = ifra->ifra_mask;			ia->ia_subnetmask =			     ntohl(ia->ia_sockmask.sin_addr.s_addr);			maskIsNew = 1;		}		if ((ifp->if_flags & IFF_POINTOPOINT) &&		    (ifra->ifra_dstaddr.sin_family == AF_INET)) {			in_ifscrub(ifp, ia);			ia->ia_dstaddr = ifra->ifra_dstaddr;			maskIsNew  = 1; /* We lie; but the effect's the same */		}		if (ifra->ifra_addr.sin_family == AF_INET &&		    (hostIsNew || maskIsNew))			error = in_ifinit(ifp, ia, &ifra->ifra_addr, 0);		if ((ifp->if_flags & IFF_BROADCAST) &&		    (ifra->ifra_broadaddr.sin_family == AF_INET))			ia->ia_broadaddr = ifra->ifra_broadaddr;		return (error);	case SIOCDIFADDR:		in_ifscrub(ifp, ia);		if ((ifa = ifp->if_addrlist) == (struct ifaddr *)ia)			ifp->if_addrlist = ifa->ifa_next;		else {			while (ifa->ifa_next &&			       (ifa->ifa_next != (struct ifaddr *)ia))				    ifa = ifa->ifa_next;			if (ifa->ifa_next)				ifa->ifa_next = ((struct ifaddr *)ia)->ifa_next;			else				printf("Couldn't unlink inifaddr from ifp\n");		}		oia = ia;		if (oia == (ia = in_ifaddr))			in_ifaddr = ia->ia_next;		else {			while (ia->ia_next && (ia->ia_next != oia))				ia = ia->ia_next;			if (ia->ia_next)				ia->ia_next = oia->ia_next;			else				printf("Didn't unlink inifadr from list\n");		}		(void) m_free(dtom(oia));		break;	default:		if (ifp == 0 || ifp->if_ioctl == 0)			return (EOPNOTSUPP);		return ((*ifp->if_ioctl)(ifp, cmd, data));	}	return (0);}/* * Delete any existing route for an interface. */in_ifscrub(ifp, ia)	register struct ifnet *ifp;	register struct in_ifaddr *ia;{	if ((ia->ia_flags & IFA_ROUTE) == 0)		return;	if (ifp->if_flags & (IFF_LOOPBACK|IFF_POINTOPOINT))		rtinit(&(ia->ia_ifa), (int)RTM_DELETE, RTF_HOST);	else		rtinit(&(ia->ia_ifa), (int)RTM_DELETE, 0);	ia->ia_flags &= ~IFA_ROUTE;}/* * Initialize an interface's internet address * and routing table entry. */in_ifinit(ifp, ia, sin, scrub)	register struct ifnet *ifp;	register struct in_ifaddr *ia;	struct sockaddr_in *sin;{	register u_long i = ntohl(sin->sin_addr.s_addr);	struct sockaddr_in oldaddr;	int s = splimp(), error, flags = RTF_UP;	oldaddr = ia->ia_addr;	ia->ia_addr = *sin;	/*	 * Give the interface a chance to initialize	 * if this is its first address,	 * and to validate the address if necessary.	 */	if (ifp->if_ioctl && (error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, ia))) {		splx(s);		ia->ia_addr = oldaddr;		return (error);	}	splx(s);	if (scrub) {		ia->ia_ifa.ifa_addr = (struct sockaddr *)&oldaddr;		in_ifscrub(ifp, ia);		ia->ia_ifa.ifa_addr = (struct sockaddr *)&ia->ia_addr;	}	if (IN_CLASSA(i))		ia->ia_netmask = IN_CLASSA_NET;	else if (IN_CLASSB(i))		ia->ia_netmask = IN_CLASSB_NET;	else		ia->ia_netmask = IN_CLASSC_NET;	ia->ia_net = i & ia->ia_netmask;	/*	 * The subnet mask includes at least the standard network part,	 * but may already have been set to a larger value.	 */	ia->ia_subnetmask |= ia->ia_netmask;	ia->ia_subnet = i & ia->ia_subnetmask;	ia->ia_sockmask.sin_addr.s_addr = htonl(ia->ia_subnetmask);	{		register char *cp = (char *) (1 + &(ia->ia_sockmask.sin_addr));		register char *cpbase = (char *) &(ia->ia_sockmask.sin_addr);		while (--cp >= cpbase)			if (*cp) {				ia->ia_sockmask.sin_len =					1 + cp - (char *) &(ia->ia_sockmask);				break;			}	}	/*	 * Add route for the network.	 */	if (ifp->if_flags & IFF_BROADCAST) {		ia->ia_broadaddr.sin_addr = 			in_makeaddr(ia->ia_subnet, INADDR_BROADCAST);		ia->ia_netbroadcast.s_addr =		    htonl(ia->ia_net | (INADDR_BROADCAST &~ ia->ia_netmask));	} else if (ifp->if_flags & IFF_LOOPBACK) {		ia->ia_ifa.ifa_dstaddr = ia->ia_ifa.ifa_addr;		flags |= RTF_HOST;	} else if (ifp->if_flags & IFF_POINTOPOINT) {		if (ia->ia_dstaddr.sin_family != AF_INET)			return (0);		flags |= RTF_HOST;	}	if ((error = rtinit(&(ia->ia_ifa), (int)RTM_ADD, flags)) == 0)		ia->ia_flags |= IFA_ROUTE;	return (error);}/* * Return address info for specified internet network. */struct in_ifaddr *in_iaonnetof(net)	u_long net;{	register struct in_ifaddr *ia;	for (ia = in_ifaddr; ia; ia = ia->ia_next)		if (ia->ia_subnet == net)			return (ia);	return ((struct in_ifaddr *)0);}/* * Return 1 if the address might be a local broadcast address. */struct in_ifaddr *in_broadcast(in)	struct in_addr in;{	register struct in_ifaddr *ia;	u_long t;	/*	 * Look through the list of addresses for a match	 * with a broadcast address.	 */	for (ia = in_ifaddr; ia; ia = ia->ia_next)	    if (ia->ia_ifp->if_flags & IFF_BROADCAST) {		if (ia->ia_broadaddr.sin_addr.s_addr == in.s_addr)		     return (ia);		/*		 * Check for old-style (host 0) broadcast.		 */		if ((t = ntohl(in.s_addr)) == ia->ia_subnet || t == ia->ia_net)		    return (ia);	}	if (in.s_addr == INADDR_BROADCAST || in.s_addr == INADDR_ANY)		return (in_ifaddr);	return ((struct in_ifaddr *)0);}#endif

⌨️ 快捷键说明

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