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