#include #include #include #include #include #include #undef __KERNEL__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define NIPQUAD(addr) \ ((unsigned char *) &addr)[0], \ ((unsigned char *) &addr)[1], \ ((unsigned char *) &addr)[2], \ ((unsigned char *) &addr)[3] int get_ctl_fd(void) { int s_errno; int fd; fd = socket(PF_INET, SOCK_DGRAM, 0); if (fd >= 0) return fd; s_errno = errno; fd = socket(PF_PACKET, SOCK_DGRAM, 0); if (fd >= 0) return fd; fd = socket(PF_INET6, SOCK_DGRAM, 0); if (fd >= 0) return fd; errno = s_errno; perror("Cannot create control socket"); return -1; } int get_flags(char *intf) { struct ifreq ifr; int sk = get_ctl_fd(); if (sk < 0) return -1; memset(&ifr, 0, sizeof ifr); strncpy(ifr.ifr_name, intf, sizeof (ifr.ifr_name)); if (ioctl(sk, SIOCGIFFLAGS, &ifr) < 0) { fprintf(stderr, "error getting device %s: ", intf); close(sk); return -1; } close(sk); return ifr.ifr_flags; } int do_chflags(char *dev, __u32 flags, __u32 mask) { struct ifreq ifr; int fd; int err; strcpy(ifr.ifr_name, dev); fd = get_ctl_fd(); if (fd < 0) return -1; err = ioctl(fd, SIOCGIFFLAGS, &ifr); if (err) { perror("SIOCGIFFLAGS"); close(fd); return -1; } if ((ifr.ifr_flags ^ flags) & mask) { ifr.ifr_flags &= ~mask; ifr.ifr_flags |= mask & flags; err = ioctl(fd, SIOCSIFFLAGS, &ifr); if (err) perror("SIOCSIFFLAGS"); } close(fd); return err; } int set_admin_up(char *dev, __u32 flags, __u32 mask) { mask |= IFF_UP; flags |= IFF_UP; return do_chflags(dev, flags, mask); } int set_admin_down(char *dev, __u32 flags, __u32 mask) { mask |= IFF_UP; flags &= ~IFF_UP; return do_chflags(dev, flags, mask); } int print_hw_addr(char *smac) { printf(" %x:%x:%x:%x:%x:%x ", smac[0] & 0xff, smac[1] & 0xff, smac[2] & 0xff, smac[3] & 0xff, smac[4] & 0xff, smac[5] & 0xff); } int get_hw_addr(char *name, char *smac) { struct ifreq ifr; int s = get_ctl_fd(); if (s < 0) return -1; strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0) { fprintf(stderr, "ioctl(SIOCGIFHWADDR): %s", name); return -1; } if (ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) { fprintf(stderr, "interface %s is not Ethernet!", name); return -1; } memcpy(smac, ifr.ifr_hwaddr.sa_data, ETH_ALEN); //print_hw_addr(smac); return 0; } static __inline__ __u32 inet_make_mask(int logmask) { if (logmask) return htonl(~((1<<(32-logmask))-1)); return 0; } #define satosin(sa) ((struct sockaddr_in *) (sa)) int add_ifa(char *intf, __u32 NiIPAddr, __u32 NetMask) { int sk; struct ifreq ifr; __u32 bcastMask = (NiIPAddr & NetMask) | ~NetMask; sk = get_ctl_fd(); if (sk < 0) return -1; memset(&ifr, 0, sizeof ifr); strncpy(ifr.ifr_name, intf, IFNAMSIZ - 1); satosin(&ifr.ifr_addr)->sin_family = AF_INET; satosin(&ifr.ifr_addr)->sin_addr.s_addr = NiIPAddr; if (0 > ioctl(sk, SIOCSIFADDR, (char *) &ifr)) { printf("Failed SIOCSIFADDR on %s\n", intf); close(sk); return -1; } // // Set new Network Mask. // satosin(&ifr.ifr_addr)->sin_family = AF_INET; satosin(&ifr.ifr_addr)->sin_addr.s_addr = bcastMask; // if (NiIPAddr && (0 > ioctl(sk, SIOCSIFBRDADDR, (char *) &ifr))) { printf("Failed SIOCSIFBRDADDR on %s\n", intf); close(sk); return -1; } satosin(&ifr.ifr_addr)->sin_family = AF_INET; satosin(&ifr.ifr_addr)->sin_addr.s_addr = NetMask; if (NiIPAddr && (0 > ioctl(sk, SIOCSIFNETMASK, (char *) &ifr))) { printf("Failed SIOCSIFNETMASK on %s\n", intf); close(sk); return -1; } close(sk); return 0; } // set ip address from MAC // smac[6] // get_hw_addr("eth0",&smac); // build ipfrommac //__u32 netmask = inet_make_mask(24); // ret = add_ifa("eth0", ipfrommac[0], netmask); // set_admin_up("eth0",0.0); int main(int argc, char *argv[]) { char smac[6]; __u32 ethip = 0; __u32 netmask = inet_make_mask(24); if (argc != 2) { fprintf(stderr,"Device name is needed\n"); exit(0); } // argv[1] contains the eth device name int ret = get_hw_addr(argv[1], smac); if (ret < 0) { fprintf(stderr,"Failed to get mac address of %s\n",argv[1]); exit(0); } print_hw_addr(smac); fprintf(stdout, "IP address %d.%d.%d.%d\n", smac[2] & 0xff, smac[3] & 0xff, smac[4] & 0xff, smac[5] & 0xff); ethip |= smac[5] & 0xff; ethip <<= 8; ethip |= smac[4] & 0xff; ethip <<= 8; ethip |= smac[3] & 0xff; ethip <<= 8; ethip |= smac[2] & 0xff; fprintf(stdout,"converted IP %d.%d.%d.%d\n", NIPQUAD(ethip)); ret = add_ifa(argv[1], ethip, netmask); if (ret < 0) { fprintf(stderr,"Failed to set IP address of %s\n",argv[1]); exit(0); } ret = set_admin_up(argv[1], 0, 0); if (ret < 0) { fprintf(stderr,"Failed to bring up %s\n",argv[1]); exit(0); } return ret; }