Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / obp / obp / pkg / dhcp / udp.fth
CommitLineData
920dae64
AT
1\ ========== Copyright Header Begin ==========================================
2\
3\ Hypervisor Software File: udp.fth
4\
5\ Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
6\
7\ - Do no alter or remove copyright notices
8\
9\ - Redistribution and use of this software in source and binary forms, with
10\ or without modification, are permitted provided that the following
11\ conditions are met:
12\
13\ - Redistribution of source code must retain the above copyright notice,
14\ this list of conditions and the following disclaimer.
15\
16\ - Redistribution in binary form must reproduce the above copyright notice,
17\ this list of conditions and the following disclaimer in the
18\ documentation and/or other materials provided with the distribution.
19\
20\ Neither the name of Sun Microsystems, Inc. or the names of contributors
21\ may be used to endorse or promote products derived from this software
22\ without specific prior written permission.
23\
24\ This software is provided "AS IS," without a warranty of any kind.
25\ ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
26\ INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
27\ PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
28\ MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
29\ ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
30\ DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN
31\ OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
32\ FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
33\ DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
34\ ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
35\ SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
36\
37\ You acknowledge that this software is not designed, licensed or
38\ intended for use in the design, construction, operation or maintenance of
39\ any nuclear facility.
40\
41\ ========== Copyright Header End ============================================
42id: @(#)udp.fth 2.11 02/08/22
43purpose: Simple User Datagram Protocol (UDP) implementation
44copyright: Copyright 1990-2002 Sun Microsystems, Inc. All Rights Reserved
45copyright: Use is subject to license terms.
46
47decimal
48
49headerless
5017 constant UDP
51
52instance variable my-udp-port
53instance variable his-udp-port
54
55struct ( udp-header )
56 2 field >udp-source-port
57 2 field >udp-dest-port
58 2 field >udp-length
59 2 field >udp-checksum
60constant /udp-header
61
62: udp-source-port ( -- adr ) active-struct@ >udp-source-port ;
63: udp-dest-port ( -- adr ) active-struct@ >udp-dest-port ;
64: udp-length ( -- adr ) active-struct@ >udp-length ;
65: udp-checksum ( -- adr ) active-struct@ >udp-checksum ;
66
67struct ( udp-pseudo-hdr )
68 4 field udp-src-addr
69 4 field udp-dst-addr
70 2 field udp-protocol-id
71 2 field udp-len-copy
72constant /udp-pseudo-hdr
73
740 instance value packet-to-send \ buffer used by TFTP & DHCP to format pkts
750 instance value udp-pseudo-hdr
76
77\ fill-udp-pseudo-hdr assumes active-struct points to the appropriate
78\ udp packet.
79: fill-udp-pseudo-hdr ( -- )
80 /ip-header negate active-struct +!
81 udp-pseudo-hdr ( udp-pseudo-addr )
82 ip-source-addr over udp-src-addr 4 cmove ( udp-pseudo-addr )
83 ip-dest-addr over udp-dst-addr 4 cmove ( udp-pseudo-addr )
84 UDP over udp-protocol-id be-w! ( udp-pseudo-addr )
85 /ip-header active-struct +! ( udp-pseudo-addr )
86 udp-length be-w@ swap udp-len-copy be-w! ( )
87;
88
89\ udp-checksum assumes active-struct points to the appropriate udp packet.
90: calc-udp-checksum ( -- checksum )
91 fill-udp-pseudo-hdr
92 0 udp-checksum be-w!
93 0 udp-pseudo-hdr /udp-pseudo-hdr (oc-checksum) ( chksum' )
94 active-struct @ udp-length be-w@ oc-checksum ( chksum )
95;
96
97: bad-udp-checksum? ( -- bad? )
98\ udp-checksum? 0= if false exit then
99 udp-checksum be-w@ dup if ( checksum )
100 calc-udp-checksum <> ( bad? )
101 then ( bad? )
102;
103
104: prepare-udp-packet ( data-addr data-len -- total-len )
105 dup /udp-header + ( data-addr data-len udp-len )
106 dup /ip-header + ( data-addr data-len udp-len ip-len )
107 dup /ether-header + >r ( rs: total-len )
108 *buffer @ active-struct !
109 my-en-addr en-source-addr 6 cmove
110 his-en-addr en-dest-addr 6 cmove
111 IP_TYPE en-type be-w!
112
113 /ether-header active-struct +!
114 h# 45 ip-version c! ( 45 is ip version 4, length 5 longwords )
115 0 ip-service c!
116 ( ... ip-len ) ip-length be-w!
117 ip-sequence @ ip-id be-w! 1 ip-sequence +!
118 0 ip-fragment be-w!
119 ttl @ ip-ttl c!
120 UDP ip-protocol c!
121 0 ip-checksum be-w!
122 my-ip-addr ip-source-addr 4 cmove
123 his-ip-addr ip-dest-addr 4 cmove
124 0 active-struct @ /ip-header oc-checksum ip-checksum be-w!
125
126 /ip-header active-struct +!
127 my-udp-port @ udp-source-port be-w!
128 his-udp-port @ udp-dest-port be-w!
129 ( ... udp-len ) udp-length be-w!
130\ 0 udp-checksum be-w!
131
132 /udp-header active-struct @ + ( data-addr data-len buffer-addr )
133 swap cmove
134 udp-checksum? if calc-udp-checksum else 0 then ( udp-chksum )
135 udp-checksum be-w!
136
137 r> ( total-len )
138;
139
140: receive-udp-packet ( -- [ udp-packet-adr udp-len ] flag )
141 \ flag non-zero if packet received. other entries only if good packet
142 begin
143 receive-ip-packet 0= if false exit then ( ip-adr ip-len )
144
145 swap active-struct !
146 ip-protocol c@ UDP <> dup 0= if \ Filter out non-UDP packets ..
147 drop /ip-header active-struct +!
148 bad-udp-checksum? \ .. and bad UDP packets
149 then
150 while
151 drop
152 repeat ( ip-len )
153 active-struct @ swap /ip-header - true
154;
155headers