Problem bei eigenem Protokoll auf Ethernet

Gast #2448455
Lesenswert?

Hallo,

ich bin grade dabei für die Kommunikation mit einem FPGA ein Protokoll 
zu basteln welches direkt in Ethernet Frames gekapselt ist, also ohne IP 
dazwischen.
Soweit ansich keine Kunst nur habe ich bei ersten Tests etwas 
merkwürdiges festgestellt. Beim Versuch im PC-Empfangsprogramm auf einen 
eigenen Ethertype (0x1234) zu filtern funktioniert es nicht:
1
// Empfangs Routine
2
void mac_recv(void){
3
 int sock;
4
 unsigned char ether_frame[ETH_FRAME_LEN]; // 1514
5
 struct ether_header *ethhdr = (struct ether_header*) ether_frame;
6

7
 // Socket Deskriptor
8
 if( ( sock = socket(AF_PACKET, SOCK_PACKET, htons(0x1234))) == -1 ){
9
  perror("socket");
10
  exit(1);
11
 }
12

13
 // Pakete aus dem Socket lesen und Header ausgeben
14
 while(1){
15
  read(sock, ether_frame, ETH_FRAME_LEN);
16
  printf("shost: %s", ether_ntoa((struct ether_addr *) ethhdr->ether_shost));
17
  printf(" -> ");
18
  printf("dhost: %s", ether_ntoa((struct ether_addr *) ethhdr->ether_dhost));
19
  printf(" type: 0x%04x\n",htons(ethhdr->ether_type));
20
 }
21
}


Wenn ich die Zeile:
 if( ( sock = socket(AF_PACKET, SOCK_PACKET, htons(0x1234))) == -1)

durch
 if( ( sock = socket(AF_PACKET, SOCK_PACKET, htons(0x0800))) == -1)
ersetze bekomme ich wie zu erwarten alle IPv4 Pakete angezeigt.

beim ersetzen durch
 if( ( sock = socket(AF_PACKET, SOCK_PACKET, htons(0x0806))) == -1)
die ARP Pakete

beim ersetzen durch
 if( ( sock = socket(AF_PACKET, SOCK_PACKET, htons(ETH_P_ALL))) == -1)
bekomme ich alles, inklusive der von mir gewünschten 0x1234 Pakete 
angezeigt.


Warum funktioniert also das Filtern auf IPv4 (0x0800) aber auf ein 
eigenes Protokoll (0x1234) nicht?


Wäre toll wenn mir da jemand weiterhelfen könnte.
Gast #2448817
Lesenswert?

Das hatte ich bewusst so gemacht da ich bei SOCK_RAW fürs Senden den 
ganzen Blödsinn aus dem Ethernet Header (smac, dmac, type) und alle 
Protokolleinstellungen nochmal zusätzlich in ein Struct packen musste, 
wobei mir in keiner Weise klar ist warum. Auch gibts wenig brauchbare 
Beispiele dazu wie das Struct exakt zu füllen ist, insbesondere wenn man 
kein IP will.
Was ich bislang dazu gefunden hab war bis auf 1-2 Ausnahmen nichtmal 
kompilierbar da irgendwelche Headerdateien sich geändert haben.

Ansonsten geht es mir um Linux nicht BSD aber das Gefühl das was bei 
Custom Protokollen nicht ok ist, habe ich auch.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren