|
0
|
1 |
.include "DS.S"
|
|
|
2 |
.text
|
|
|
3 |
#-----------------------------------------------
|
|
|
4 |
# C O N S T R U C T O R
|
|
|
5 |
#-----------------------------------------------
|
|
|
6 |
ARGS
|
|
|
7 |
DS thisP # -->Data inst
|
|
|
8 |
DS callerDeP # -->originator's Debug
|
|
|
9 |
PROLOC
|
|
|
10 |
DL deP # -->Debug
|
|
|
11 |
EPILOC
|
|
|
12 |
#-----------------------------------------------
|
|
|
13 |
.global Data
|
|
|
14 |
Data:
|
|
|
15 |
PROLOG
|
|
|
16 |
mov thisP(bp), b # -->Data inst
|
|
|
17 |
lea Da.debug(b), a # -->Debug
|
|
|
18 |
mov a, deP(bp) # init local -->Debug
|
|
|
19 |
# construct debug ID from originator debID
|
|
|
20 |
mov callerDeP(bp), a # -->caller's Debug
|
|
|
21 |
lea D.id(a), a
|
|
|
22 |
push a # -->caller's DebugId
|
|
|
23 |
DEBID "%s DATA", 1
|
|
|
24 |
# calculate container size
|
|
|
25 |
mov C.csP,a
|
|
|
26 |
push C.txtP(a)
|
|
|
27 |
call strlen
|
|
|
28 |
addl $HeaderL, a
|
|
|
29 |
addl $PayloadL, a
|
|
|
30 |
inc a
|
|
|
31 |
mov thisP(bp), b # -->Data inst
|
|
|
32 |
mov a, Da.datalen(b) # save container length
|
|
|
33 |
# allocate container
|
|
|
34 |
push a
|
|
|
35 |
call malloc
|
|
|
36 |
test a, a
|
|
|
37 |
jnz 0f
|
|
|
38 |
SYSERR "malloc"
|
|
|
39 |
0:
|
|
|
40 |
mov thisP(bp), b # -->Data inst
|
|
|
41 |
mov a, Da.contP(b) # save -->container
|
|
|
42 |
# initialize container
|
|
|
43 |
mov Da.contP(b), c # -->Container
|
|
|
44 |
lea Co.hdr(c), a # -->Header
|
|
|
45 |
movl $0, H.ttl(a)
|
|
|
46 |
movl $0, H.ts(a)
|
|
|
47 |
push $0f
|
|
|
48 |
lea Co.payl(c), a # -->Payload
|
|
|
49 |
lea Pa.text(a), a
|
|
|
50 |
push a
|
|
|
51 |
call strcpy # init Payload.text
|
|
|
52 |
LOG 5, "Data instance established"
|
|
|
53 |
EPILOG
|
|
|
54 |
0: .asciz "EMPTY"
|
|
|
55 |
#-----------------------------------------------
|
|
|
56 |
# L O A D P A Y L O A D
|
|
|
57 |
#-----------------------------------------------
|
|
|
58 |
# returns -->data container
|
|
|
59 |
M_ARGS
|
|
|
60 |
DS ttl
|
|
|
61 |
DS loadP # -->text to be sent
|
|
|
62 |
M_LOCAL
|
|
|
63 |
DL t, timevalL # timestamp buf
|
|
|
64 |
M_PROLOG Da, load
|
|
|
65 |
LOG 5, "loading..."
|
|
|
66 |
mov Da.contP(b), c # -->Container
|
|
|
67 |
# fill header
|
|
|
68 |
lea Co.hdr(c), d # -->containner header
|
|
|
69 |
mov ttl(bp), a
|
|
|
70 |
mov a, H.ttl(d) # init TTL in header
|
|
|
71 |
# get timestamp
|
|
|
72 |
call D.getTs # get timestamp
|
|
|
73 |
mov a, H.ts(d) # timestamp to header
|
|
|
74 |
# init payload
|
|
|
75 |
push loadP(bp) # -->loaded text
|
|
|
76 |
lea Co.payl(c), a # -->Payload
|
|
|
77 |
lea Pa.text(a), a
|
|
|
78 |
push a
|
|
|
79 |
call strcpy # copy text to payload
|
|
|
80 |
# return -->Data
|
|
|
81 |
push Da.datalen(b)
|
|
|
82 |
LOG 5, "payload loaded to container, len=%u"
|
|
|
83 |
mov Da.contP(b), a # return -->container
|
|
|
84 |
EPILOG_R
|
|
|
85 |
#-----------------------------------------------
|
|
|
86 |
# G E T D A T A C O N T A I N E R L E N G T H
|
|
|
87 |
#-----------------------------------------------
|
|
|
88 |
# returns length of container filled with data
|
|
|
89 |
M_ARGS
|
|
|
90 |
M_LOCAL
|
|
|
91 |
M_PROLOG Da, getDataLen
|
|
|
92 |
mov Da.datalen(b), a
|
|
|
93 |
EPILOG_R
|
|
|
94 |
#-----------------------------------------------
|
|
|
95 |
# G E T D A T A C O N T A I N E R P O I N T E R
|
|
|
96 |
#-----------------------------------------------
|
|
|
97 |
M_ARGS
|
|
|
98 |
M_LOCAL
|
|
|
99 |
M_PROLOG Da, getContP
|
|
|
100 |
mov Da.contP(b), a
|
|
|
101 |
EPILOG_R
|
|
|
102 |
#-----------------------------------------------
|
|
|
103 |
# C H E C K P A Y L O A D
|
|
|
104 |
#-----------------------------------------------
|
|
|
105 |
# returns boolean: original text == received text
|
|
|
106 |
M_ARGS
|
|
|
107 |
M_LOCAL
|
|
|
108 |
M_PROLOG Da, chk
|
|
|
109 |
# get original payload
|
|
|
110 |
mov C.csP, c # -->CS
|
|
|
111 |
pushl C.txtP(c) # -->orig text
|
|
|
112 |
# get payload from container
|
|
|
113 |
mov Da.contP(b), a # -->Container
|
|
|
114 |
lea Co.payl(a), a # -->Payload
|
|
|
115 |
lea Pa.text(a), a # -->payload text
|
|
|
116 |
push a
|
|
|
117 |
call strcmp
|
|
|
118 |
xor c, c
|
|
|
119 |
test a, a # 0 = texts are equal
|
|
|
120 |
setz %cl
|
|
|
121 |
mov c, a
|
|
|
122 |
EPILOG_R
|
|
|
123 |
#-----------------------------------------------
|
|
|
124 |
# U N L O A D P A Y L O A D
|
|
|
125 |
#-----------------------------------------------
|
|
|
126 |
# returns -->payload text
|
|
|
127 |
M_ARGS
|
|
|
128 |
M_LOCAL
|
|
|
129 |
M_PROLOG Da, unl
|
|
|
130 |
mov thisP(bp), b # -->Data inst
|
|
|
131 |
lea Da.debug(b), a
|
|
|
132 |
mov a, deP(bp)
|
|
|
133 |
# get payload from container
|
|
|
134 |
mov Da.contP(b), a # -->Container
|
|
|
135 |
lea Co.payl(a), a # -->Payload
|
|
|
136 |
lea Pa.text(a), a # -->Payload.text
|
|
|
137 |
EPILOG_R
|
|
|
138 |
#-----------------------------------------------
|
|
|
139 |
# D E C R E M E N T T T L
|
|
|
140 |
#-----------------------------------------------
|
|
|
141 |
# decrement TTL in data container header, save it and return it
|
|
|
142 |
M_ARGS
|
|
|
143 |
M_LOCAL
|
|
|
144 |
M_PROLOG Da, dttl
|
|
|
145 |
mov Da.contP(b), a # -->Container
|
|
|
146 |
lea Co.hdr(a), a # -->container header
|
|
|
147 |
decl H.ttl(a) # TTL--
|
|
|
148 |
mov H.ttl(a), a # return TTL
|
|
|
149 |
EPILOG_R
|
|
|
150 |
#-----------------------------------------------
|
|
|
151 |
# G E T T T L
|
|
|
152 |
#-----------------------------------------------
|
|
|
153 |
M_ARGS
|
|
|
154 |
M_LOCAL
|
|
|
155 |
M_PROLOG Da, ttl
|
|
|
156 |
mov Da.contP(b), a # -->Container
|
|
|
157 |
lea Co.hdr(a), a # -->container header
|
|
|
158 |
mov H.ttl(a), a # return TTL
|
|
|
159 |
EPILOG_R
|
|
|
160 |
#-----------------------------------------------
|
|
|
161 |
# P U T l I S T E N P O R T T O H E A D E R
|
|
|
162 |
#-----------------------------------------------
|
|
|
163 |
ARGS
|
|
|
164 |
DS thisP # -->Data inst
|
|
|
165 |
DS port
|
|
|
166 |
# returns port value
|
|
|
167 |
PROLOC
|
|
|
168 |
DL deP # -->Debug
|
|
|
169 |
EPILOC
|
|
|
170 |
#-----------------------------------------------
|
|
|
171 |
.global Da.putPort
|
|
|
172 |
Da.putPort:
|
|
|
173 |
PROLOG
|
|
|
174 |
mov thisP(bp), b # -->Data inst
|
|
|
175 |
lea Da.debug(b), a
|
|
|
176 |
mov a, deP(bp) # -->Debug
|
|
|
177 |
|
|
|
178 |
mov Da.contP(b), c # -->Container
|
|
|
179 |
lea Co.hdr(a), c # -->container header
|
|
|
180 |
mov port(bp), a
|
|
|
181 |
mov a, H.lport(c)
|
|
|
182 |
EPILOG_R
|
|
|
183 |
#-----------------------------------------------
|
|
|
184 |
# G E T l I S T E N P O R T F R O M H E A D E R
|
|
|
185 |
#-----------------------------------------------
|
|
|
186 |
M_ARGS
|
|
|
187 |
M_LOCAL
|
|
|
188 |
M_PROLOG Da, getPort
|
|
|
189 |
mov Da.contP(b), c # -->Container
|
|
|
190 |
lea Co.hdr(c), c # -->container header
|
|
|
191 |
mov H.lport(c), a
|
|
|
192 |
EPILOG_R
|
|
|
193 |
#-----------------------------------------------
|
|
|
194 |
# G E T T I M E S T A M P F R O M H E A D E R
|
|
|
195 |
#-----------------------------------------------
|
|
|
196 |
M_ARGS
|
|
|
197 |
M_LOCAL
|
|
|
198 |
M_PROLOG Da, getTs
|
|
|
199 |
mov Da.contP(b), a # -->Container
|
|
|
200 |
lea Co.hdr(a), a # -->container header
|
|
|
201 |
mov H.ts(a), a # return timestamp
|
|
|
202 |
EPILOG_R
|
|
|
203 |
#-----------------------------------------------
|
|
|
204 |
# S A B O T A G E T E X T
|
|
|
205 |
#-----------------------------------------------
|
|
|
206 |
ARGS
|
|
|
207 |
DS thisP # -->Data inst
|
|
|
208 |
PROLOC
|
|
|
209 |
DL deP # -->Debug
|
|
|
210 |
EPILOC
|
|
|
211 |
#-----------------------------------------------
|
|
|
212 |
.global Da.sabotage
|
|
|
213 |
Da.sabotage:
|
|
|
214 |
PROLOG
|
|
|
215 |
lea Da.contP(b), a # -->Container
|
|
|
216 |
lea Co.payl(a), a # -->Payload
|
|
|
217 |
lea Pa.text(a), a # -->Payload.text
|
|
|
218 |
movl $'?', (a)
|
|
|
219 |
EPILOG
|
|
|
220 |
#-----------------------------------------------
|
|
|
221 |
# C R E A T E D I G E S T F R O M T E X T
|
|
|
222 |
#-----------------------------------------------
|
|
|
223 |
# returns -->24 chars payload text digest
|
|
|
224 |
M_ARGS
|
|
|
225 |
DS digestP # -->text digest buffer
|
|
|
226 |
M_LOCAL
|
|
|
227 |
DL textP
|
|
|
228 |
M_PROLOG Da, digest24
|
|
|
229 |
# check length of payload text
|
|
|
230 |
mov Da.contP(b), a # -->Container
|
|
|
231 |
lea Co.payl(a), a # -->Payload
|
|
|
232 |
lea Pa.text(a), a # -->Payload.text
|
|
|
233 |
mov a, textP(bp)
|
|
|
234 |
push a
|
|
|
235 |
call strlen
|
|
|
236 |
cmp $24, a # payload text length < 24 ?
|
|
|
237 |
jl Da.digest24Direct # yes, direct copy
|
|
|
238 |
# create digest from longer text
|
|
|
239 |
push $8
|
|
|
240 |
push textP(bp)
|
|
|
241 |
push digestP(bp)
|
|
|
242 |
call strncpy # copy beg. of text
|
|
|
243 |
push $0f
|
|
|
244 |
mov digestP(bp), a # -->digest
|
|
|
245 |
add $8, a
|
|
|
246 |
push a # -->digest+8
|
|
|
247 |
call strcpy
|
|
|
248 |
jmp 1f
|
|
|
249 |
0: .asciz "-------"
|
|
|
250 |
1: push textP(bp)
|
|
|
251 |
call strlen
|
|
|
252 |
mov textP(bp), c
|
|
|
253 |
add a, c
|
|
|
254 |
lea -8(c), c # -->end of text - 8
|
|
|
255 |
push c
|
|
|
256 |
mov digestP(bp), a
|
|
|
257 |
lea 15(a), a # -->digest+15
|
|
|
258 |
push a
|
|
|
259 |
call strcpy
|
|
|
260 |
jmp Da.digest24Ex
|
|
|
261 |
# directly copy shorter text
|
|
|
262 |
Da.digest24Direct:
|
|
|
263 |
push textP(bp)
|
|
|
264 |
push digestP(bp)
|
|
|
265 |
call strcpy
|
|
|
266 |
Da.digest24Ex:
|
|
|
267 |
mov digestP(bp), a # -->digest
|
|
|
268 |
EPILOG_R
|
|
|
269 |
#-----------------------------------------------
|
|
|
270 |
.end
|