42 lines
988 B
Forth

( UDP header and wrapup JCB 13:22 08/24/10)
: udp-header ( dst-port src-port dst-ip src-ip *ethaddr -- )
h# 11 ip-header
mac-pkt-, \ src port
mac-pkt-, \ dst port
d# 2 mac-pkt-,0 \ length and checksum
;
variable packetbase
: packet packetbase @ + ;
: udp-checksum ( addr -- u ) \ compute UDP checksum on packet
packetbase !
ETH.IP.UDP.LENGTH packet @ d# 1 and if
ETH.IP.UDP ETH.IP.UDP.LENGTH packet @ + packet
dup @ h# ff00 and swap !
then
ETH.IP.UDP packet
ETH.IP.UDP.LENGTH packet @ 1+ 2/
mac-checksum invert
d# 4 ETH.IP.SRCIP packet mac@n
+1c +1c +1c +1c
IP_PROTO_UDP +1c
ETH.IP.UDP.LENGTH packet @ +1c
invert
;
: udp-checksum? true ;
\ incoming udp-checksum 0= ;
: udp-wrapup
mac-pkt-complete dup
ip-wrapup
OFFSET_UDP -
OFFSET_UDP_LENGTH packetout-off mac!
\ outgoing udp-checksum ETH.IP.UDP.CHECKSUM packetout-off !
;