/* args: yiaddr - what IP to ping (eg. on the NETtel cb189701) * retn: 1 addr free * 0 addr used * -1 error */ int arpping(u_int32_t yiaddr, u_int32_t ip, char *arp, char *interface) { struct ifinfo ifbuf; strcpy(ifbuf.ifname, interface); ifbuf.addr = ip; ifbuf.mask = 0x0; ifbuf.bcast = 0x0; memcpy(ifbuf.haddr, arp, 6); ifbuf.flags = 0; return arpCheck(yiaddr, &ifbuf, 2); }
int arpping(SrvInfo *psrvInfo) { struct ifinfo ifbuf; strcpy(ifbuf.ifname, psrvInfo->iface); ifbuf.addr = psrvInfo->ipSrv.s_addr; ifbuf.mask = 0x0; ifbuf.bcast = 0x0; memcpy(ifbuf.haddr, psrvInfo->macSrv, 6); ifbuf.flags = 0; return arpCheck(psrvInfo->id, psrvInfo->arp_ip, &ifbuf, 2, psrvInfo->arp_cip); }
/* args: yiaddr - what IP to ping (eg. on the NETtel cb189701) * retn: 1 addr free * 0 addr used * -1 error */ int arpping(u_int32_t yiaddr, u_int32_t ip, char *interface) { struct ifinfo ifbuf; int fd, ret; struct ifreq ifr; unsigned char sMac[6]; ret = 1; // default action is to assign the address if((fd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) { LOG(LOG_ERR, "socket failed!"); return ret; } ifr.ifr_addr.sa_family = AF_INET; strcpy(ifr.ifr_name, interface); /* Retrieve MAC of the interface */ if (ioctl(fd, SIOCGIFHWADDR, &ifr) == 0) { memcpy(sMac, ifr.ifr_hwaddr.sa_data, 6); close(fd); } else { close(fd); return ret; } strcpy(ifbuf.ifname, interface); ifbuf.addr = ip; ifbuf.mask = 0x0; ifbuf.bcast = 0x0; memcpy(ifbuf.haddr, sMac, 6); ifbuf.flags = 0; return arpCheck(yiaddr, &ifbuf, 2); }