예제 #1
0
파일: sendarp.c 프로젝트: nhanh0/hah
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);
    }
}
예제 #2
0
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;
}
예제 #3
0
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;
}