mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfe bei uIP TCP/IP-Stack


Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich verwende den TCP/IP-Stack von Adam Dunkels namens uIP bzw. µIP.

Status/Vorhaben:
** Habe einen ARM7 von Atmel, den SAM7X256 auf den ich eine 
Serveranwendung (zunächst ganz einfach, ohne HTTP/Telnet Protokoll etc.) 
bringen möchte
** Sobald der ARM7 über Port 55000 etwas empfängt soll er eine Meldung 
rausgeben "OK!" oder soetwas in der Art.
** Aus einem Atmelbeispiel habe ich bereits die Treiberfirmware für das 
EMAC. Im Prinzip muss ich nur noch Stack mit Hardwaretreiber 
verheiraten.


Aber das will partou nicht klappen.

Mein Problem ist, dass zwar der EMAC alle Pakete die hier so im Intranet 
verkehren empfangen kann, aber empfängt er eines das für ihn bestimmt 
ist (->Port 55000) reagiert er nicht.


Weil Code mehr als tausend Worte sagt:
int main(void)
{
  /**** 1.  - LOCAL DEFINES               ****/
  /* --------------------------------------- */
  uip_ipaddr_t ipaddr;

  /**** 2.  - INITIALIZING THE ETHERNET   ****/
  /* --------------------------------------- */

  /**** 2.1 - Init local variables ***********/
    struct timer periodic_timer, arp_timer;
    unsigned int i;

  /**** 2.2 - Init drivers and µIP-Core *******/
    tapdev_init();                  // Initialize PHY
    clock_init();                  // Initialize SYCLOCK
    timer_set(&periodic_timer, CLOCK_SECOND / 2);  // Set System Timers
    timer_set(&arp_timer, CLOCK_SECOND * 10);    // Set System Timers
    uip_init();                   // Initialize uIP-Core
    uip_arp_init();                  // Initialize ARP module

  /**** 2.3 - Set IP and MAC address **********/
    uip_ipaddr(ipaddr, 53,141,216,118);
    uip_sethostaddr(ipaddr);
    uip_ipaddr(ipaddr, 53,141,216,1);
    uip_setdraddr(ipaddr);
    uip_ipaddr(ipaddr, 255,255,255,0);
    uip_setnetmask(ipaddr);
    uip_setethaddr(MacAddress);

  uip_flags = 0;  // Reset all UIP flags

  /**** 2.4 - Initialize EFNA *****************/
    uip_listen(HTONS(PortNr));            // Listen to Port 50000

  /**** 3.0 - Main Loop ***********************/
    while(1)
    {
      // Read from EMAC
      uip_len = tapdev_read();
      if(uip_len > 0)
      {
          if(BUF->type == htons(UIP_ETHTYPE_IP))
          {
            led_toggle(LED1);        // <<--- ((1))
              uip_arp_ipin();      
              uip_input();      
              if(uip_len > 0)
              {
                printf("UA: %d\n\r",uip_len);                    uip_arp_out();       // <<--- ((2))
                  tapdev_send();
              }
          }
          else if(BUF->type == htons(UIP_ETHTYPE_ARP))
          {
              uip_arp_arpin();
              if(uip_len > 0)
              {
                  tapdev_send();
              }
          }
      }
      else if(timer_expired(&periodic_timer))
      {
          // This Code will be executed every half of a second
          timer_reset(&periodic_timer);
          for(i = 0; i < UIP_CONNS; i++)
          {
              uip_periodic(i);
              if(uip_len > 0)
              {
                uip_arp_out();
                tapdev_send();
              }
          }
          //Call the ARP timer function every 10 seconds.
          if(timer_expired(&arp_timer))
          {
              timer_reset(&arp_timer);
              uip_arp_timer();
          }
      }
    }
    return 0;
}

Die Probleme im Code:
** mit uip_len = tapdev_read(); wird der EMAC ausgelesen und neue Pakete 
entgegengenommen. Das funktioniert soweit super, läuft stabil.

** In den mit ((1)) gekennzeichneten Abschnitt dringt der ARM noch vor. 
Hier wird mit uip_arp_ipin() und uip_input() jedoch IMMER(!!) die 
Paketlänge auf 0 zurückgesetzt, wesshalb Abschnitt ((2)) NIEMALS 
erreicht wird, auch nicht dann, wenn er es eigentlich sollte.

** Auch ruft uip_input() niemals die hinter UIP_APPCALL hinterlegte 
Funktion von mir auf. Die liegt brach.


An was kann soetwas liegen? Ich weis nicht weiter...
Mit Wireshark sehe ich, dass mein PC korrekt versucht dem ARM Zeichen zu 
sehnden. Der reagiert aber nicht....

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibts niemand, der eine Idee hätte oder mit uIP etwas vertraut ist?
Schade.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.