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


von Mike (Gast)


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:
1
int main(void)
2
{
3
  /**** 1.  - LOCAL DEFINES               ****/
4
  /* --------------------------------------- */
5
  uip_ipaddr_t ipaddr;
6
7
  /**** 2.  - INITIALIZING THE ETHERNET   ****/
8
  /* --------------------------------------- */
9
10
  /**** 2.1 - Init local variables ***********/
11
    struct timer periodic_timer, arp_timer;
12
    unsigned int i;
13
14
  /**** 2.2 - Init drivers and µIP-Core *******/
15
    tapdev_init();                  // Initialize PHY
16
    clock_init();                  // Initialize SYCLOCK
17
    timer_set(&periodic_timer, CLOCK_SECOND / 2);  // Set System Timers
18
    timer_set(&arp_timer, CLOCK_SECOND * 10);    // Set System Timers
19
    uip_init();                   // Initialize uIP-Core
20
    uip_arp_init();                  // Initialize ARP module
21
22
  /**** 2.3 - Set IP and MAC address **********/
23
    uip_ipaddr(ipaddr, 53,141,216,118);
24
    uip_sethostaddr(ipaddr);
25
    uip_ipaddr(ipaddr, 53,141,216,1);
26
    uip_setdraddr(ipaddr);
27
    uip_ipaddr(ipaddr, 255,255,255,0);
28
    uip_setnetmask(ipaddr);
29
    uip_setethaddr(MacAddress);
30
31
  uip_flags = 0;  // Reset all UIP flags
32
33
  /**** 2.4 - Initialize EFNA *****************/
34
    uip_listen(HTONS(PortNr));            // Listen to Port 50000
35
36
  /**** 3.0 - Main Loop ***********************/
37
    while(1)
38
    {
39
      // Read from EMAC
40
      uip_len = tapdev_read();
41
      if(uip_len > 0)
42
      {
43
          if(BUF->type == htons(UIP_ETHTYPE_IP))
44
          {
45
            led_toggle(LED1);        // <<--- ((1))
46
              uip_arp_ipin();      
47
              uip_input();      
48
              if(uip_len > 0)
49
              {
50
                printf("UA: %d\n\r",uip_len);                    uip_arp_out();       // <<--- ((2))
51
                  tapdev_send();
52
              }
53
          }
54
          else if(BUF->type == htons(UIP_ETHTYPE_ARP))
55
          {
56
              uip_arp_arpin();
57
              if(uip_len > 0)
58
              {
59
                  tapdev_send();
60
              }
61
          }
62
      }
63
      else if(timer_expired(&periodic_timer))
64
      {
65
          // This Code will be executed every half of a second
66
          timer_reset(&periodic_timer);
67
          for(i = 0; i < UIP_CONNS; i++)
68
          {
69
              uip_periodic(i);
70
              if(uip_len > 0)
71
              {
72
                uip_arp_out();
73
                tapdev_send();
74
              }
75
          }
76
          //Call the ARP timer function every 10 seconds.
77
          if(timer_expired(&arp_timer))
78
          {
79
              timer_reset(&arp_timer);
80
              uip_arp_timer();
81
          }
82
      }
83
    }
84
    return 0;
85
}

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....

von Mike (Gast)


Lesenswert?

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

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.