Ejemplo n.º 1
0
struct options {
    const char *name;
#ifdef CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS
    const unsigned int flags:6;
        const unsigned int arg_flags:10;
#else
    const unsigned char flags;
    const unsigned char arg_flags;
#endif
        const unsigned short selector;
    };

#define ifreq_offsetof(x)  offsetof(struct ifreq, x)

    static const struct arg1opt Arg1Opt[] = {
    {"SIOCSIFMETRIC",  SIOCSIFMETRIC,  ifreq_offsetof(ifr_metric)},
    {"SIOCSIFMTU",     SIOCSIFMTU,     ifreq_offsetof(ifr_mtu)},
    {"SIOCSIFTXQLEN",  SIOCSIFTXQLEN,  ifreq_offsetof(ifr_qlen)},
    {"SIOCSIFDSTADDR", SIOCSIFDSTADDR, ifreq_offsetof(ifr_dstaddr)},
    {"SIOCSIFNETMASK", SIOCSIFNETMASK, ifreq_offsetof(ifr_netmask)},
    {"SIOCSIFBRDADDR", SIOCSIFBRDADDR, ifreq_offsetof(ifr_broadaddr)},
#ifdef CONFIG_FEATURE_IFCONFIG_HW
    {"SIOCSIFHWADDR",  SIOCSIFHWADDR,  ifreq_offsetof(ifr_hwaddr)},
#endif
    {"SIOCSIFDSTADDR", SIOCSIFDSTADDR, ifreq_offsetof(ifr_dstaddr)},
#ifdef SIOCSKEEPALIVE
    {"SIOCSKEEPALIVE", SIOCSKEEPALIVE, ifreq_offsetof(ifr_data)},
#endif
#ifdef SIOCSOUTFILL
    {"SIOCSOUTFILL",   SIOCSOUTFILL,   ifreq_offsetof(ifr_data)},
#endif
Ejemplo n.º 2
0
int setInAddr( char *interface, char *Ipaddr, char *Netmask, char *HwMac, int type)
{
    struct ifreq ifr;
    int skfd=0;
    struct in_addr in_addr, in_netmask, in_broadaddr;
    struct sockaddr sa;
    int default_type= (IFACE_FLAG_T) | (IP_ADDR_T) | (NET_MASK_T) | (HW_ADDR_T);
    int request_action=0;
    request_action =type & default_type;
	
    skfd = socket(AF_INET, SOCK_DGRAM, 0);
	if(skfd==-1)
		return -1;
		
    strcpy(ifr.ifr_name, interface);
   
	    if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0){
	    		close( skfd );
			return (-1);
		}
	 if(request_action ==IFACE_FLAG_T){
	 	return 0;
		}
	ifr.ifr_flags = IFF_UP | IFF_RUNNING | IFF_BROADCAST | IFF_MULTICAST;
	if(request_action & IP_ADDR_T ){
		if (Ipaddr) {
			inet_aton(Ipaddr, &in_addr);
			(((struct sockaddr_in *)(&ifr.ifr_addr))->sin_addr).s_addr= in_addr.s_addr;
			ifr.ifr_addr.sa_family = AF_INET;
			if (ioctl(skfd, SIOCSIFADDR, &ifr) < 0)
				goto set_err;
		}
	}
	if(request_action & NET_MASK_T){
		if (Ipaddr && Netmask) {
			inet_aton(Netmask, &in_netmask);
			(((struct sockaddr_in *)(&ifr.ifr_netmask))->sin_addr).s_addr= in_netmask.s_addr;
			ifr.ifr_netmask.sa_family = AF_INET;
			if (ioctl(skfd, SIOCSIFNETMASK, &ifr) < 0)
				goto set_err;
	
			in_broadaddr.s_addr = (in_addr.s_addr & in_netmask.s_addr) | ~in_netmask.s_addr;
			(((struct sockaddr_in *)(&ifr.ifr_broadaddr))->sin_addr).s_addr= in_broadaddr.s_addr;
			ifr.ifr_broadaddr.sa_family = AF_INET;
			if (ioctl(skfd, SIOCSIFBRDADDR, &ifr) < 0)
				goto set_err;
		}
	}
	if(request_action & HW_ADDR_T){
		if(HwMac){
			sa.sa_family = ARPHRD_ETHER;
			memcpy(&sa.sa_data,HwMac,6); 
			memcpy((((char *) (&ifr)) +ifreq_offsetof(ifr_hwaddr)), &sa, sizeof(struct sockaddr));
			if (ioctl(skfd, SIOCSIFHWADDR, &ifr) < 0)
				goto set_err;
			
		}
	}
    close( skfd );
    return 0;
    
set_err:
	close(skfd);
	perror(interface);
	return -1;
}