⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uip_arp.lis

📁 uIP是免费的TCP/IP协议栈,我们将它移植到我们的AVR以太网开发板中
💻 LIS
📖 第 1 页 / 共 4 页
字号:
 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 + -