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 ); }