static void sendArp(char *srcDev, char *destDev) { int sock; struct arpMsg arp; unsigned char br_macaddr[ETH_ALEN]; unsigned char eth_macaddr[ETH_ALEN]; unsigned int br_ipAddr; struct sockaddr_ll sll; struct ifreq ifr; int flag; if ((getDevInfo(srcDev, IFIPADDR, (char *)&br_ipAddr) == 0) && (getDevInfo(srcDev, IFHWADDR, (char *)br_macaddr) == 0) && (getDevInfo(destDev, IFHWADDR, (char *)eth_macaddr) == 0)) { /* create device level socket */ if ((sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0) { perror("cannot open socket "); return; } memset(&sll, 0, sizeof(sll)); sll.sll_family = AF_PACKET; sll.sll_protocol = htons(ETH_P_ALL); /* get interface index number */ memset(&ifr, 0, sizeof(struct ifreq)); strcpy(ifr.ifr_name, destDev); if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0) { perror("SIOCGIFINDEX(): "); close(sock); return; } sll.sll_ifindex = ifr.ifr_ifindex; /* bind the socket to the interface */ if (bind(sock, (struct sockaddr *)&sll, sizeof(sll)) == -1) { perror("bind(): "); close(sock); return; } /* set socket to non-blocking operation */ if ((flag = fcntl(sock, F_GETFL, 0)) >= 0) { fcntl(sock, F_SETFL, flag | O_NONBLOCK); } mkArpMsg(ARPOP_REQUEST, br_ipAddr, NULL, br_ipAddr, br_macaddr, &arp); sendto(sock, &arp, sizeof(arp), 0, (struct sockaddr *)&sll, sizeof(sll)); close(sock); } }
int arpCheck(u_long inaddr, struct ifinfo *ifbuf, long timeout) { int s; /* socket */ int rv; /* return value */ struct sockaddr addr; /* for interface name */ struct arpMsg arp; fd_set fdset; struct timeval tm; time_t prevTime; rv = 1; openRawSocket(&s, ETH_P_ARP); /* send arp request */ mkArpMsg(ARPOP_REQUEST, inaddr, NULL, ifbuf->addr, ifbuf->haddr, &arp); bzero(&addr, sizeof(addr)); strcpy(addr.sa_data, ifbuf->ifname); if ( sendto(s, &arp, sizeof(arp), 0, &addr, sizeof(addr)) < 0 ) rv = 0; /* wait arp reply, and check it */ tm.tv_usec = 0; time(&prevTime); while ( timeout > 0 ) { FD_ZERO(&fdset); FD_SET(s, &fdset); tm.tv_sec = timeout; if ( select(s+1, &fdset, (fd_set *)NULL, (fd_set *)NULL, &tm) < 0 ) { DEBUG(LOG_ERR, "Error on ARPING request: errno=%d", errno); if (errno != EINTR) rv = 0; } else if ( FD_ISSET(s, &fdset) ) { if (recv(s, &arp, sizeof(arp), 0) < 0 ) rv = 0; if(arp.operation == htons(ARPOP_REPLY) && bcmp(arp.tHaddr, ifbuf->haddr, 6) == 0 && *((u_int *)arp.sInaddr) == inaddr ) { DEBUG(LOG_INFO, "Valid arp reply receved for this address"); rv = 0; break; } } timeout -= time(NULL) - prevTime; time(&prevTime); } close(s); DEBUG(LOG_INFO, "%salid arp replies for this address", rv ? "No v" : "V"); return rv; }
int arpCheck(int thread_id,u_long inaddr, struct ifinfo *ifbuf, long timeout, buffer* arp_ip) { int s; /* socket */ int rv; /* return value */ struct sockaddr addr; /* for interface name */ struct arpMsg arp; fd_set fdset; struct timeval tm; time_t prevTime; char checkip[100]; char checkmac[100]; strcpy(checkip, arp_ip->ptr); rv = 1; if( openRawSocket(&s, ETH_P_ARP) == -1 ){ return -1; } /* send arp request */ mkArpMsg(ARPOP_REQUEST, inaddr, NULL, ifbuf->addr, ifbuf->haddr, &arp); bzero(&addr, sizeof(addr)); strcpy(addr.sa_data, ifbuf->ifname); if ( sendto(s, &arp, sizeof(arp), 0, &addr, sizeof(addr)) < 0 ) rv = 0; /* wait arp reply, and check it */ tm.tv_usec = 0; time(&prevTime); while ( timeout > 0 ) { FD_ZERO(&fdset); FD_SET(s, &fdset); tm.tv_sec = timeout; if ( select(s+1, &fdset, (fd_set *)NULL, (fd_set *)NULL, &tm) < 0 ) { Cdbg(DBE, "Error on ARPING request: %s\n", strerror(errno)); if (errno != EINTR) rv = 0; } else if ( FD_ISSET(s, &fdset) ) { if (recv(s, &arp, sizeof(arp), 0) < 0) rv = 0; if( arp.operation == htons(ARPOP_REPLY) && bcmp(arp.tHaddr, ifbuf->haddr, 6) == 0 && *((u_int *)arp.sInaddr) == inaddr ) { //inet_ntop(AF_INET, arp.sInaddr, checkip, sizeof(checkip)) ; //fprintf(stderr,"enter %d\n", thread_id); //char* hostname = smbc_nmblookup(checkip); //fprintf(stderr,"leave %d, %s\n", thread_id, hostname); //hostname = "TSET"; #if 1 //if(hostname!=NULL) { sprintf(checkmac, "%02X:%02X:%02X:%02X:%02X:%02X", arp.sHaddr[0]&0xff, arp.sHaddr[1]&0xff, arp.sHaddr[2]&0xff, arp.sHaddr[3]&0xff, arp.sHaddr[4]&0xff, arp.sHaddr[5]&0xff); #if 0 fprintf(stderr, "Valid arp reply receved for this address, thread_id=[%d]\n", thread_id); fprintf(stderr, "IP is %s, MAC is %s\n\n", checkip, checkmac); #endif int bFound = 0; smb_srv_info_t *p; for (p = smb_srv_info_list; p; p = p->next) { if(strcmp(p->ip->ptr, checkip)==0){ //fprintf(stderr,"\t\tFound ip=[%s] in list!\n", checkip); bFound = 1; break; } } if(bFound==0){ smb_srv_info_t *smb_srv_info; smb_srv_info = (smb_srv_info_t *)calloc(1, sizeof(smb_srv_info_t)); smb_srv_info->id = thread_id; smb_srv_info->ip = buffer_init(); buffer_copy_string(smb_srv_info->ip, checkip); smb_srv_info->mac = buffer_init(); buffer_copy_string(smb_srv_info->mac, checkmac); smb_srv_info->name = buffer_init(); buffer_copy_string(smb_srv_info->name, ""); //buffer_copy_string(smb_srv_info->name, hostname); DLIST_ADD(smb_srv_info_list, smb_srv_info); //fprintf(stderr,"add ip=[%s] to list!\n", checkip); /* int count = 0; smb_srv_info_t *c; for (c = smb_srv_info_list; c; c = c->next) { count++; } fprintf(stderr,"List count [%d]!\n", count); */ } } rv = 0; #else rv = 1; #endif break; } } timeout -= time(NULL) - prevTime; time(&prevTime); } close(s); if(rv==1){ smb_srv_info_t *p; for (p = smb_srv_info_list; p; p = p->next) { //fprintf(stderr,"check [%s]->[%s]\n", p->ip->ptr, checkip); if(strcmp(p->ip->ptr, checkip)==0){ Cdbg(DBE,"ip=[%s] name=[%s] is not exist!\n", checkip, p->name->ptr); buffer_free(p->ip); buffer_free(p->mac); buffer_free(p->name); DLIST_REMOVE(smb_srv_info_list, p); free(p); break; } } } //fprintf(stderr, "ip=[%s], %salid arp replies for this address\n", checkip, rv ? "No v" : "V"); return rv; }