📄 uip_arp.lis
字号:
00EC 3320 tst R3
00EE 09F4 brne X5
00F0 28C0 xjmp L24
00F2 X5:
00F2 X1:
00F2 F501 movw R30,R10
00F4 2280 ldd R2,z+2
00F6 3380 ldd R3,z+3
00F8 2220 tst R2
00FA 11F4 brne X2
00FC 3320 tst R3
00FE 09F1 breq L24
0100 X2:
0100 .dbline 172
0100 ; tabptr->ipaddr[1] != 0) {
0100 .dbline 176
0100 ;
0100 ; /* Check if the source IP address of the incoming packet matches
0100 ; the IP address in this ARP table entry. */
0100 ; if(ipaddr[0] == tabptr->ipaddr[0] &&
0100 F501 movw R30,R10
0102 2080 ldd R2,z+0
0104 3180 ldd R3,z+1
0106 F701 movw R30,R14
0108 4080 ldd R4,z+0
010A 5180 ldd R5,z+1
010C 4214 cp R4,R2
010E 5304 cpc R5,R3
0110 C1F4 brne L26
0112 F501 movw R30,R10
0114 2280 ldd R2,z+2
0116 3380 ldd R3,z+3
0118 F701 movw R30,R14
011A 4280 ldd R4,z+2
011C 5380 ldd R5,z+3
011E 4214 cp R4,R2
0120 5304 cpc R5,R3
0122 79F4 brne L26
0124 .dbline 177
0124 ; ipaddr[1] == tabptr->ipaddr[1]) {
0124 .dbline 180
0124 ;
0124 ; /* An old entry found, update this and return. */
0124 ; memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6);
0124 86E0 ldi R24,6
0126 90E0 ldi R25,0
0128 9983 std y+1,R25
012A 8883 std y+0,R24
012C 9601 movw R18,R12
012E 8501 movw R16,R10
0130 0C5F subi R16,252 ; offset = 4
0132 1F4F sbci R17,255
0134 0E940000 xcall _memcpy
0138 .dbline 181
0138 ; tabptr->time = arptime;
0138 20900100 lds R2,_arptime
013C F501 movw R30,R10
013E 2286 std z+10,R2
0140 .dbline 183
0140 ;
0140 ; return;
0140 7BC0 xjmp L19
0142 L26:
0142 .dbline 185
0142 ; }
0142 ; }
0142 L24:
0142 .dbline 186
0142 L21:
0142 .dbline 167
0142 80910300 lds R24,_i
0146 8F5F subi R24,255 ; addi 1
0148 80930300 sts _i,R24
014C L23:
014C .dbline 167
014C 80910300 lds R24,_i
0150 8830 cpi R24,8
0152 08F4 brsh X6
0154 BDCF xjmp L20
0156 X6:
0156 .dbline 192
0156 2224 clr R2
0158 20920300 sts _i,R2
015C 1DC0 xjmp L31
015E L28:
015E .dbline 192
015E ; }
015E ;
015E ; /* If we get here, no existing ARP table entry was found, so we
015E ; create one. */
015E ;
015E ; /* First, we try to find an unused entry in the ARP table. */
015E ; for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
015E .dbline 193
015E ; tabptr = &arp_table[i];
015E 20900300 lds R2,_i
0162 8BE0 ldi R24,11
0164 829D mul R24,R2
0166 5001 movw R10,R0
0168 80E0 ldi R24,<_arp_table
016A 90E0 ldi R25,>_arp_table
016C A80E add R10,R24
016E B91E adc R11,R25
0170 .dbline 194
0170 ; if(tabptr->ipaddr[0] == 0 &&
0170 F501 movw R30,R10
0172 2080 ldd R2,z+0
0174 3180 ldd R3,z+1
0176 2220 tst R2
0178 51F4 brne L32
017A 3320 tst R3
017C 41F4 brne L32
017E X3:
017E F501 movw R30,R10
0180 2280 ldd R2,z+2
0182 3380 ldd R3,z+3
0184 2220 tst R2
0186 19F4 brne L32
0188 3320 tst R3
018A 09F4 brne L32
018C X4:
018C .dbline 195
018C ; tabptr->ipaddr[1] == 0) {
018C .dbline 196
018C ; break;
018C 09C0 xjmp L30
018E L32:
018E .dbline 198
018E L29:
018E .dbline 192
018E 80910300 lds R24,_i
0192 8F5F subi R24,255 ; addi 1
0194 80930300 sts _i,R24
0198 L31:
0198 .dbline 192
0198 80910300 lds R24,_i
019C 8830 cpi R24,8
019E F8F2 brlo L28
01A0 L30:
01A0 .dbline 202
01A0 ; }
01A0 ; }
01A0 ;
01A0 ; /* If no unused entry is found, we try to find the oldest entry and
01A0 ; throw it away. */
01A0 ; if(i == UIP_ARPTAB_SIZE) {
01A0 80910300 lds R24,_i
01A4 8830 cpi R24,8
01A6 91F5 brne L34
01A8 .dbline 202
01A8 .dbline 203
01A8 ; tmpage = 0;
01A8 2224 clr R2
01AA 20920000 sts _tmpage,R2
01AE .dbline 204
01AE ; c = 0;
01AE 20920200 sts _c,R2
01B2 .dbline 205
01B2 20920300 sts _i,R2
01B6 22C0 xjmp L39
01B8 L36:
01B8 .dbline 205
01B8 ; for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
01B8 .dbline 206
01B8 ; tabptr = &arp_table[i];
01B8 20900300 lds R2,_i
01BC 8BE0 ldi R24,11
01BE 829D mul R24,R2
01C0 5001 movw R10,R0
01C2 80E0 ldi R24,<_arp_table
01C4 90E0 ldi R25,>_arp_table
01C6 A80E add R10,R24
01C8 B91E adc R11,R25
01CA .dbline 207
01CA ; if(arptime - tabptr->time > tmpage) {
01CA F501 movw R30,R10
01CC 2284 ldd R2,z+10
01CE 30900100 lds R3,_arptime
01D2 3218 sub R3,R2
01D4 20900000 lds R2,_tmpage
01D8 2314 cp R2,R3
01DA 58F4 brsh L40
01DC .dbline 207
01DC .dbline 208
01DC ; tmpage = arptime - tabptr->time;
01DC F501 movw R30,R10
01DE 2284 ldd R2,z+10
01E0 30900100 lds R3,_arptime
01E4 3218 sub R3,R2
01E6 30920000 sts _tmpage,R3
01EA .dbline 209
01EA ; c = i;
01EA 20900300 lds R2,_i
01EE 20920200 sts _c,R2
01F2 .dbline 210
01F2 ; }
01F2 L40:
01F2 .dbline 211
01F2 L37:
01F2 .dbline 205
01F2 80910300 lds R24,_i
01F6 8F5F subi R24,255 ; addi 1
01F8 80930300 sts _i,R24
01FC L39:
01FC .dbline 205
01FC 80910300 lds R24,_i
0200 8830 cpi R24,8
0202 D0F2 brlo L36
0204 .dbline 212
0204 ; }
0204 ; i = c;
0204 20900200 lds R2,_c
0208 20920300 sts _i,R2
020C .dbline 213
020C ; }
020C L34:
020C .dbline 217
020C ;
020C ; /* Now, i is the ARP table entry which we will fill with the new
020C ; information. */
020C ; memcpy(tabptr->ipaddr, ipaddr, 4);
020C 84E0 ldi R24,4
020E 90E0 ldi R25,0
0210 9983 std y+1,R25
0212 8883 std y+0,R24
0214 9701 movw R18,R14
0216 8501 movw R16,R10
0218 0E940000 xcall _memcpy
021C .dbline 218
021C ; memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6);
021C 86E0 ldi R24,6
021E 90E0 ldi R25,0
0220 9983 std y+1,R25
0222 8883 std y+0,R24
0224 9601 movw R18,R12
0226 8501 movw R16,R10
0228 0C5F subi R16,252 ; offset = 4
022A 1F4F sbci R17,255
022C 0E940000 xcall _memcpy
0230 .dbline 219
0230 ; tabptr->time = arptime;
0230 20900100 lds R2,_arptime
0234 F501 movw R30,R10
0236 2286 std z+10,R2
0238 .dbline -2
0238 L19:
0238 2296 adiw R28,2
023A 0E940000 xcall pop_gset5x
023E .dbline 0 ; func end
023E 0895 ret
0240 .dbsym r tabptr 10 pS[arp_entry]
0240 .dbsym r ethaddr 12 pS[uip_eth_addr]
0240 .dbsym r ipaddr 14 ps
0240 .dbend
0240 .dbfunc e uip_arp_ipin _uip_arp_ipin fV
.even
0240 _uip_arp_ipin::
0240 .dbline -1
0240 .dbline 237
0240 ; }
0240 ; /*-----------------------------------------------------------------------------------*/
0240 ; /**
0240 ; * ARP processing for incoming IP packets
0240 ; *
0240 ; * This function should be called by the device driver when an IP
0240 ; * packet has been received. The function will check if the address is
0240 ; * in the ARP cache, and if so the ARP cache entry will be
0240 ; * refreshed. If no ARP cache entry was found, a new one is created.
0240 ; *
0240 ; * This function expects an IP packet with a prepended Ethernet header
0240 ; * in the uip_buf[] buffer, and the length of the packet in the global
0240 ; * variable uip_len.
0240 ; */
0240 ; /*-----------------------------------------------------------------------------------*/
0240 ; void
0240 ; uip_arp_ipin(void)
0240 ; {
0240 .dbline 238
0240 ; uip_len -= sizeof(struct uip_eth_hdr);
0240 80910000 lds R24,_uip_len
0244 90910100 lds R25,_uip_len+1
0248 0E97 sbiw R24,14
024A 90930100 sts _uip_len+1,R25
024E 80930000 sts _uip_len,R24
0252 .dbline 242
0252 ;
0252 ; /* Only insert/update an entry if the source IP address of the
0252 ; incoming IP packet comes from a host on the local network. */
0252 ; if((IPBUF->srcipaddr[0] & uip_arp_netmask[0]) !=
0252 E0E0 ldi R30,<_uip_arp_netmask
0254 F0E0 ldi R31,>_uip_arp_netmask
0256 0590 lpm R0,Z+
0258 1490 lpm R1,Z
025A F001 movw R30,R0
025C A0E0 ldi R26,<_uip_hostaddr
025E B0E0 ldi R27,>_uip_hostaddr
0260 FA93 st -y,R31
0262 EA93 st -y,R30
0264 FD01 movw R30,R26
0266 A591 lpm R26,Z+
0268 B491 lpm R27,Z
026A E991 ld R30,y+
026C F991 ld R31,y+
026E AE23 and R26,R30
0270 BF23 and R27,R31
0272 E0E0 ldi R30,<_uip_arp_netmask
0274 F0E0 ldi R31,>_uip_arp_netmask
0276 0590 lpm R0,Z+
0278 1490 lpm R1,Z
027A F001 movw R30,R0
027C 20901A00 lds R2,_uip_buf+26
0280 30901B00 lds R3,_uip_buf+26+1
0284 2E22 and R2,R30
0286 3F22 and R3,R31
0288 2A16 cp R2,R26
028A 3B06 cpc R3,R27
028C 09F0 breq L43
028E .dbline 243
028E ; (uip_hostaddr[0] & uip_arp_netmask[0])) {
028E .dbline 244
028E ; return;
028E 24C0 xjmp L42
0290 L43:
0290 .dbline 246
0290 ; }
0290 ; if((IPBUF->srcipaddr[1] & uip_arp_netmask[1]) !=
0290 E0E0 ldi R30,<_uip_arp_netmask+2
0292 F0E0 ldi R31,>_uip_arp_netmask+2
0294 0590 lpm R0,Z+
0296 1490 lpm R1,Z
0298 F001 movw R30,R0
029A A0E0 ldi R26,<_uip_hostaddr+2
029C B0E0 ldi R27,>_uip_hostaddr+2
029E FA93 st -y,R31
02A0 EA93 st -y,R30
02A2 FD01 movw R30,R26
02A4 A591 lpm R26,Z+
02A6 B491 lpm R27,Z
02A8 E991 ld R30,y+
02AA F991 ld R31,y+
02AC AE23 and R26,R30
02AE BF23 and R27,R31
02B0 E0E0 ldi R30,<_uip_arp_netmask+2
02B2 F0E0 ldi R31,>_uip_arp_netmask+2
02B4 0590 lpm R0,Z+
02B6 1490 lpm R1,Z
02B8 F001 movw R30,R0
02BA 20901C00 lds R2,_uip_buf+26+2
02BE 30901D00 lds R3,_uip_buf+26+2+1
02C2 2E22 and R2,R30
02C4 3F22 and R3,R31
02C6 2A16 cp R2,R26
02C8 3B06 cpc R3,R27
02CA 09F0 breq L46
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -