42 lines
988 B
Forth
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 !
|
|
;
|
|
|