Exemple #1
0
int main(int argc, char const *argv[])
{
		char *msg_fields[MAXLINE], str[MAXLINE],str1[MAXLINE] ;
		struct hwa_info	*hwa, *hwahead;
		char * ifname_split;
		int i, prflag, k, pf_socket, unix_domain_socket, arplen,unixarplen, ihw, khw, maxfdp,len;
		char   *ptr,*ptr1, *hw_address1, sender_ethernet_address[6], buffer[ETH_FRAME_LEN+1], unix_buffer[ETH_FRAME_LEN+1], tmp_hw_address[6], tmp_ip_address[INET_ADDRSTRLEN]; 
		struct sockaddr	*sa;
		struct sockaddr_un unixaddr, unixarpaddr;
		struct sockaddr_ll arpaddr;
		char * dest_mac1; 
		struct IP_hw_address_mpg *IP_hw_address_mpg_collection, *cache, *entry_from_cache, *own_ip_hw_entry;
		struct arp_frame *recvd_packet, *new_arp_rreq_frame;
		int nready, client[FD_SETSIZE], connfd=-1, j;
		ssize_t	n;
		fd_set	rset, allset;
		printf("set of  <IP address , HW address>  matching pairs for all eth0 interface IP addresses\n");
		printf("****************************************************************************************\n");
		for (hwahead = hwa = Get_hw_addrs(); hwa != NULL; hwa = hwa->hwa_next) 
		{
			ifname_split = strtok(hwa->if_name, ":"); //get pointer to first token found and store in 0
		
			if( strcmp(ifname_split, "eth0")==0 )
			{	
				printf("%s :%s", hwa->if_name, ((hwa->ip_alias) == IP_ALIAS) ? " (alias)\n" : "\n");
				
				if ( (sa = hwa->ip_addr) != NULL)
				{
					strcpy(tmp_ip_address, Sock_ntop_host(sa, sizeof(*sa)));

					printf("IP: %s\t", tmp_ip_address);
				}	
				prflag = 0;
				i = 0;
				do 
				{

					if (hwa->if_haddr[i] != '\0') 
					{
						prflag = 1;
						break;
					}
				} while (++i < IF_HADDR);
			
			k=0;
			if (prflag) 
			{
				printf("HW addr = ");
				ptr = hwa->if_haddr;
				hw_address1=ptr;
				i = IF_HADDR;
				do {
					tmp_hw_address[k] = *ptr++ & 0xff;
					k++;
					printf("%.2x%s", *hw_address1++ & 0xff, (i == 1) ? " " : ":");
				} while (--i > 0);
				insert_own_to_collection( tmp_ip_address,tmp_hw_address, hwa->if_index );
				printf("\n\n");
			}
			}
		}

 	getOwnCanonicalIPAddress(own_ip_address);

	if((pf_socket = socket(PF_PACKET, SOCK_RAW, htons(USID_PROTO)))==-1)
 	{
 		printf("Error in creation of socket for PF_PACKET\n");
 		perror("socket");
 		return 0;
 	}
 
 	if((unix_domain_socket = socket(AF_UNIX, SOCK_STREAM, 0))==-1)
 	{
 		printf("Error in creation of Unix Domain socket\n");
		perror("socket");
		return;
		
	}


	bzero(&unixaddr, sizeof(unixaddr));
	unixaddr.sun_family = AF_UNIX;
	strcpy(unixaddr.sun_path, UNIXDG_PATH);
	unlink(UNIXDG_PATH);
	 len = strlen(unixaddr.sun_path) + sizeof(unixaddr.sun_family);
    if(bind(unix_domain_socket, (SA *) &unixaddr, len)<0)
    {       fprintf(stderr,"bind() failed. errorno =  %d\n",errno); 
            exit(1);
    }
	
    if(listen(unix_domain_socket, LISTENQ)<0)
    {       fprintf(stderr,"listen() failed. errorno = %d\n",errno);       
            exit(1);
    }

	//printf("listening on : %d\n", unix_domain_socket);
	//unixarplen=sizeof(unixarpaddr);
	//connfd = accept(unix_domain_socket, (struct sockaddr_un *) &unixarpaddr, &unixarplen);
	//printf("accepted : %d\n", unix_domain_socket);
	FD_ZERO(&allset);
	//FD_SET(connfd, &allset);
	FD_SET(unix_domain_socket, &allset);
	FD_SET(pf_socket, &allset);
	maxfdp=max(unix_domain_socket,pf_socket)+1;
	/* end fig01 */


	/* include fig02 */
	for ( ; ; ) 
	{
		
		rset = allset;		/* structure assignment */
		if((nready = select(maxfdp, &rset, NULL, NULL, NULL))<0)
		{	
			if(errno==EINTR)	
				continue;
			else
				err_sys("select error");	
		}		
		if (FD_ISSET(unix_domain_socket, &rset)) 
		{	
			
        	unixarplen=sizeof(unixarpaddr);
	        if((connfd = accept(unix_domain_socket, (struct sockaddr_un *) &unixarpaddr, &unixarplen))>=0)
	        {
	   //     	printf("new conn recieved: \n",connfd);
	        	 if ( (n = readline(connfd, unix_buffer, MAXLINE)) >= 0)
				{          
	        	//(n=recvfrom(unix_domain_socket,unix_buffer, ETH_FRAME_LEN+1, 0, &unixarpaddr, &unixarplen)>0)
	      //  		printf("Received  request from Tour module..%s\n",unix_buffer);
	        		

	        		msg_fields[0] = strtok(unix_buffer, "|"); //get pointer to first token found and store in 0
	                while(msg_fields[i]!= NULL) 
	                {   /* ensure a pointer was found */
	                    i++;
	                    msg_fields[i] = strtok(NULL, "|"); /* continue to tokenize the string */
	                }
                
                	for(j = 0; j <= i-1; j++) {
          
                   		 printf("%s\n", msg_fields[j]); /* print out all of the tokens */
                	}
 					//memset(entry_from_cache,0,sizeof(struct IP_hw_address_mpg));
 			//		printf("check in cache\n");
					print();
                	entry_from_cache=get_ethernet_from_ip(msg_fields[0],NULL,msg_fields[1],msg_fields[2],connfd);
               		print();
               		//get_ethernet_from_ip( char * ip_address,char * hw_address, char * if_index, char * hatype, int connfd )
			      //  printf("out of cache\n");
			        if(entry_from_cache!=NULL && entry_from_cache->hw_address!=NULL)
			        {
			        	printf("hw address obtained from cache\n");
			        	write(connfd,entry_from_cache->hw_address, strlen(entry_from_cache->hw_address));
			        	close(connfd);
			        	/*
						A cache entry has five parts:
						 (i) IP address ;  
						(ii) HW address ;  
						(iii) sll_ifindex (the interface to be used for reaching the matching pair <(i) , (ii)>) ;  
						(iv) sll_hatype ;  and
						 (v) a Unix-domain connection-socket descriptor
			        	*/
						 
			        }else
			        {
			    //    	printf("hw address NOT obtained from cache\n");
			        	floodARP(pf_socket,msg_fields[0]/*target ip address*/ );
			      //  	printf("ARP request sent on pf_socket\n");
			        	
			        	insert_to_cache( msg_fields[0],"", msg_fields[1],(unsigned short)atoi(msg_fields[2]),connfd );
			        	//void insert_to_cache( char * ip_address,char * hw_address, int if_index, char * hatype, int connfd )

			        	FD_SET(connfd, &rset);
			        	maxfdp=connfd+1;

			        }
			        
		        }else
		        {
		        	perror("readline");
		        }


	      
			}else{
				perror("connect");
			}
//---------------------------------------------------------------------------------------------------------
		}
        else if (FD_ISSET(pf_socket, &rset)) 
        {       
 
 			//printf("Receiving packet ...\n");
        	arplen=sizeof(arpaddr);
	        if((n=recvfrom(pf_socket,buffer, ETH_FRAME_LEN+1, 0, &arpaddr, &arplen)>0))
	        {



	        	

	        	if (n == -1)
	        	{ 
	        		printf("Error in recieving data from ARP..\n"); 
	        		exit(0);
	        	}
	        	else
	        	{ 
	        		//printf("Recieved Packet successfully\n" ); 
	        	}

	            recvd_packet = (struct arp_frame *)processRecievedPacket(buffer);

	            ihw = IF_HADDR;
	        	khw=0;
	        	
	        //		printf("Received packet from hw address:\n");
				do 
				{	
					sender_ethernet_address[khw] = arpaddr.sll_addr[khw] & 0xff;
					recvd_packet->sender_ethernet_address[khw] = arpaddr.sll_addr[khw] & 0xff;
					
					//printf("%.2x%s", sender_ethernet_address[khw] & 0xff, (ihw == 1) ? " " : ":");
					khw++;
				} while (--ihw > 0);
			//	printf("\n at interface %d...\n",arpaddr.sll_ifindex);

	            if(recvd_packet->op==1)//request
	            {
	            	///printf("ARP request recieved\n");


	            	        ihw = IF_HADDR;
				        	khw=0;
				        	printf("**************************************************************\n");
				        	printf("ARP REQUEST RECEIVED:\n");
				        	printf("**************************************************************\n");
				        	printf("Sender IP Address : %s \n" , recvd_packet->sender_ip_address);
				        	printf("Sender hw address: ");
							do 
							{	
								
								
								printf("%.2x%s", recvd_packet->sender_ethernet_address[khw] & 0xff, (ihw == 1) ? " " : ":");
								khw++;
							} while (--ihw > 0);	


							printf("\nDestination IP Address : %s \n" , recvd_packet->target_ip_address);
				        	
							printf("\n");
							printf("hard_type: %hu, proto_type: %hu, hard_size: %hu ,proto_size %hu,op : %hu\n", recvd_packet->hard_type, recvd_packet->proto_type, recvd_packet->hard_size,recvd_packet->proto_size,recvd_packet->op);
				        	printf("**************************************************************\n");





	            	 own_ip_hw_entry = get_own_ethernet_from_ip( recvd_packet->target_ip_address );
	            	if(own_ip_hw_entry!=NULL)
	            	{
		      //      	printf("make entry in cache table\n");
		            	if(cache=get_ethernet_from_ip( recvd_packet->sender_ip_address,recvd_packet->sender_ethernet_address, arpaddr.sll_ifindex, recvd_packet->hard_type, -1 )!=NULL)
		            	{
			            //	printf("make entry in cache table123\n");

		            	//	printf("gellooo :%hu\n",ntohs(recvd_packet->hard_type) );
			            //	printf("make entry in cache table456\n");

						//	printf("IFIindex :%d\n",arpaddr.sll_ifindex );

		            		//cache->sll_ifindex=(int)arpaddr.sll_ifindex;
		            		
		            	//	printf("gellooo :%hu\n",recvd_packet->hard_type );
		            		//cache->sll_hatype=ntohs(recvd_packet->hard_type);
		            		

		            	}else{
		            		insert_to_cache( recvd_packet->sender_ip_address,recvd_packet->sender_ethernet_address, arpaddr.sll_ifindex, recvd_packet->hard_type, -1 );	
		            	}

		            	sendARPResponse(pf_socket,recvd_packet->sender_ip_address/*target ip address*/ ,sender_ethernet_address, arpaddr.sll_ifindex/*arp response*/);
	            	
	            	}else
	            	{
	            		cache=get_cache_entry_from_IP(recvd_packet->sender_ip_address);
	            		if(cache!=NULL)
	            		{
	            			cache_update_entry( recvd_packet->sender_ip_address,recvd_packet->sender_ethernet_address,arpaddr.sll_ifindex, recvd_packet->hard_type, -1);
	            		}
	            	}
	            }else if(recvd_packet->op==2)
	            {
	            //	printf("ARP response recieved\n");
	            	cache=get_cache_entry_from_IP(recvd_packet->sender_ip_address);
            		if(cache!=NULL)
            		{
            			if(cache->unix_domain_confd!=-1)
            			{
            	//			printf("conn fd from cache: %d\n",cache->unix_domain_confd );
            				//strcpy(str1,"sender_ethernet_address");
            				//sleep(5);
            				ihw = IF_HADDR;
				        	khw=0;
				        	printf("**************************************************************\n");
				        	printf("ARP RESPONSE RECEIVED:\n");
				        	printf("**************************************************************\n");
				        	printf("Sender IP Address : %s \n" , recvd_packet->sender_ip_address);
				        	printf("Sender hw address: ");
							do 
							{	
								
								
								printf("%.2x%s", sender_ethernet_address[khw] & 0xff, (ihw == 1) ? " " : ":");
								khw++;
							} while (--ihw > 0);	


							printf("\nDestination IP Address : %s \n" , recvd_packet->target_ip_address);
				        	printf("Destination hw address: ");
							ihw = IF_HADDR;
				        	khw=0;
				        	
							do 
							{	
								
								
								printf("%.2x%s", recvd_packet->target_ethernet_address[khw] & 0xff, (ihw == 1) ? " " : ":");
								khw++;
							} while (--ihw > 0);	
							printf("\n");
							printf("hard_type: %hu, proto_type: %hu, hard_size: %hu ,proto_size %hu,op : %hu\n", recvd_packet->hard_type, recvd_packet->proto_type, recvd_packet->hard_size,recvd_packet->proto_size,recvd_packet->op);
				        	printf("**************************************************************\n");

				        	printf("**************************************************************\n");
				        	printf("ARP RESPONSE SENT TO TOUR MODULE :\n");
				        	printf("**************************************************************\n");
				        	printf("hw address for requested IP is : ");
							ihw = IF_HADDR;
				        	khw=0;
				        	
							do 
							{	
								
								
								printf("%.2x%s", sender_ethernet_address[khw] & 0xff, (ihw == 1) ? " " : ":");
								khw++;
							} while (--ihw > 0);	


            				if(write(cache->unix_domain_confd,sender_ethernet_address,100)<0)
            					perror("write");
            				


            				FD_CLR(cache->unix_domain_confd,&rset);
							close(cache->unix_domain_confd);
            			}
            			cache_update_entry( recvd_packet->sender_ip_address,recvd_packet->sender_ethernet_address,arpaddr.sll_ifindex, recvd_packet->hard_type, -1);
	            			//printf("I AM HERE ...4\n");

            		}

	            }

	        }

        }
        else if(FD_ISSET(connfd, &rset))
        {
        //	printf("connfd readable\n");
        	n = readline(connfd, str, MAXLINE);
        	if ( n == 0)
			{ 
		//		printf("Connection terminated\n");
				 cache_delete_entry(connfd );
				close(connfd);
				connfd=-1;
        	}
        	/*else if(n>0)
        	{
        		printf("hw address obtained from ARP\n");
        		cache_update_entry(msg_fields[0],msg_fields[1],msg_fields[2],msg_fields[3],connfd, hw_address_from_arp);
        		writen(connfd,hw_address_from_arp, strlen(hw_address_from_arp));
   				close(connfd);
        	
        	}*/
        }

    }
	return 0;
}
int
id2entry_delete( Backend *be, Entry *e )
{
	struct ldbminfo	*li = (struct ldbminfo *) be->be_private;
	DBCache	*db;
	Datum		key;
	int		rc;
#ifndef WORDS_BIGENDIAN
	ID		id;
#endif

#ifdef NEW_LOGGING
	LDAP_LOG( INDEX, ENTRY, "id2entry_delete: (%s)%ld\n", e->e_dn, e->e_id, 0 );
#else
	Debug(LDAP_DEBUG_TRACE, "=> id2entry_delete( %ld, \"%s\" )\n", e->e_id,
	    e->e_dn, 0 );
#endif


#ifdef notdef
#ifdef LDAP_RDWR_DEBUG
	/* check for writer lock */
	assert(ldap_pvt_thread_rdwr_writers(&e->e_rdwr) == 1);
#endif
#endif

	ldbm_datum_init( key );

	if ( (db = ldbm_cache_open( be, "id2entry", LDBM_SUFFIX, LDBM_WRCREAT ))
		== NULL ) {
#ifdef NEW_LOGGING
		LDAP_LOG( INDEX, ERR, 
			   "id2entry_delete: could not open/create id2entry%s\n",
			   LDBM_SUFFIX, 0, 0 );
#else
		Debug( LDAP_DEBUG_ANY, "Could not open/create id2entry%s\n",
		    LDBM_SUFFIX, 0, 0 );
#endif

		return( -1 );
	}

	if ( cache_delete_entry( &li->li_cache, e ) != 0 ) {
#ifdef NEW_LOGGING
		LDAP_LOG( INDEX, ERR, 
			   "id2entry_delete: Could not delete (%s)%ld from cache\n",
			   e->e_dn, e->e_id, 0 );
#else
		Debug(LDAP_DEBUG_ANY, "could not delete %ld (%s) from cache\n",
		    e->e_id, e->e_dn, 0 );
#endif

	}

#ifdef WORDS_BIGENDIAN
	key.dptr = (char *) &e->e_id;
#else
	id = htonl(e->e_id);
	key.dptr = (char *) &id;
#endif
	key.dsize = sizeof(ID);

	rc = ldbm_cache_delete( db, key );

	ldbm_cache_close( be, db );

#ifdef NEW_LOGGING
	LDAP_LOG( INDEX, ENTRY, "id2entry_delete: return %d\n", rc, 0, 0 );
#else
	Debug( LDAP_DEBUG_TRACE, "<= id2entry_delete %d\n", rc, 0, 0 );
#endif

	return( rc );
}