Hallo, ich besitze ein Evaluationsboard von Hitex (STR9 COM Stick). Nun bin ich dabei einen reinen Ethernet Frame zusenden und mit WIreshark möchte ich diesen Ethernt Frame empfangen und analysieren. Was müsste ich genau tun, damit ich auf der Mikrocontrollerseite einen Ethernet Frame senden kann bzw. was müsste ich auf der PC Seite genau tun, damit ich mit Wireshark Ethernet Frames sehen kann? Im Prinzip läuft die Ethernetkommunikation bei mir in einer while(1) Schleife in der uIPMain Funktion ab. Hier müsste ich quasi die Funktion TransmitPacket() permanent aufrufen. Leider sehe ich in Wireshark nichts sinnvolles. Kann mir jemand bei meinem Problem helfen ?
Wie ist denn dein µC mit dem PC verbunden? Wenn da z.B. ein Switch dazwischen hängt, wird der das wahrscheinlich nur dann weiterleiten, wenn die Ziel-MAC-Adresse die des Rechners oder die Broadcast-Adresse ist.
Hallo Rolf, µC und PC sind über ein Crossoverkabel verbunden.
Moeglicherweise nicht. Moeglicherweise sendet der PC nichts ohne vorherige Verbindungsaufnahme. Verbind doch mal den PC mit dem LAN und horch diese Kommunikation ab.
Oktav Oschi schrieb: > Moeglicherweise nicht. Moeglicherweise sendet der PC nichts ohne > vorherige Verbindungsaufnahme Ein Verbindungsaufbau wie bei TCP sind auch Packete, die ich sehen kann. Wenn ich, mit welchem Programm auch immer, ein UDP Packet losschicke, und die Route zeigt auf das richtige Interface, geht das Packet raus. Und alles, was an diesem Interface ankommt, wird von wireshark angezeigt, solange es auch nur einigermassen ethernetkonform ist. Wichtig ist, das wireshark auch am richtigen Interface lauscht. MfG Klaus
Vielen Dank für eure Unterstützung. Ich möchte eigentlich nur ein reines Ethernet Packet (ohne TCP oder UDP) via Crossoverkabel vom Mikrocontroller an den PC senden. Reciht es da eigentlich, nur die Funktion "TransmitPacket()" auszuführen ?
Ich kann doch in der TransmitPacket Funktion statt dem Puffer "uip_appdata" auch direkt einen Wert übergeben. Dies habe ich auch gemacht, leider kann ich auf der PC Seite aus mit WIreshark keine plausiblen Daten sehen. Ich sehe irgendwelche anderen Packete mit Wireshark.
1 | void TransmitPacket(void) |
2 | {
|
3 | int i; |
4 | u8 data[1500]; |
5 | |
6 | // Copy the header portion part
|
7 | for(i=0; i < (UIP_LLH_LEN + 40); ++i) { |
8 | data[i] = uip_buf[i]; |
9 | }
|
10 | |
11 | // Copy the data portion part
|
12 | for(; i < uip_len; ++i) { |
13 | data[i] = uip_appdata[i - UIP_LLH_LEN - 40 ]; |
14 | }
|
15 | |
16 | ENET_TxPkt(&data,uip_len); |
17 | }
|
Leo schrieb: > Leider sehe ich in Wireshark nichts > sinnvolles. - Richtiges Interface ausgewählt und promiscuous mode ist aktiviert? (http://www.wireshark.org/faq.html#q7.6) - Bevor Du rumzuhacken versuchst, probier einfach ein Beispielcode aus um richtige Ergebnisse zu bekommen. Danach arbeite weiter an dein Vorhaben. Leo schrieb: > Reciht es da eigentlich, nur die > Funktion "TransmitPacket()" auszuführen ? - Vllt./vllt. auch nicht. Zu wenig Code um das zu beurteilen
Stimmt die MAC-Adresse vom Ziel des Frames? Wenn nicht, wird Wireshark den Frame nur zu Gesicht bekommen, wenn der Adapter auf "promiscuous" steht.
Ok das mit der Ziel MAC-Adresse muss ich noch überprüfen wo man diese einstellt.
Danke. Der Haken ist bei mir allerdings schon gesetzt --> promiscuous mode ist aktiviert.
Wo wird im Code oben überhaupt ein UDP Frame erzeugt? Ausser der uIP Standardschleife sehe ich oben nichts und die tut nur was man ihr sagt. Wenn das "nichts" ist, dann tut sie genau das und Wireshark zeigt genau das an.
Ich möchte zunächst nur ein Ethernet Frame versenden. Da habe ich noch so meine Schwierigkeiten. Ich suche jetzt zunächst im Code wo man die Ziel MAC Adresse einstellt.
Leo schrieb: > Ich möchte zunächst nur ein Ethernet Frame versenden. Und wo tust du das? Im oben geposteten Code jedenfalls nicht.
Ich denke mit der TransmitPacket Funktion kann ich einen Ethernet Frame versenden.
1 | int uIPMain(void) |
2 | {
|
3 | u8_t i, arptimer; |
4 | uip_eth_hdr *BUF = (uip_eth_hdr*)uip_buf; |
5 | |
6 | u32 size; |
7 | |
8 | while(1) |
9 | {
|
10 | TransmitPacket(); |
11 | }
|
12 | }
|
die Variable "uip_len" muss ich allerdings manuell festlegen.
Mit diesem Code nimmst du einen leeren unbeschrifteten Briefumschlag, steckst ihn so wie er ist in den Briefkasten und wunderst dich, warum die Post ihn wegwirft statt ihn deiner Oma zuzustellen. Kein MAC-Header, kein IP-Header, kein UDP-Header, kein garnix. Nur Nullen. Vorausgesetzt natürlich, das TransmitPacket ist nicht auch noch auskommentiert, wie im Paket grad eben.
Ja da gebe ich dir recht. Ich müsste zunächst einen Ethernet Frame erzeugen und diesen Frame der Funktion "ENET_TxPkt" übergeben.
Ich habs geschafft.
1 | void TransmitPacket(void) |
2 | {
|
3 | int i; |
4 | u8 data[1500]; |
5 | |
6 | for(i=0; i < 6; ++i) |
7 | {
|
8 | data[i] = src_MAC[i]; |
9 | }
|
10 | |
11 | for(i=0; i < 6; ++i) |
12 | {
|
13 | data[i+6] = dst_MAC[i]; |
14 | }
|
15 | |
16 | data[i+13] = 0x08; /* Type */ |
17 | data[i+14] = 0x00; |
18 | |
19 | |
20 | data[i+15] = 0xFF; /* ??? */ |
21 | data[i+16] = 0xFF; |
22 | |
23 | for(i=0; i < 50; ++i) |
24 | {
|
25 | data[i+17] = 0xAA; |
26 | }
|
27 | |
28 | ENET_TxPkt(&data,66); |
29 | }
|
Welchen Typ müsste ich bei mir verwenden? Wie müsste ich FCS definieren ?
Die Ethernet FCS macht der Adapter/Controller üblicherweise selbst. In uIP gibt es UDP Support. Zwar nicht unbedingt in der Doku, aber im uip.h steht dazu was drin und die Beisiele für DHCP und DNS verwenden UDP. Im Blindflug ganz ohne jede Ahnung von Ethernet/IP/UDP wirds nicht gehen. Gibt genug Literatur dazu. Im Netz und auf toten Bäumen.
Was meinst du damit ? >>Im Blindflug ganz ohne jede Ahnung von Ethernet/IP/UDP wirds nicht >>gehen. Gibt genug Literatur dazu. Im Netz und auf toten Bäumen.
Als Type habe ich NetWare IPX/SPX ausgewählt. data[i+12] = 0x81; data[i+13] = 0x37; In Wireshark sehe ich allerdings als Type: 0xBC8D
Leo schrieb: > Was meinst du damit ? Dass der bisherige Thread und deine Frage über "Type" usw völlige Unkenntnis über die erwähnten Protokolle nahelegt. Löcher, die man per Literatur stopfen kann.
Leo schrieb: > Als Type habe ich NetWare IPX/SPX ausgewählt. Und warum ausgerechnet das? UDP geht anders.
Ich weiss schon was mit dem Type gemeint ist. Zum Beispiel für Internetworking Protocol (IP) setzt man Type auf 0x0800. Über diesen Type kann der Empfänger entscheiden, um was für ein Frame es sich handelt. Jetzt zum UIP Stack. Der UIP Stack ist irgendwie schwer verständlich. Ein UDP Telegramm zu erzeugen und diesen zu senden, ist für mich nicht einleuchtend, wie man da genau vorgehen muss.
Leo schrieb: > Ich weiss schon was mit dem Type gemeint ist. Zum Beispiel für > Internetworking Protocol (IP) setzt man Type auf 0x0800. Weshalb dann ausgerechnet Novell? > Jetzt zum UIP Stack. Der UIP Stack ist irgendwie schwer verständlich. > Ein UDP Telegramm zu erzeugen und diesen zu senden, ist für mich nicht > einleuchtend, wie man da genau vorgehen muss. Ich habs nur als Server verwendet und das ist es einfacher, weil alles schon drinsteht, nur in verkehrter Reihenfolge. Deshalb der Tipp mit dem DHCP/DNS-Code. Da ist UDP als Initiator drin.
>>Weshalb dann ausgerechnet Novell?
Ok das was blöde von mir. Welchen Type müsste ich bei mir einstellen ?
Da es offenbar immer noch nicht deutlich genug rüber kam: Ich werde hier keine Schulung über die dir fehlenden Grundlagen der Netzwerkprotokolle abhalten.
Ich fange bei so was umgekehrt an. Ich lass mir vom PC einen Frame schicken. Da kann man sich leicht einen gültigen Frame erzeugen lassen, z.B. mit Ping oder auch direkt mit C, Perl, VB .. . Und Wenn die Routes stimmen (oder Broadcast Ping nehmen) kann man auf dem µC den Frame empfangen. Dann hat man schon mal ein Muster für einen gültigen Frame. Erster Versuch ist dann, ihn erstmal zurück schicken. Dann sieht man schon mal im Wireshark was falsch ist. Daran kann man sich dann abarbeiten zusammen mit den entsprechenden RFCs. Und die Network Byte Order nicht vergessen, wenns um Werte mit mehr als 8 Bit geht. MfG Klaus
Ich aknn nun Ethernet Frames vom Mikrocontroller versenden und auch empfangen. Das Senden vom PC mache ich über WinPcap. Das funktioniert super. Jetzt ist es so, dass ich den uip Stack nun einsetzen möchte. Wie kann ich nun ein UDP Frame vom Mikrocontroller an den PC versenden ? Für mein Evaluationboard habe ich bereits ein lauffähige Webserverapllikation. Nach langen Suchen ist mir noch nicht klar wie man mit dem uip Stack UDP Frames erteugen und versenden kann. Gibt es hier jemand der sowas schonmal gemacht hat ?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.