38 #define BUF ((uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
39 #define IP_PROTO_TCP 6
40 #define IP_PROTO_UDP 17
43 #pragma optimize(push, off)
56 asm(
"sta _uip_acc32+3");
61 asm(
"sta _uip_acc32+2");
65 asm(
"sta _uip_acc32+1");
69 asm(
"sta _uip_acc32+0");
73 static uint16_t chksum_ptr, chksum_len, chksum_tmp;
74 static uint8_t chksum_protocol;
75 static uint16_t chksum(
void);
77 #pragma optimize(push, off)
84 asm(
"lda _chksum_ptr");
86 asm(
"lda _chksum_ptr+1");
89 asm(
"lda _chksum_len+1");
90 asm(
"beq chksumlast");
95 asm(
"chksumloop_256:");
104 asm(
"bne chksumloop_256");
106 asm(
"dec _chksum_len+1");
107 asm(
"bne chksumloop_256");
109 asm(
"chksum_endloop_256:");
116 asm(
"bcs chksum_endloop_256");
119 asm(
"lda _chksum_len");
121 asm(
"bcc chksum_noodd");
122 asm(
"ldy _chksum_len");
133 asm(
"dec _chksum_len");
135 asm(
"chksum_noodd:");
138 asm(
"ldy _chksum_len");
139 asm(
"chksum_loop1:");
141 asm(
"beq chksum_loop1_end");
154 asm(
"jmp chksum_loop1");
155 asm(
"chksum_loop1_end:");
158 asm(
"chksum_endloop:");
165 asm(
"bcs chksum_endloop");
172 #pragma optimize(pop)
201 chksum_ptr = (uint16_t)buf;
209 chksum_len = UIP_IPH_LEN;
213 #pragma optimize(push, off)
215 transport_chksum(uint8_t protocol)
217 chksum_protocol = protocol;
218 chksum_ptr = (uint16_t)&uip_buf[
UIP_LLH_LEN + UIP_IPH_LEN];
219 chksum_len = UIP_TCPH_LEN;
220 chksum_tmp = chksum();
225 asm(
"sbc #%b", UIP_IPTCPH_LEN);
226 asm(
"sta _chksum_len");
229 asm(
"sta _chksum_len+1");
231 asm(
"jsr %v", chksum);
234 asm(
"adc _chksum_tmp");
235 asm(
"sta _chksum_tmp");
237 asm(
"adc _chksum_tmp+1");
238 asm(
"sta _chksum_tmp+1");
245 asm(
"tcpchksum_loop1:");
246 asm(
"lda _chksum_tmp");
248 asm(
"sta _chksum_tmp");
249 asm(
"lda _chksum_tmp+1");
251 asm(
"sta _chksum_tmp+1");
252 asm(
"bcs tcpchksum_loop1");
256 asm(
"sbc #%b", UIP_IPH_LEN);
257 asm(
"sta _chksum_len");
260 asm(
"sta _chksum_len+1");
265 asm(
"tcpchksum_loop2:");
268 asm(
"adc _chksum_tmp");
269 asm(
"sta _chksum_tmp");
272 asm(
"adc _chksum_tmp+1");
273 asm(
"sta _chksum_tmp+1");
277 asm(
"bne tcpchksum_loop2");
281 asm(
"lda _chksum_tmp");
283 asm(
"sta _chksum_tmp");
284 asm(
"lda _chksum_tmp+1");
285 asm(
"adc %v", chksum_protocol);
286 asm(
"sta _chksum_tmp+1");
288 asm(
"lda _chksum_tmp");
289 asm(
"adc _chksum_len+1");
290 asm(
"sta _chksum_tmp");
291 asm(
"lda _chksum_tmp+1");
292 asm(
"adc _chksum_len");
293 asm(
"sta _chksum_tmp+1");
295 asm(
"tcpchksum_loop3:");
296 asm(
"lda _chksum_tmp");
298 asm(
"sta _chksum_tmp");
299 asm(
"lda _chksum_tmp+1");
301 asm(
"sta _chksum_tmp+1");
302 asm(
"bcs tcpchksum_loop3");
306 #pragma optimize(pop)
312 return transport_chksum(IP_PROTO_TCP);
314 chksum_ptr = (uint16_t)&uip_buf[
UIP_LLH_LEN + UIP_IPH_LEN];
315 chksum_len = UIP_TCPH_LEN;
316 chksum_tmp = chksum();
321 asm(
"sbc #%b", UIP_IPTCPH_LEN);
322 asm(
"sta _chksum_len");
325 asm(
"sta _chksum_len+1");
327 asm(
"jsr %v", chksum);
330 asm(
"adc _chksum_tmp");
331 asm(
"sta _chksum_tmp");
333 asm(
"adc _chksum_tmp+1");
334 asm(
"sta _chksum_tmp+1");
341 asm(
"tcpchksum_loop1:");
342 asm(
"lda _chksum_tmp");
344 asm(
"sta _chksum_tmp");
345 asm(
"lda _chksum_tmp+1");
347 asm(
"sta _chksum_tmp+1");
348 asm(
"bcs tcpchksum_loop1");
352 asm(
"sbc #%b", UIP_IPH_LEN);
353 asm(
"sta _chksum_len");
356 asm(
"sta _chksum_len+1");
361 asm(
"tcpchksum_loop2:");
364 asm(
"adc _chksum_tmp");
365 asm(
"sta _chksum_tmp");
368 asm(
"adc _chksum_tmp+1");
369 asm(
"sta _chksum_tmp+1");
373 asm(
"bne tcpchksum_loop2");
377 asm(
"lda _chksum_tmp");
379 asm(
"sta _chksum_tmp");
380 asm(
"lda _chksum_tmp+1");
382 asm(
"sta _chksum_tmp+1");
384 asm(
"lda _chksum_tmp");
385 asm(
"adc _chksum_len+1");
386 asm(
"sta _chksum_tmp");
387 asm(
"lda _chksum_tmp+1");
388 asm(
"adc _chksum_len");
389 asm(
"sta _chksum_tmp+1");
391 asm(
"tcpchksum_loop3:");
392 asm(
"lda _chksum_tmp");
394 asm(
"sta _chksum_tmp");
395 asm(
"lda _chksum_tmp+1");
397 asm(
"sta _chksum_tmp+1");
398 asm(
"bcs tcpchksum_loop3");
405 #if UIP_UDP_CHECKSUMS
409 return transport_chksum(IP_PROTO_UDP);
413 chksum_tmp = chksum();
419 asm(
"sta _chksum_len");
422 asm(
"sta _chksum_len+1");
424 asm(
"jsr %v", chksum);
427 asm(
"adc _chksum_tmp");
428 asm(
"sta _chksum_tmp");
430 asm(
"adc _chksum_tmp+1");
431 asm(
"sta _chksum_tmp+1");
438 asm(
"tcpchksum_loop1:");
439 asm(
"lda _chksum_tmp");
441 asm(
"sta _chksum_tmp");
442 asm(
"lda _chksum_tmp+1");
444 asm(
"sta _chksum_tmp+1");
445 asm(
"bcs tcpchksum_loop1");
450 asm(
"sta _chksum_len");
453 asm(
"sta _chksum_len+1");
458 asm(
"tcpchksum_loop2:");
461 asm(
"adc _chksum_tmp");
462 asm(
"sta _chksum_tmp");
465 asm(
"adc _chksum_tmp+1");
466 asm(
"sta _chksum_tmp+1");
470 asm(
"bne tcpchksum_loop2");
474 asm(
"lda _chksum_tmp");
476 asm(
"sta _chksum_tmp");
477 asm(
"lda _chksum_tmp+1");
479 asm(
"sta _chksum_tmp+1");
481 asm(
"lda _chksum_tmp");
482 asm(
"adc _chksum_len+1");
483 asm(
"sta _chksum_tmp");
484 asm(
"lda _chksum_tmp+1");
485 asm(
"adc _chksum_len");
486 asm(
"sta _chksum_tmp+1");
488 asm(
"tcpchksum_loop3:");
489 asm(
"lda _chksum_tmp");
491 asm(
"sta _chksum_tmp");
492 asm(
"lda _chksum_tmp+1");
494 asm(
"sta _chksum_tmp+1");
495 asm(
"bcs tcpchksum_loop3");
uint16_t uip_udpchksum(void)
Calculate the UDP checksum of the packet in uip_buf and uip_appdata.
uint16_t uip_ipchksum(void)
Calculate the IP header checksum of the packet header in uip_buf.
Header file for the uIP TCP/IP stack.
uint16_t uip_chksum(uint16_t *buf, uint16_t len)
Calculate the Internet checksum over a buffer.
uint16_t uip_tcpchksum(void)
Calculate the TCP checksum of the packet in uip_buf and uip_appdata.
#define UIP_LLH_LEN
The link level header length.
void uip_add32(uint8_t *op32, uint16_t op16)
Carry out a 32-bit addition.
Declarations of architecture specific functions.
uip_appdata
Pointer to the application data in the packet buffer.