Forum: PC-Programmierung Ethernet Frames mit Wireshark aufzeichnen


von Leo (Gast)


Angehängte Dateien:

Lesenswert?

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 ?

von Rolf Magnus (Gast)


Lesenswert?

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.

von Leo (Gast)


Lesenswert?

Hallo Rolf,

µC und PC sind über ein Crossoverkabel verbunden.

von Markus C. (ljmarkus)


Lesenswert?

Oder einen HUB verwenden

von (prx) A. K. (prx)


Lesenswert?

Markus C. schrieb:

> Oder einen HUB verwenden

Wenn du noch einen kriegst. Einen echten.

von Klaus (Gast)


Lesenswert?

Markus C. schrieb:
> Oder einen HUB verwenden

Warum? Crosskabel ist doch prima.

MfG Klaus

von Purzel H. (hacky)


Lesenswert?

Moeglicherweise nicht. Moeglicherweise sendet der PC nichts ohne 
vorherige Verbindungsaufnahme. Verbind doch mal den PC mit dem LAN und 
horch diese Kommunikation ab.

von Klaus (Gast)


Lesenswert?

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

von Leo (Gast)


Lesenswert?

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 ?

von Leo (Gast)


Lesenswert?

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
}

von mar IO (Gast)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

Stimmt die MAC-Adresse vom Ziel des Frames? Wenn nicht, wird Wireshark 
den Frame nur zu Gesicht bekommen, wenn der Adapter auf "promiscuous" 
steht.

von Leo (Gast)


Lesenswert?

Ok das mit der Ziel MAC-Adresse muss ich noch überprüfen wo man diese 
einstellt.

von Leo (Gast)


Lesenswert?

Wo kann man in Wireshark "promiscuous" aktivieren ???

von (prx) A. K. (prx)


Lesenswert?

Leo schrieb:

> Wo kann man in Wireshark "promiscuous" aktivieren ???

Capture - Interfaces - Options

von Leo (Gast)


Lesenswert?

Danke. Der Haken ist bei mir allerdings schon gesetzt --> promiscuous 
mode ist aktiviert.

von (prx) A. K. (prx)


Lesenswert?

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.

von Leo (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

Leo schrieb:

> Ich möchte zunächst nur ein Ethernet Frame versenden.

Und wo tust du das? Im oben geposteten Code jedenfalls nicht.

von Leo (Gast)


Lesenswert?

Ich denke mit der TransmitPacket Funktion kann ich einen Ethernet Frame 
versenden.

von Leo (Gast)


Lesenswert?

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.

von Leo (Gast)


Angehängte Dateien:

Lesenswert?

Im Dateianhang befindet sich der gesamt C-Code.

von (prx) A. K. (prx)


Lesenswert?

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.

von Leo (Gast)


Lesenswert?

Ja da gebe ich dir recht. Ich müsste zunächst einen Ethernet Frame 
erzeugen und diesen Frame der Funktion "ENET_TxPkt" übergeben.

von Leo (Gast)


Angehängte Dateien:

Lesenswert?

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 ?

von (prx) A. K. (prx)


Lesenswert?

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.

von Leo (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Leo (Gast)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

Leo schrieb:

> Als Type habe ich NetWare IPX/SPX ausgewählt.

Und warum ausgerechnet das? UDP geht anders.

von Leo (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

von Leo (Gast)


Lesenswert?

>>Weshalb dann ausgerechnet Novell?

Ok das was blöde von mir. Welchen Type müsste ich bei mir einstellen ?

von (prx) A. K. (prx)


Lesenswert?

Da es offenbar immer noch nicht deutlich genug rüber kam: Ich werde hier 
keine Schulung über die dir fehlenden Grundlagen der Netzwerkprotokolle 
abhalten.

von Leo (Gast)


Lesenswert?

Sorry, das ist so von mir nicht gemeint.

von Klaus (Gast)


Lesenswert?

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

von Leo (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.