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