udp.fs 988 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. ( UDP header and wrapup JCB 13:22 08/24/10)
  2. : udp-header ( dst-port src-port dst-ip src-ip *ethaddr -- )
  3. h# 11 ip-header
  4. mac-pkt-, \ src port
  5. mac-pkt-, \ dst port
  6. d# 2 mac-pkt-,0 \ length and checksum
  7. ;
  8. variable packetbase
  9. : packet packetbase @ + ;
  10. : udp-checksum ( addr -- u ) \ compute UDP checksum on packet
  11. packetbase !
  12. ETH.IP.UDP.LENGTH packet @ d# 1 and if
  13. ETH.IP.UDP ETH.IP.UDP.LENGTH packet @ + packet
  14. dup @ h# ff00 and swap !
  15. then
  16. ETH.IP.UDP packet
  17. ETH.IP.UDP.LENGTH packet @ 1+ 2/
  18. mac-checksum invert
  19. d# 4 ETH.IP.SRCIP packet mac@n
  20. +1c +1c +1c +1c
  21. IP_PROTO_UDP +1c
  22. ETH.IP.UDP.LENGTH packet @ +1c
  23. invert
  24. ;
  25. : udp-checksum? true ;
  26. \ incoming udp-checksum 0= ;
  27. : udp-wrapup
  28. mac-pkt-complete dup
  29. ip-wrapup
  30. OFFSET_UDP -
  31. OFFSET_UDP_LENGTH packetout-off mac!
  32. \ outgoing udp-checksum ETH.IP.UDP.CHECKSUM packetout-off !
  33. ;