devo convertire un nodo ip con protocollo arp in un rarp; in particolare devo rilevare il mio indirizzo ip effettuando la rispettiva richiesta al server.
il problema riscontrato è il seguente :
a volte non mi spedisce il pacchetto, a volte lo riceve con parametri errati. vi posto il programma da me svolto ( ho semplicemente modificato il nodo ip arp) :
codice:
struct arp_packet{
unsigned short htype;
unsigned short ptype;
unsigned char hlen;
unsigned char plen;
unsigned short op;
unsigned char mac_sorg[6];
unsigned char ip_sorg[4];
unsigned char mac_dest[6];
unsigned char ip_dest[4];
};
void crea_arp_req(unsigned char * buffer, unsigned char * mac_sorg) {
int i;
struct arp_packet * arp;
arp = (struct arp_packet *) buffer;
arp->htype= htons(1);
arp->ptype= htons(0x8035);
arp->hlen = 6;
arp->plen = 4;
arp->op = htons(3);
copiabytes(arp->mac_sorg,mac_sorg,6);
copiabytes(arp->ip_sorg,ip_sorg,4);
for(i=0;i<6;i++) {
        arp->ip_sorg[i]=0;
        arp->ip_dest[i]=0;
}
copiabytes(arp->mac_dest, mac_sorg,6);
}

int sonouguali(char *b1, char *b2, int len){
int i;
for(i=0;i<len;i++)
        if(b1[i]!=b2[i])
                return 0;
return 1;
}
void trova_mac(unsigned char * mac_sorg, unsigned char *incognita_ip)
{
char buffer[1600];
int tmp;
struct ether_frame * e;
struct arp_packet *a;
unsigned char * eth;

crea_arp_req(buffer+500,mac_sorg);
eth=crea_eth(buffer+500,broadcast_mac,0x0806);

stampa_bytes(eth,sizeof(struct ether_frame)+sizeof(struct arp_packet));
tmp = invia_frame(eth,sizeof(struct ether_frame)+sizeof(struct arp_packet));
if(tmp!=0){
        printf("Programma Abortito\n");
        exit(1);
        }
e = (struct ether_frame *) buffer ;
a = (struct arp_packet *)  (buffer + sizeof(struct ether_frame));
while(1){

        tmp=ricevi_frame(buffer,1600);
        if(tmp==-1){
                printf("Programma Abortito\n");
                exit(1);
                }
        if (e->type == htons(0x0800)){
                if (a->op == htons(4)){
                        if(sonouguali(a->mac_dest,mac_sorg,6)){
                                printf("Ricevuto:\n");
                                stampa_bytes(buffer,tmp);
                                copiabytes(incognita_ip,a->ip_dest,4);
                                return ;
                                }
                }
        }
        }
}
i nomi corrispondono ancora al protocollo arp ma ho cambiato le caratteristiche per il protocollo rarp