-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathstack.lst
More file actions
1927 lines (1926 loc) · 78.7 KB
/
stack.lst
File metadata and controls
1927 lines (1926 loc) · 78.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1 .file "stack.c"
2 __SREG__ = 0x3f
3 __SP_H__ = 0x3e
4 __SP_L__ = 0x3d
5 __CCP__ = 0x34
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
10 .text
11 .Ltext0:
118 .section .text.stack_init,"ax",@progbits
120 .global stack_init
122 stack_init:
123 .stabd 46,0,0
1:stack.c **** /*----------------------------------------------------------------------------
2:stack.c **** Copyright: Radig Ulrich mailto: mail@ulrichradig.de
3:stack.c **** Author: Radig Ulrich
4:stack.c **** Remarks:
5:stack.c **** known Problems: none
6:stack.c **** Version: 18.01.2009
7:stack.c **** Description: Ethernet Stack,
8:stack.c **** simplified for use in a bootloader by Jens Mundhenke
9:stack.c ****
10:stack.c **** Dieses Programm ist freie Software. Sie können es unter den Bedingungen der
11:stack.c **** GNU General Public License, wie von der Free Software Foundation veröffentlicht,
12:stack.c **** weitergeben und/oder modifizieren, entweder gemäß Version 2 der Lizenz oder
13:stack.c **** (nach Ihrer Option) jeder späteren Version.
14:stack.c ****
15:stack.c **** Die Veröffentlichung dieses Programms erfolgt in der Hoffnung,
16:stack.c **** daß es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE,
17:stack.c **** sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT
18:stack.c **** FÜR EINEN BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License.
19:stack.c ****
20:stack.c **** Sie sollten eine Kopie der GNU General Public License zusammen mit diesem
21:stack.c **** Programm erhalten haben.
22:stack.c **** Falls nicht, schreiben Sie an die Free Software Foundation,
23:stack.c **** Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
24:stack.c **** ------------------------------------------------------------------------------*/
25:stack.c ****
26:stack.c **** #include "para.h"
27:stack.c **** #include "stack.h"
28:stack.c **** #include "bootloader/tftp.h"
29:stack.c **** #include "config.h"
30:stack.c **** #include "usart.h"
31:stack.c ****
32:stack.c **** // dont forget to enable usart in config.h
33:stack.c **** //#define DEBUG usart_write //mit Debugausgabe
34:stack.c **** #define DEBUG(...) //ohne Debugausgabe
35:stack.c ****
36:stack.c **** unsigned char myip[4];
37:stack.c ****
38:stack.c **** unsigned int IP_id_counter = 0;
39:stack.c ****
40:stack.c **** unsigned char eth_buffer[MTU_SIZE+1];
41:stack.c ****
42:stack.c **** struct arp_table arp_entry[MAX_ARP_ENTRY];
43:stack.c ****
44:stack.c ****
45:stack.c **** //----------------------------------------------------------------------------
46:stack.c **** //Trägt Anwendung in Anwendungsliste ein
47:stack.c **** void stack_init (void)
48:stack.c **** {
125 .LM0:
126 .LFBB1:
127 0000 CF93 push r28
128 0002 DF93 push r29
129 /* prologue: function */
130 /* frame size = 0 */
131 /* stack size = 2 */
132 .L__stack_usage = 2
49:stack.c **** //Timer starten
50:stack.c **** timer_init();
134 .LM1:
135 0004 0E94 0000 call timer_init
51:stack.c ****
52:stack.c **** #if USE_PARAMETERS_FROM_EEPROM
53:stack.c **** //IP, NETMASK und ROUTER_IP aus EEPROM auslesen
54:stack.c **** (*((unsigned long*)&myip[0])) = para_getip(IP_EEPROM_STORE,MYIP);
55:stack.c ****
56:stack.c **** //MAC Adresse setzen
57:stack.c **** if ( para_getchar(MAC_EEPROM_STORE) != 0xFF )
58:stack.c **** for ( int i=0; i<6; i++ )
59:stack.c **** mymac[i] = para_getchar(MAC_EEPROM_STORE+i);
60:stack.c **** #else
61:stack.c **** (*((unsigned long*)&myip[0])) = MYIP;
137 .LM2:
138 0008 80EC ldi r24,lo8(1510058176)
139 000a 98EA ldi r25,hi8(1510058176)
140 000c A1E0 ldi r26,hlo8(1510058176)
141 000e BAE5 ldi r27,hhi8(1510058176)
142 0010 8093 0000 sts myip,r24
143 0014 9093 0000 sts myip+1,r25
144 0018 A093 0000 sts myip+2,r26
145 001c B093 0000 sts myip+3,r27
62:stack.c **** #endif
63:stack.c ****
64:stack.c **** /*NIC Initialisieren*/
65:stack.c **** DEBUG_WRITE("\n\rNIC init:");
66:stack.c **** ETH_INIT();
147 .LM3:
148 0020 0E94 0000 call enc28j60_init
67:stack.c **** DEBUG_WRITE("Ok\r\n");
68:stack.c ****
69:stack.c **** #if USE_ENC28J60
70:stack.c **** ETH_PACKET_SEND(60,eth_buffer);
150 .LM4:
151 0024 C0E0 ldi r28,lo8(eth_buffer)
152 0026 D0E0 ldi r29,hi8(eth_buffer)
153 0028 8CE3 ldi r24,lo8(60)
154 002a 90E0 ldi r25,hi8(60)
155 002c BE01 movw r22,r28
156 002e 0E94 0000 call enc28j60_send_packet
71:stack.c **** ETH_PACKET_SEND(60,eth_buffer);
158 .LM5:
159 0032 8CE3 ldi r24,lo8(60)
160 0034 90E0 ldi r25,hi8(60)
161 0036 BE01 movw r22,r28
162 0038 0E94 0000 call enc28j60_send_packet
163 /* epilogue start */
72:stack.c **** #endif
73:stack.c ****
74:stack.c **** DEBUG_WRITE("My IP: %1i.%1i.%1i.%1i\r\n\r\n",myip[0],myip[1],myip[2],myip[3]);
75:stack.c **** }
165 .LM6:
166 003c DF91 pop r29
167 003e CF91 pop r28
168 0040 0895 ret
170 .Lscope1:
172 .stabd 78,0,0
173 .section .text.arp_entry_add,"ax",@progbits
175 .global arp_entry_add
177 arp_entry_add:
178 .stabd 46,0,0
76:stack.c ****
77:stack.c ****
78:stack.c **** //----------------------------------------------------------------------------
79:stack.c **** //ETH get data
80:stack.c **** void eth_get_data (void)
81:stack.c **** {
82:stack.c **** unsigned int packet_lenght;
83:stack.c ****
84:stack.c **** packet_lenght = ETH_PACKET_RECEIVE(MTU_SIZE,eth_buffer);
85:stack.c **** /*Wenn ein Packet angekommen ist, ist packet_lenght =! 0*/
86:stack.c **** if(packet_lenght > 0)
87:stack.c **** {
88:stack.c **** packet_lenght = packet_lenght - 4;
89:stack.c **** eth_buffer[packet_lenght+1] = 0;
90:stack.c **** eth_len = packet_lenght; // remember length for global access
91:stack.c **** check_packet();
92:stack.c **** }
93:stack.c ****
94:stack.c ****
95:stack.c **** }
96:stack.c ****
97:stack.c ****
98:stack.c **** //----------------------------------------------------------------------------
99:stack.c **** //Check Packet and call Stack for TCP or UDP
100:stack.c **** void check_packet (void)
101:stack.c **** {
102:stack.c **** //Pointer auf Ethernet_Header
103:stack.c **** struct Ethernet_Header *ethernet;
104:stack.c **** ethernet = (struct Ethernet_Header *)ð_buffer[ETHER_OFFSET];
105:stack.c ****
106:stack.c **** //Pointer auf IP_Header
107:stack.c **** struct IP_Header *ip;
108:stack.c **** ip = (struct IP_Header *)ð_buffer[IP_OFFSET];
109:stack.c **** #if USE_PING
110:stack.c **** //Pointer auf ICMP_Header
111:stack.c **** struct ICMP_Header *icmp;
112:stack.c **** icmp = (struct ICMP_Header *)ð_buffer[ICMP_OFFSET];
113:stack.c **** #endif
114:stack.c ****
115:stack.c **** if(ETHERNET_ARP_DATAGRAMM) {
116:stack.c **** //Erzeugt ein ARP Reply Packet
117:stack.c **** arp_reply();
118:stack.c **** } else {
119:stack.c **** if(ETHERNET_IP_DATAGRAMM && IF_MYIP) {
120:stack.c **** arp_entry_add(); //Refresh des ARP Eintrages
121:stack.c **** #if USE_PING
122:stack.c **** //Ist protokoll Byte = 1 dann ist es ein ICMP Packet
123:stack.c **** if(IP_ICMP_PACKET) {
124:stack.c **** switch ( icmp->ICMP_Type ) {
125:stack.c **** case (0x08):
126:stack.c **** //Echo-Request empfangen, erzeugen eines ICMP Reply Packet (PING Echo)
127:stack.c **** icmp_send(ip->IP_Srcaddr,0x00,0x00,icmp->ICMP_SeqNum,icmp->ICMP_Id);
128:stack.c **** break;
129:stack.c **** case (0x00):
130:stack.c **** //Echo-Reply Packet empfangen, Empfang melden
131:stack.c **** //TODO: Erst Sequenznummer vergleichen?, Zeitmessung?
132:stack.c **** DEBUG_WRITE("%i",(ip->IP_Srcaddr&0x000000FF));
133:stack.c **** DEBUG_WRITE(".%i",((ip->IP_Srcaddr&0x0000FF00)>>8));
134:stack.c **** DEBUG_WRITE(".%i",((ip->IP_Srcaddr&0x00FF0000)>>16));
135:stack.c **** DEBUG_WRITE(".%i",((ip->IP_Srcaddr&0xFF000000)>>24));
136:stack.c **** DEBUG_WRITE(": PONG!\r\n");
137:stack.c **** break;
138:stack.c **** }
139:stack.c **** return;
140:stack.c **** }
141:stack.c **** else
142:stack.c **** #endif
143:stack.c **** {
144:stack.c **** if(IP_UDP_PACKET) udp_socket_process();
145:stack.c **** }
146:stack.c **** }
147:stack.c **** }
148:stack.c **** return;
149:stack.c **** }
150:stack.c ****
151:stack.c **** //----------------------------------------------------------------------------
152:stack.c **** //erzeugt einen ARP - Eintrag wenn noch nicht vorhanden
153:stack.c **** void arp_entry_add (void)
154:stack.c **** {
180 .LM7:
181 .LFBB2:
182 0000 CF93 push r28
183 0002 DF93 push r29
184 /* prologue: function */
185 /* frame size = 0 */
186 /* stack size = 2 */
187 .L__stack_usage = 2
188 .LBB2:
155:stack.c **** struct Ethernet_Header *ethernet;
156:stack.c **** ethernet = (struct Ethernet_Header *)ð_buffer[ETHER_OFFSET];
157:stack.c ****
158:stack.c **** struct ARP_Header *arp;
159:stack.c **** arp = (struct ARP_Header *)ð_buffer[ARP_OFFSET];
160:stack.c ****
161:stack.c **** struct IP_Header *ip;
162:stack.c **** ip = (struct IP_Header *)ð_buffer[IP_OFFSET];
163:stack.c ****
164:stack.c **** //Eintrag schon vorhanden?
165:stack.c **** for (unsigned char a = 0;a<MAX_ARP_ENTRY;a++)
166:stack.c **** {
167:stack.c **** if(ETHERNET_ARP_DATAGRAMM)
190 .LM8:
191 0004 6091 0000 lds r22,eth_buffer+12
192 0008 7091 0000 lds r23,eth_buffer+12+1
193 000c C0E0 ldi r28,lo8(arp_entry+6)
194 000e D0E0 ldi r29,hi8(arp_entry+6)
195 .LBE2:
153:stack.c **** void arp_entry_add (void)
197 .LM9:
198 0010 FE01 movw r30,r28
199 .L6:
200 .LBB3:
202 .LM10:
203 0012 86E0 ldi r24,hi8(1544)
204 0014 6830 cpi r22,lo8(1544)
205 0016 7807 cpc r23,r24
206 0018 01F4 brne .L3
168:stack.c **** {
169:stack.c **** if(arp_entry[a].arp_t_ip == arp->ARP_SIPAddr)
208 .LM11:
209 001a 2081 ld r18,Z
210 001c 3181 ldd r19,Z+1
211 001e 4281 ldd r20,Z+2
212 0020 5381 ldd r21,Z+3
213 0022 8091 0000 lds r24,eth_buffer+28
214 0026 9091 0000 lds r25,eth_buffer+28+1
215 002a A091 0000 lds r26,eth_buffer+28+2
216 002e B091 0000 lds r27,eth_buffer+28+3
217 0032 00C0 rjmp .L16
218 .L3:
170:stack.c **** {
171:stack.c **** return;
172:stack.c **** }
173:stack.c **** }
174:stack.c **** if(ETHERNET_IP_DATAGRAMM)
220 .LM12:
221 0034 6830 cpi r22,8
222 0036 7105 cpc r23,__zero_reg__
223 0038 01F4 brne .L5
175:stack.c **** {
176:stack.c **** if(arp_entry[a].arp_t_ip == ip->IP_Srcaddr)
225 .LM13:
226 003a 2081 ld r18,Z
227 003c 3181 ldd r19,Z+1
228 003e 4281 ldd r20,Z+2
229 0040 5381 ldd r21,Z+3
230 0042 8091 0000 lds r24,eth_buffer+26
231 0046 9091 0000 lds r25,eth_buffer+26+1
232 004a A091 0000 lds r26,eth_buffer+26+2
233 004e B091 0000 lds r27,eth_buffer+26+3
234 .L16:
235 0052 2817 cp r18,r24
236 0054 3907 cpc r19,r25
237 0056 4A07 cpc r20,r26
238 0058 5B07 cpc r21,r27
239 005a 01F4 brne .+2
240 005c 00C0 rjmp .L2
241 .L5:
242 005e 3A96 adiw r30,10
165:stack.c **** for (unsigned char a = 0;a<MAX_ARP_ENTRY;a++)
244 .LM14:
245 0060 80E0 ldi r24,hi8(arp_entry+56)
246 0062 E030 cpi r30,lo8(arp_entry+56)
247 0064 F807 cpc r31,r24
248 0066 01F4 brne .L6
249 0068 20E0 ldi r18,lo8(0)
250 006a 30E0 ldi r19,hi8(0)
251 .L11:
252 006c 522F mov r21,r18
253 006e 432F mov r20,r19
254 .LBE3:
255 .LBB4:
177:stack.c **** {
178:stack.c **** return;
179:stack.c **** }
180:stack.c **** }
181:stack.c **** }
182:stack.c ****
183:stack.c **** //Freien Eintrag finden
184:stack.c **** for (unsigned char b = 0;b<MAX_ARP_ENTRY;b++)
185:stack.c **** {
186:stack.c **** if(arp_entry[b].arp_t_ip == 0)
257 .LM15:
258 0070 8881 ld r24,Y
259 0072 9981 ldd r25,Y+1
260 0074 AA81 ldd r26,Y+2
261 0076 BB81 ldd r27,Y+3
262 0078 0097 sbiw r24,0
263 007a A105 cpc r26,__zero_reg__
264 007c B105 cpc r27,__zero_reg__
265 007e 01F0 breq .+2
266 0080 00C0 rjmp .L7
187:stack.c **** {
188:stack.c **** if(ETHERNET_ARP_DATAGRAMM)
268 .LM16:
269 0082 86E0 ldi r24,hi8(1544)
270 0084 6830 cpi r22,lo8(1544)
271 0086 7807 cpc r23,r24
272 0088 01F4 brne .L8
153:stack.c **** void arp_entry_add (void)
274 .LM17:
275 008a A0E0 ldi r26,lo8(eth_buffer+6)
276 008c B0E0 ldi r27,hi8(eth_buffer+6)
277 008e C901 movw r24,r18
278 0090 FC01 movw r30,r24
279 0092 EE0F lsl r30
280 0094 FF1F rol r31
281 0096 23E0 ldi r18,3
282 0098 880F 1: lsl r24
283 009a 991F rol r25
284 009c 2A95 dec r18
285 009e 01F4 brne 1b
286 00a0 E80F add r30,r24
287 00a2 F91F adc r31,r25
288 00a4 E050 subi r30,lo8(-(arp_entry))
289 00a6 F040 sbci r31,hi8(-(arp_entry))
290 .LBE4:
291 .LBB7:
292 00a8 86E0 ldi r24,lo8(6)
293 .L9:
294 .LBE7:
295 .LBB8:
296 .LBB5:
189:stack.c **** {
190:stack.c **** for(unsigned char a = 0; a < 6; a++)
191:stack.c **** {
192:stack.c **** arp_entry[b].arp_t_mac[a] = ethernet->EnetPacketSrc[a];
298 .LM18:
299 00aa 9D91 ld r25,X+
300 00ac 9193 st Z+,r25
301 00ae 8150 subi r24,lo8(-(-1))
190:stack.c **** for(unsigned char a = 0; a < 6; a++)
303 .LM19:
304 00b0 01F4 brne .L9
305 .LBE5:
193:stack.c **** }
194:stack.c **** arp_entry[b].arp_t_ip = arp->ARP_SIPAddr;
307 .LM20:
308 00b2 852F mov r24,r21
309 00b4 942F mov r25,r20
310 00b6 FC01 movw r30,r24
311 00b8 EE0F lsl r30
312 00ba FF1F rol r31
313 00bc A3E0 ldi r26,3
314 00be 880F 1: lsl r24
315 00c0 991F rol r25
316 00c2 AA95 dec r26
317 00c4 01F4 brne 1b
318 00c6 E80F add r30,r24
319 00c8 F91F adc r31,r25
320 00ca E050 subi r30,lo8(-(arp_entry))
321 00cc F040 sbci r31,hi8(-(arp_entry))
322 00ce 8091 0000 lds r24,eth_buffer+28
323 00d2 9091 0000 lds r25,eth_buffer+28+1
324 00d6 A091 0000 lds r26,eth_buffer+28+2
325 00da B091 0000 lds r27,eth_buffer+28+3
326 00de 00C0 rjmp .L17
327 .L8:
195:stack.c **** return;
196:stack.c **** }
197:stack.c **** if(ETHERNET_IP_DATAGRAMM)
329 .LM21:
330 00e0 6830 cpi r22,8
331 00e2 7105 cpc r23,__zero_reg__
332 00e4 01F4 brne .L2
153:stack.c **** void arp_entry_add (void)
334 .LM22:
335 00e6 A0E0 ldi r26,lo8(eth_buffer+6)
336 00e8 B0E0 ldi r27,hi8(eth_buffer+6)
337 00ea C901 movw r24,r18
338 00ec FC01 movw r30,r24
339 00ee EE0F lsl r30
340 00f0 FF1F rol r31
341 00f2 63E0 ldi r22,3
342 00f4 880F 1: lsl r24
343 00f6 991F rol r25
344 00f8 6A95 dec r22
345 00fa 01F4 brne 1b
346 00fc E80F add r30,r24
347 00fe F91F adc r31,r25
348 0100 E050 subi r30,lo8(-(arp_entry))
349 0102 F040 sbci r31,hi8(-(arp_entry))
350 .LBE8:
351 .LBB9:
352 0104 86E0 ldi r24,lo8(6)
353 .L10:
354 .LBE9:
355 .LBB10:
356 .LBB6:
198:stack.c **** {
199:stack.c **** for(unsigned char a = 0; a < 6; a++)
200:stack.c **** {
201:stack.c **** arp_entry[b].arp_t_mac[a] = ethernet->EnetPacketSrc[a];
358 .LM23:
359 0106 9D91 ld r25,X+
360 0108 9193 st Z+,r25
361 010a 8150 subi r24,lo8(-(-1))
199:stack.c **** for(unsigned char a = 0; a < 6; a++)
363 .LM24:
364 010c 01F4 brne .L10
365 .LBE6:
202:stack.c **** }
203:stack.c **** arp_entry[b].arp_t_ip = ip->IP_Srcaddr;
367 .LM25:
368 010e 852F mov r24,r21
369 0110 942F mov r25,r20
370 0112 FC01 movw r30,r24
371 0114 EE0F lsl r30
372 0116 FF1F rol r31
373 0118 23E0 ldi r18,3
374 011a 880F 1: lsl r24
375 011c 991F rol r25
376 011e 2A95 dec r18
377 0120 01F4 brne 1b
378 0122 E80F add r30,r24
379 0124 F91F adc r31,r25
380 0126 E050 subi r30,lo8(-(arp_entry))
381 0128 F040 sbci r31,hi8(-(arp_entry))
382 012a 8091 0000 lds r24,eth_buffer+26
383 012e 9091 0000 lds r25,eth_buffer+26+1
384 0132 A091 0000 lds r26,eth_buffer+26+2
385 0136 B091 0000 lds r27,eth_buffer+26+3
386 .L17:
387 013a 8683 std Z+6,r24
388 013c 9783 std Z+7,r25
389 013e A087 std Z+8,r26
390 0140 B187 std Z+9,r27
204:stack.c **** return;
392 .LM26:
393 0142 00C0 rjmp .L2
394 .L7:
395 0144 2F5F subi r18,lo8(-(1))
396 0146 3F4F sbci r19,hi8(-(1))
397 0148 2A96 adiw r28,10
184:stack.c **** for (unsigned char b = 0;b<MAX_ARP_ENTRY;b++)
399 .LM27:
400 014a 2530 cpi r18,5
401 014c 3105 cpc r19,__zero_reg__
402 014e 01F0 breq .+2
403 0150 00C0 rjmp .L11
404 .L2:
405 /* epilogue start */
406 .LBE10:
205:stack.c **** }
206:stack.c ****
207:stack.c **** DEBUG("No ARP/IP packet!\r\n");
208:stack.c **** return;
209:stack.c **** }
210:stack.c **** }
211:stack.c **** //Eintrag konnte nicht mehr aufgenommen werden
212:stack.c **** DEBUG("ARP table full!\r\n");
213:stack.c **** return;
214:stack.c **** }
408 .LM28:
409 0152 DF91 pop r29
410 0154 CF91 pop r28
411 0156 0895 ret
413 .Lscope2:
415 .stabd 78,0,0
416 .section .text.arp_entry_search,"ax",@progbits
419 .global arp_entry_search
421 arp_entry_search:
422 .stabd 46,0,0
215:stack.c ****
216:stack.c **** //----------------------------------------------------------------------------
217:stack.c **** //Diese Routine such anhand der IP den ARP eintrag
218:stack.c **** char arp_entry_search (unsigned long dest_ip)
219:stack.c **** {
424 .LM29:
425 .LFBB3:
426 /* prologue: function */
427 /* frame size = 0 */
428 /* stack size = 0 */
429 .L__stack_usage = 0
220:stack.c **** for (unsigned char b = 0;b<MAX_ARP_ENTRY;b++)
431 .LM30:
432 0000 E0E0 ldi r30,lo8(arp_entry+6)
433 0002 F0E0 ldi r31,hi8(arp_entry+6)
434 0004 A0E0 ldi r26,lo8(0)
435 .L20:
436 .LBB11:
221:stack.c **** {
222:stack.c **** if(arp_entry[b].arp_t_ip == dest_ip)
438 .LM31:
439 0006 2081 ld r18,Z
440 0008 3181 ldd r19,Z+1
441 000a 4281 ldd r20,Z+2
442 000c 5381 ldd r21,Z+3
443 000e 2617 cp r18,r22
444 0010 3707 cpc r19,r23
445 0012 4807 cpc r20,r24
446 0014 5907 cpc r21,r25
447 0016 01F0 breq .L19
220:stack.c **** for (unsigned char b = 0;b<MAX_ARP_ENTRY;b++)
449 .LM32:
450 0018 AF5F subi r26,lo8(-(1))
451 001a 3A96 adiw r30,10
452 001c A530 cpi r26,lo8(5)
453 001e 01F4 brne .L20
454 .L19:
455 .LBE11:
223:stack.c **** {
224:stack.c **** return(b);
225:stack.c **** }
226:stack.c **** }
227:stack.c **** return (MAX_ARP_ENTRY);
228:stack.c **** }
457 .LM33:
458 0020 8A2F mov r24,r26
459 /* epilogue start */
460 0022 0895 ret
465 .Lscope3:
467 .stabd 78,0,0
468 .section .text.new_eth_header,"ax",@progbits
471 .global new_eth_header
473 new_eth_header:
474 .stabd 46,0,0
229:stack.c ****
230:stack.c **** //----------------------------------------------------------------------------
231:stack.c **** //Diese Routine Erzeugt ein neuen Ethernetheader
232:stack.c **** void new_eth_header (unsigned char *buffer,unsigned long dest_ip)
233:stack.c **** {
476 .LM34:
477 .LFBB4:
478 0000 EF92 push r14
479 0002 FF92 push r15
480 0004 0F93 push r16
481 0006 1F93 push r17
482 0008 CF93 push r28
483 000a DF93 push r29
484 /* prologue: function */
485 /* frame size = 0 */
486 /* stack size = 6 */
487 .L__stack_usage = 6
488 000c 8C01 movw r16,r24
489 000e CB01 movw r24,r22
490 0010 BA01 movw r22,r20
234:stack.c **** struct Ethernet_Header *ethernet;
235:stack.c **** ethernet = (struct Ethernet_Header *)&buffer[ETHER_OFFSET];
236:stack.c ****
237:stack.c **** unsigned char b = arp_entry_search (dest_ip);
492 .LM35:
493 0012 0E94 0000 call arp_entry_search
238:stack.c ****
239:stack.c **** if (b != MAX_ARP_ENTRY) //Eintrag gefunden wenn ungleich
495 .LM36:
496 0016 8530 cpi r24,lo8(5)
497 0018 01F0 breq .L23
232:stack.c **** void new_eth_header (unsigned char *buffer,unsigned long dest_ip)
499 .LM37:
500 001a 282F mov r18,r24
501 001c 30E0 ldi r19,lo8(0)
502 001e F901 movw r30,r18
503 0020 EE0F lsl r30
504 0022 FF1F rol r31
505 0024 43E0 ldi r20,3
506 0026 220F 1: lsl r18
507 0028 331F rol r19
508 002a 4A95 dec r20
509 002c 01F4 brne 1b
510 002e E20F add r30,r18
511 0030 F31F adc r31,r19
512 0032 E050 subi r30,lo8(-(arp_entry))
513 0034 F040 sbci r31,hi8(-(arp_entry))
515 .LM38:
516 0036 E02E mov r14,r16
517 0038 E701 movw r28,r14
518 003a 7E01 movw r14,r28
519 003c F12E mov r15,r17
520 003e E701 movw r28,r14
521 0040 A0E0 ldi r26,lo8(mymac)
522 0042 B0E0 ldi r27,hi8(mymac)
523 .L24:
524 .LBB12:
240:stack.c **** {
241:stack.c **** for(unsigned char a = 0; a < 6; a++)
242:stack.c **** {
243:stack.c **** //MAC Destadresse wird geschrieben mit MAC Sourceadresse
244:stack.c **** ethernet->EnetPacketDest[a] = arp_entry[b].arp_t_mac[a];
526 .LM39:
527 0044 8191 ld r24,Z+
528 0046 8993 st Y+,r24
245:stack.c **** //Meine MAC Adresse wird in Sourceadresse geschrieben
246:stack.c **** ethernet->EnetPacketSrc[a] = mymac[a];
530 .LM40:
531 0048 8D91 ld r24,X+
532 004a 8D83 std Y+5,r24
241:stack.c **** for(unsigned char a = 0; a < 6; a++)
534 .LM41:
535 004c 30E0 ldi r19,hi8(mymac+6)
536 004e A030 cpi r26,lo8(mymac+6)
537 0050 B307 cpc r27,r19
538 0052 01F4 brne .L24
539 0054 00C0 rjmp .L22
540 .L23:
241:stack.c **** for(unsigned char a = 0; a < 6; a++)
542 .LM42:
543 0056 A02F mov r26,r16
544 0058 B12F mov r27,r17
545 005a E0E0 ldi r30,lo8(mymac)
546 005c F0E0 ldi r31,hi8(mymac)
547 .LBE12:
548 .LBB13:
247:stack.c **** }
248:stack.c **** return;
249:stack.c **** }
250:stack.c **** DEBUG("No ARP entry found\r\n");
251:stack.c ****
252:stack.c **** for(unsigned char a = 0; a < 6; a++)
253:stack.c **** {
254:stack.c **** //MAC Destadresse wird geschrieben mit MAC Sourceadresse
255:stack.c **** ethernet->EnetPacketDest[a] = 0xFF;
550 .LM43:
551 005e 8FEF ldi r24,lo8(-1)
552 .L26:
554 .LM44:
555 0060 8D93 st X+,r24
256:stack.c **** //Meine MAC Adresse wird in Sourceadresse geschrieben
257:stack.c **** ethernet->EnetPacketSrc[a] = mymac[a];
557 .LM45:
558 0062 9191 ld r25,Z+
559 0064 1596 adiw r26,5
560 0066 9C93 st X,r25
561 0068 1597 sbiw r26,5
252:stack.c **** for(unsigned char a = 0; a < 6; a++)
563 .LM46:
564 006a 90E0 ldi r25,hi8(mymac+6)
565 006c E030 cpi r30,lo8(mymac+6)
566 006e F907 cpc r31,r25
567 0070 01F4 brne .L26
568 .L22:
569 /* epilogue start */
570 .LBE13:
258:stack.c **** }
259:stack.c **** return;
260:stack.c ****
261:stack.c **** }
572 .LM47:
573 0072 DF91 pop r29
574 0074 CF91 pop r28
575 0076 1F91 pop r17
576 0078 0F91 pop r16
577 007a FF90 pop r15
578 007c EF90 pop r14
579 007e 0895 ret
584 .Lscope4:
586 .stabd 78,0,0
587 .section .text.arp_reply,"ax",@progbits
589 .global arp_reply
591 arp_reply:
592 .stabd 46,0,0
262:stack.c ****
263:stack.c **** //----------------------------------------------------------------------------
264:stack.c **** //Diese Routine Antwortet auf ein ARP Packet
265:stack.c **** void arp_reply (void)
266:stack.c **** {
594 .LM48:
595 .LFBB5:
596 0000 EF92 push r14
597 0002 FF92 push r15
598 0004 0F93 push r16
599 0006 1F93 push r17
600 0008 CF93 push r28
601 000a DF93 push r29
602 /* prologue: function */
603 /* frame size = 0 */
604 /* stack size = 6 */
605 .L__stack_usage = 6
267:stack.c **** struct Ethernet_Header *ethernet;
268:stack.c **** ethernet = (struct Ethernet_Header *)ð_buffer[ETHER_OFFSET];
269:stack.c ****
270:stack.c **** struct ARP_Header *arp;
271:stack.c **** arp = (struct ARP_Header *)ð_buffer[ARP_OFFSET];
607 .LM49:
608 000c C0E0 ldi r28,lo8(eth_buffer+14)
609 000e D0E0 ldi r29,hi8(eth_buffer+14)
272:stack.c ****
273:stack.c **** //2 Byte Hardware Typ: Enthält den Code für Ethernet
274:stack.c **** if( arp->ARP_HWType == 0x0100 &&
611 .LM50:
612 0010 8091 0000 lds r24,eth_buffer+14
613 0014 9091 0000 lds r25,eth_buffer+14+1
614 0018 21E0 ldi r18,hi8(256)
615 001a 8030 cpi r24,lo8(256)
616 001c 9207 cpc r25,r18
617 001e 01F0 breq .+2
618 0020 00C0 rjmp .L29
620 .LM51:
621 0022 8091 0000 lds r24,eth_buffer+16
622 0026 9091 0000 lds r25,eth_buffer+16+1
623 002a 8830 cpi r24,8
624 002c 9105 cpc r25,__zero_reg__
625 002e 01F0 breq .+2
626 0030 00C0 rjmp .L29
275:stack.c ****
276:stack.c **** //2 Byte Protokoll Typ: Enthält den Code für IP
277:stack.c **** arp->ARP_PRType == 0x0008 &&
628 .LM52:
629 0032 8091 0000 lds r24,eth_buffer+18
630 0036 8630 cpi r24,lo8(6)
631 0038 01F0 breq .+2
632 003a 00C0 rjmp .L29
278:stack.c ****
279:stack.c **** //1Byte Länge der Hardwareadresse:Enthält 6 für 6 Byte MAC Addresse
280:stack.c **** arp->ARP_HWLen == 0x06 &&
634 .LM53:
635 003c 8091 0000 lds r24,eth_buffer+19
636 0040 8430 cpi r24,lo8(4)
637 0042 01F0 breq .+2
638 0044 00C0 rjmp .L29
281:stack.c ****
282:stack.c **** //1Byte Länge der Protokolladresse:Enthält 4 für 4 Byte Adressen
283:stack.c **** arp->ARP_PRLen == 0x04 &&
640 .LM54:
641 0046 2091 0000 lds r18,eth_buffer+38
642 004a 3091 0000 lds r19,eth_buffer+38+1
643 004e 4091 0000 lds r20,eth_buffer+38+2
644 0052 5091 0000 lds r21,eth_buffer+38+3
645 0056 8091 0000 lds r24,myip
646 005a 9091 0000 lds r25,myip+1
647 005e A091 0000 lds r26,myip+2
648 0062 B091 0000 lds r27,myip+3
649 0066 2817 cp r18,r24
650 0068 3907 cpc r19,r25
651 006a 4A07 cpc r20,r26
652 006c 5B07 cpc r21,r27
653 006e 01F0 breq .+2
654 0070 00C0 rjmp .L29
284:stack.c ****
285:stack.c **** //Ist das ARP Packet für meine IP Addresse bestimmt
286:stack.c **** //Vergleiche ARP Target IP Adresse mit meiner IP
287:stack.c **** arp->ARP_TIPAddr == *((unsigned long*)&myip[0]))
288:stack.c **** {
289:stack.c **** //Operation handelt es sich um eine anfrage
290:stack.c **** if (arp->ARP_Op == 0x0100)
656 .LM55:
657 0072 8091 0000 lds r24,eth_buffer+20
658 0076 9091 0000 lds r25,eth_buffer+20+1
659 007a A1E0 ldi r26,hi8(256)
660 007c 8030 cpi r24,lo8(256)
661 007e 9A07 cpc r25,r26
662 0080 01F0 breq .+2
663 0082 00C0 rjmp .L31
664 .LBB14:
291:stack.c **** {
292:stack.c **** //Rechner Eingetragen wenn noch nicht geschehen?
293:stack.c **** arp_entry_add();
666 .LM56:
667 0084 0E94 0000 call arp_entry_add
294:stack.c ****
295:stack.c **** new_eth_header (eth_buffer, arp->ARP_SIPAddr); //Erzeugt ein neuen Ethernetheader
669 .LM57:
670 0088 4091 0000 lds r20,eth_buffer+28
671 008c 5091 0000 lds r21,eth_buffer+28+1
672 0090 6091 0000 lds r22,eth_buffer+28+2
673 0094 7091 0000 lds r23,eth_buffer+28+3
674 0098 CE01 movw r24,r28
675 009a 0E97 sbiw r24,14
676 009c 0E94 0000 call new_eth_header
296:stack.c ****
297:stack.c **** ethernet->EnetPacketType = 0x0608; //Nutzlast 0x0800=IP Datagramm;0x0806 = ARP
678 .LM58:
679 00a0 88E0 ldi r24,lo8(1544)
680 00a2 96E0 ldi r25,hi8(1544)
681 00a4 9093 0000 sts eth_buffer+12+1,r25
682 00a8 8093 0000 sts eth_buffer+12,r24
298:stack.c ****
299:stack.c **** unsigned char b = arp_entry_search (arp->ARP_SIPAddr);
684 .LM59:
685 00ac E090 0000 lds r14,eth_buffer+28
686 00b0 F090 0000 lds r15,eth_buffer+28+1
687 00b4 0091 0000 lds r16,eth_buffer+28+2
688 00b8 1091 0000 lds r17,eth_buffer+28+3
689 00bc C801 movw r24,r16
690 00be B701 movw r22,r14
691 00c0 0E94 0000 call arp_entry_search
300:stack.c **** if (b != MAX_ARP_ENTRY) //Eintrag gefunden wenn ungleich
693 .LM60:
694 00c4 8530 cpi r24,lo8(5)
695 00c6 01F0 breq .L32
265:stack.c **** void arp_reply (void)
697 .LM61:
698 00c8 282F mov r18,r24
699 00ca 30E0 ldi r19,lo8(0)
700 00cc F901 movw r30,r18
701 00ce EE0F lsl r30
702 00d0 FF1F rol r31
703 00d2 63E0 ldi r22,3
704 00d4 220F 1: lsl r18
705 00d6 331F rol r19
706 00d8 6A95 dec r22
707 00da 01F4 brne 1b
708 00dc E20F add r30,r18
709 00de F31F adc r31,r19
710 00e0 E050 subi r30,lo8(-(arp_entry))
711 00e2 F040 sbci r31,hi8(-(arp_entry))
713 .LM62:
714 00e4 80E0 ldi r24,lo8(mymac)
715 00e6 90E0 ldi r25,hi8(mymac)
265:stack.c **** void arp_reply (void)
717 .LM63:
718 00e8 AE01 movw r20,r28
719 00ea 485F subi r20,lo8(-(8))
720 00ec 5F4F sbci r21,hi8(-(8))
721 .L33:
722 .LBB15:
301:stack.c **** {
302:stack.c **** for(unsigned char a = 0; a < 6; a++)
303:stack.c **** {
304:stack.c **** //ARP MAC Targetadresse wird geschrieben mit ARP Sourceadresse
305:stack.c **** arp->ARP_THAddr[a] = arp_entry[b].arp_t_mac[a];
724 .LM64:
725 00ee 2191 ld r18,Z+
726 00f0 DA01 movw r26,r20
727 00f2 1A96 adiw r26,10
728 00f4 2C93 st X,r18
306:stack.c **** //ARP MAC Sourceadresse wird geschrieben mit My MAC Adresse
307:stack.c **** arp->ARP_SHAddr[a] = mymac[a];
730 .LM65:
731 00f6 DC01 movw r26,r24
732 00f8 2D91 ld r18,X+
733 00fa CD01 movw r24,r26
734 00fc DA01 movw r26,r20
735 00fe 2D93 st X+,r18
736 0100 AD01 movw r20,r26
302:stack.c **** for(unsigned char a = 0; a < 6; a++)
738 .LM66:
739 0102 B0E0 ldi r27,hi8(mymac+6)
740 0104 8030 cpi r24,lo8(mymac+6)
741 0106 9B07 cpc r25,r27
742 0108 01F4 brne .L33
743 .L32:
744 .LBE15:
308:stack.c **** }
309:stack.c **** }
310:stack.c **** else
311:stack.c **** {
312:stack.c **** DEBUG("No ARP entry found\r\n");//Unwarscheinlich das das jemals passiert!
313:stack.c **** }
314:stack.c ****
315:stack.c **** //ARP operation wird auf 2 gesetzt damit der andere merkt es ist ein ECHO
316:stack.c **** arp->ARP_Op = 0x0200;
746 .LM67:
747 010a 80E0 ldi r24,lo8(512)
748 010c 92E0 ldi r25,hi8(512)
749 010e 9F83 std Y+7,r25
750 0110 8E83 std Y+6,r24
317:stack.c **** //ARP Target IP Adresse wird geschrieben mit ARP Source IP Adresse
318:stack.c **** arp->ARP_TIPAddr = arp->ARP_SIPAddr;
752 .LM68:
753 0112 E88E std Y+24,r14
754 0114 F98E std Y+25,r15
755 0116 0A8F std Y+26,r16
756 0118 1B8F std Y+27,r17
319:stack.c **** //Meine IP Adresse wird in ARP Source IP Adresse geschrieben
320:stack.c **** arp->ARP_SIPAddr = *((unsigned long *)&myip[0]);
758 .LM69:
759 011a 8091 0000 lds r24,myip
760 011e 9091 0000 lds r25,myip+1
761 0122 A091 0000 lds r26,myip+2
762 0126 B091 0000 lds r27,myip+3
763 012a 8E87 std Y+14,r24
764 012c 9F87 std Y+15,r25
765 012e A88B std Y+16,r26
766 0130 B98B std Y+17,r27
321:stack.c ****
322:stack.c **** //Nun ist das ARP-Packet fertig zum Senden !!!
323:stack.c **** //Sendet das erzeugte ARP Packet
324:stack.c **** ETH_PACKET_SEND(ARP_REPLY_LEN,eth_buffer);
768 .LM70:
769 0132 8CE3 ldi r24,lo8(60)
770 0134 90E0 ldi r25,hi8(60)
771 0136 60E0 ldi r22,lo8(eth_buffer)
772 0138 70E0 ldi r23,hi8(eth_buffer)
773 013a 0E94 0000 call enc28j60_send_packet
325:stack.c **** return;
775 .LM71:
776 013e 00C0 rjmp .L29
777 .L31:
778 .LBE14:
326:stack.c **** }
327:stack.c **** //es handelt sich um ein REPLY von einem anderen Client
328:stack.c **** if (arp->ARP_Op == 0x0200)
780 .LM72:
781 0140 22E0 ldi r18,hi8(512)
782 0142 8030 cpi r24,lo8(512)
783 0144 9207 cpc r25,r18
784 0146 01F4 brne .L29
329:stack.c **** {
330:stack.c **** //Rechner Eingetragen wenn noch nicht geschehen?
331:stack.c **** arp_entry_add();
786 .LM73:
787 0148 0E94 0000 call arp_entry_add
788 .L29:
789 /* epilogue start */
332:stack.c ****
333:stack.c **** DEBUG("ARP REPLY!\r\n");
334:stack.c **** }
335:stack.c **** }
336:stack.c **** return;
337:stack.c **** }
791 .LM74:
792 014c DF91 pop r29
793 014e CF91 pop r28
794 0150 1F91 pop r17
795 0152 0F91 pop r16
796 0154 FF90 pop r15
797 0156 EF90 pop r14
798 0158 0895 ret
806 .Lscope5:
808 .stabd 78,0,0
809 .section .text.checksum,"ax",@progbits
814 .global checksum
816 checksum:
817 .stabd 46,0,0
338:stack.c ****
339:stack.c **** //----------------------------------------------------------------------------
340:stack.c **** //Diese Routine erzeugt ein ARP Request
341:stack.c **** char arp_request (unsigned long dest_ip)
342:stack.c **** {
343:stack.c **** unsigned char buffer[ARP_REQUEST_LEN];
344:stack.c **** unsigned char index = 0;
345:stack.c **** unsigned long dest_ip_store;
346:stack.c ****
347:stack.c **** struct Ethernet_Header *ethernet;
348:stack.c **** ethernet = (struct Ethernet_Header *)&buffer[ETHER_OFFSET];
349:stack.c ****
350:stack.c **** struct ARP_Header *arp;
351:stack.c **** arp = (struct ARP_Header *)&buffer[ARP_OFFSET];
352:stack.c ****
353:stack.c **** dest_ip_store = dest_ip;
354:stack.c ****
355:stack.c **** //Nutzlast 0x0800=IP Datagramm;0x0806 = ARP
356:stack.c **** ethernet->EnetPacketType = 0x0608;
357:stack.c ****
358:stack.c **** new_eth_header (buffer,dest_ip);
359:stack.c ****
360:stack.c **** //Meine IP Adresse wird in ARP Source IP Adresse geschrieben
361:stack.c **** arp->ARP_SIPAddr = *((unsigned long *)&myip[0]);
362:stack.c ****
363:stack.c **** //Ziel IP wird in Dest IP geschrieben
364:stack.c **** arp->ARP_TIPAddr = dest_ip;
365:stack.c ****
366:stack.c **** for(unsigned char count = 0; count < 6; count++)
367:stack.c **** {
368:stack.c **** arp->ARP_SHAddr[count] = mymac[count];
369:stack.c **** arp->ARP_THAddr[count] = 0x00;
370:stack.c **** }
371:stack.c ****
372:stack.c **** arp->ARP_HWType = 0x0100;
373:stack.c **** arp->ARP_PRType = 0x0008;
374:stack.c **** arp->ARP_HWLen = 0x06;
375:stack.c **** arp->ARP_PRLen = 0x04;
376:stack.c **** arp->ARP_Op = 0x0100;
377:stack.c ****
378:stack.c **** //Nun ist das ARP-Packet fertig zum Senden !!!
379:stack.c **** //Sendet das erzeugte ARP Packet
380:stack.c **** ETH_PACKET_SEND(ARP_REQUEST_LEN, buffer);
381:stack.c ****
382:stack.c **** for(unsigned char count = 0;count<20;count++)
383:stack.c **** {
384:stack.c **** unsigned char index_tmp = arp_entry_search(dest_ip_store);
385:stack.c **** index = arp_entry_search(dest_ip);
386:stack.c **** if (index < MAX_ARP_ENTRY || index_tmp < MAX_ARP_ENTRY)
387:stack.c **** {
388:stack.c **** // DEBUG("ARP EINTRAG GEFUNDEN!\r\n");
389:stack.c **** if (index_tmp < MAX_ARP_ENTRY) return(1);//OK
390:stack.c **** arp_entry[index].arp_t_ip = dest_ip_store;