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

📄 ifenslave.c

📁 嵌入式系统设计与实验教材二源码linux内核移植与编译
💻 C
📖 第 1 页 / 共 2 页
字号:
			}		}		else {  /* attach a slave interface to the master */			/* two possibilities :			   - if hwaddr_notset, do nothing.  The bond will assign the			     hwaddr from it's first slave.			   - if !hwaddr_notset, assign the master's hwaddr to each slave			*/				if (hwaddr_notset) { /* we do nothing */			}			else {  /* we'll assign master's hwaddr to this slave */				strncpy(ifr2.ifr_name, slave_ifname, IFNAMSIZ);				if (ioctl(skfd, SIOCGIFFLAGS, &ifr2) < 0) {					int saved_errno = errno;					fprintf(stderr, "SIOCGIFFLAGS on %s failed: %s\n", slave_ifname,							strerror(saved_errno));					return 1;				}					if (ifr2.ifr_flags & IFF_UP) {					ifr2.ifr_flags &= ~IFF_UP;					if (ioctl(skfd, SIOCSIFFLAGS, &ifr2) < 0) {						int saved_errno = errno;						fprintf(stderr, "Shutting down interface %s failed: %s\n",								slave_ifname, strerror(saved_errno));					}				}					strncpy(if_hwaddr.ifr_name, slave_ifname, IFNAMSIZ);				if (ioctl(skfd, SIOCSIFHWADDR, &if_hwaddr) < 0) {					int saved_errno = errno;					fprintf(stderr, "SIOCSIFHWADDR on %s failed: %s\n", if_hwaddr.ifr_name,							strerror(saved_errno));					if (saved_errno == EBUSY)						fprintf(stderr, "  The slave device %s is busy: it must be"								" idle before running this command.\n", slave_ifname);					else if (saved_errno == EOPNOTSUPP)						fprintf(stderr, "  The slave device you specified does not support"								" setting the MAC address.\n  Your kernel likely does not"								" support slave devices.\n");					else if (saved_errno == EINVAL)						fprintf(stderr, "  The slave device's address type does not match"								" the master's address type.\n");				} else {					if (verbose) {						unsigned char *hwaddr = if_hwaddr.ifr_hwaddr.sa_data;						printf("Slave's (%s) hardware address set to "							   "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.\n", slave_ifname,							   hwaddr[0], hwaddr[1], hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]);					}				}			}				if (*spp  &&  !strcmp(*spp, "metric")) {				if (*++spp == NULL) {					fprintf(stderr, usage_msg);					exit(2);				}				if_metric.ifr_metric = atoi(*spp);				strncpy(if_metric.ifr_name, slave_ifname, IFNAMSIZ);				if (ioctl(skfd, SIOCSIFMETRIC, &if_metric) < 0) {					fprintf(stderr, "SIOCSIFMETRIC on %s: %s\n", slave_ifname,							strerror(errno));					goterr = 1;				}				spp++;			}				if (strncpy(if_ipaddr.ifr_name, slave_ifname, IFNAMSIZ) <= 0				|| ioctl(skfd, SIOCSIFADDR, &if_ipaddr) < 0) {				fprintf(stderr,						"Something broke setting the slave's address: %s.\n",						strerror(errno));			} else {				if (verbose) {					unsigned char *ipaddr = if_ipaddr.ifr_addr.sa_data;					printf("Set the slave's (%s) IP address to %d.%d.%d.%d.\n",						   slave_ifname, ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);				}			}				if (strncpy(if_mtu.ifr_name, slave_ifname, IFNAMSIZ) <= 0				|| ioctl(skfd, SIOCSIFMTU, &if_mtu) < 0) { 				fprintf(stderr, "Something broke setting the slave MTU: %s.\n",						strerror(errno));			} else {				if (verbose)					printf("Set the slave's (%s) MTU to %d.\n", slave_ifname, if_mtu.ifr_mtu);			}				if (strncpy(if_dstaddr.ifr_name, slave_ifname, IFNAMSIZ) <= 0				|| ioctl(skfd, SIOCSIFDSTADDR, &if_dstaddr) < 0) {				fprintf(stderr, "Error setting the slave (%s) with SIOCSIFDSTADDR: %s.\n",						slave_ifname, strerror(errno));			} else {				if (verbose) {					unsigned char *ipaddr = if_dstaddr.ifr_dstaddr.sa_data;					printf("Set the slave's (%s) destination address to %d.%d.%d.%d.\n",						   slave_ifname, ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);				}			}				if (strncpy(if_brdaddr.ifr_name, slave_ifname, IFNAMSIZ) <= 0				|| ioctl(skfd, SIOCSIFBRDADDR, &if_brdaddr) < 0) {				fprintf(stderr,						"Something broke setting the slave (%s) broadcast address: %s.\n",						slave_ifname, strerror(errno));			} else {				if (verbose) {					unsigned char *ipaddr = if_brdaddr.ifr_broadaddr.sa_data;					printf("Set the slave's (%s) broadcast address to %d.%d.%d.%d.\n",						   slave_ifname, ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);				}			}						if (strncpy(if_netmask.ifr_name, slave_ifname, IFNAMSIZ) <= 0				|| ioctl(skfd, SIOCSIFNETMASK, &if_netmask) < 0) {				fprintf(stderr,						"Something broke setting the slave (%s) netmask: %s.\n",						slave_ifname, strerror(errno));			} else {				if (verbose) {					unsigned char *ipaddr = if_netmask.ifr_netmask.sa_data;					printf("Set the slave's (%s) netmask to %d.%d.%d.%d.\n",						   slave_ifname, ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);				}			}						ifr2.ifr_flags |= IFF_UP; /* the interface will need to be up to be bonded */			if ((ifr2.ifr_flags &= ~(IFF_SLAVE | IFF_MASTER)) == 0				|| strncpy(ifr2.ifr_name, slave_ifname, IFNAMSIZ) <= 0				|| ioctl(skfd, SIOCSIFFLAGS, &ifr2) < 0) {				fprintf(stderr,						"Something broke setting the slave (%s) flags: %s.\n",						slave_ifname, strerror(errno));			} else {				if (verbose)					printf("Set the slave's (%s) flags %4.4x.\n", slave_ifname, if_flags.ifr_flags);			}				/* Do the real thing */			if ( ! opt_r) {				strncpy(if_flags.ifr_name, master_ifname, IFNAMSIZ);				strncpy(if_flags.ifr_slave, slave_ifname, IFNAMSIZ);				if (!opt_c) {					if ((ioctl(skfd, SIOCBONDENSLAVE, &if_flags) < 0) &&					    (ioctl(skfd, BOND_ENSLAVE_OLD, &if_flags) < 0)) {						fprintf(stderr,	"SIOCBONDENSLAVE: %s.\n", strerror(errno));					}				}				else {					if ((ioctl(skfd, SIOCBONDCHANGEACTIVE, &if_flags) < 0) &&					    (ioctl(skfd, BOND_CHANGE_ACTIVE_OLD, &if_flags) < 0)) {						fprintf(stderr,	"SIOCBONDCHANGEACTIVE: %s.\n", strerror(errno));					}				}			}		}	} while ( (slave_ifname = *spp++) != NULL);	/* Close the socket. */	(void) close(skfd);	return(goterr);}static short mif_flags;/* Get the inteface configuration from the kernel. */static int if_getconfig(char *ifname){	struct ifreq ifr;	int metric, mtu;			/* Parameters of the master interface. */	struct sockaddr dstaddr, broadaddr, netmask;	strcpy(ifr.ifr_name, ifname);	if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0)		return -1;	mif_flags = ifr.ifr_flags;	printf("The result of SIOCGIFFLAGS on %s is %x.\n",		   ifname, ifr.ifr_flags);	strcpy(ifr.ifr_name, ifname);	if (ioctl(skfd, SIOCGIFADDR, &ifr) < 0)		return -1;	printf("The result of SIOCGIFADDR is %2.2x.%2.2x.%2.2x.%2.2x.\n",		   ifr.ifr_addr.sa_data[0], ifr.ifr_addr.sa_data[1],		   ifr.ifr_addr.sa_data[2], ifr.ifr_addr.sa_data[3]);	strcpy(ifr.ifr_name, ifname);	if (ioctl(skfd, SIOCGIFHWADDR, &ifr) < 0)		return -1;	{		/* Gotta convert from 'char' to unsigned for printf().  */		unsigned char *hwaddr = (unsigned char *)ifr.ifr_hwaddr.sa_data;		printf("The result of SIOCGIFHWADDR is type %d  "			   "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.\n",			   ifr.ifr_hwaddr.sa_family, hwaddr[0], hwaddr[1],			   hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]);	}	strcpy(ifr.ifr_name, ifname);	if (ioctl(skfd, SIOCGIFMETRIC, &ifr) < 0) {		metric = 0;	} else		metric = ifr.ifr_metric;	strcpy(ifr.ifr_name, ifname);	if (ioctl(skfd, SIOCGIFMTU, &ifr) < 0)		mtu = 0;	else		mtu = ifr.ifr_mtu;	strcpy(ifr.ifr_name, ifname);	if (ioctl(skfd, SIOCGIFDSTADDR, &ifr) < 0) {		memset(&dstaddr, 0, sizeof(struct sockaddr));	} else		dstaddr = ifr.ifr_dstaddr;	strcpy(ifr.ifr_name, ifname);	if (ioctl(skfd, SIOCGIFBRDADDR, &ifr) < 0) {		memset(&broadaddr, 0, sizeof(struct sockaddr));	} else		broadaddr = ifr.ifr_broadaddr;	strcpy(ifr.ifr_name, ifname);	if (ioctl(skfd, SIOCGIFNETMASK, &ifr) < 0) {		memset(&netmask, 0, sizeof(struct sockaddr));	} else		netmask = ifr.ifr_netmask;	return(0);}static void if_print(char *ifname){	char buff[1024];	struct ifconf ifc;	struct ifreq *ifr;	int i;	if (ifname == (char *)NULL) {		ifc.ifc_len = sizeof(buff);		ifc.ifc_buf = buff;		if (ioctl(skfd, SIOCGIFCONF, &ifc) < 0) {			fprintf(stderr, "SIOCGIFCONF: %s\n", strerror(errno));			return;		}		ifr = ifc.ifc_req;		for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; ifr++) {			if (if_getconfig(ifr->ifr_name) < 0) {				fprintf(stderr, "%s: unknown interface.\n",						ifr->ifr_name);				continue;			}			if (((mif_flags & IFF_UP) == 0) && !opt_a) continue;			/*ife_print(&ife);*/		}	} else {		if (if_getconfig(ifname) < 0)			fprintf(stderr, "%s: unknown interface.\n", ifname);	}}/* * Local variables: *  version-control: t *  kept-new-versions: 5 *  c-indent-level: 4 *  c-basic-offset: 4 *  tab-width: 4 *  compile-command: "gcc -Wall -Wstrict-prototypes -O -I/usr/src/linux/include ifenslave.c -o ifenslave" * End: */

⌨️ 快捷键说明

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