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.