Upgrade to GPLv3
[its.git] / system / net.31
1 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
2 ;;;
3 ;;; This program is free software; you can redistribute it and/or
4 ;;; modify it under the terms of the GNU General Public License as
5 ;;; published by the Free Software Foundation; either version 3 of the
6 ;;; License, or (at your option) any later version.
7 ;;;
8 ;;; This program is distributed in the hope that it will be useful,
9 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
10 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 ;;; General Public License for more details.
12 ;;;
13 ;;; You should have received a copy of the GNU General Public License
14 ;;; along with this program; if not, write to the Free Software
15 ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
16
17 ;; For ITS network stuff, the following parameters are defined:
18 ;
19 ; NETP - General network code (net independent, both CHAOS, NCP, TCP, etc)
20 ; INETP - Internet Protocol code.  Must have IMPP or some other device.
21 ; NCPP - Include NCP code (IMPP must be on)
22 ; TCPP - Include TCP code (INETP must be on)
23
24 ; CHAOSP - Include CHAOS net code
25 ; - other CHAOS stuff, all independent of internet stuff.
26
27 NE%UNT==:<1_32.>        ; Escape bit indicating non-Internet address
28 NW$BYT==:301400         ; Byte pointer to network number (approx!)      
29 NE%STR==:<1_33.>        ; Escape bit indicating string-type address
30
31 DEFINE HOSTN A,B,C,D
32 .RADIX 10.,<<<<<A_8>+B>_8>+C>_8>+D,!TERMIN
33
34 ; HOSTS3 full word network # values for certain networks
35
36 NW%CHS==:<NE%UNT+<7_24.>>
37 NW%ARP==:<12_24.>
38 NW%LCS==:<22_24.>
39 NW%AI==:HOSTN 128,52,0,0
40
41 DEFINE GETNET AC,(ADDR)         ; Macro to extract net number
42 IFNB [ADDR] MOVE AC,ADDR
43         TLNN AC,(17_32.)        ; Check for non-Internet type addrs
44          TLNN AC,(1_31.)        ;  Internet address, see if class A net
45           TDZA AC,[77,,-1]      ;   Unternet or class A, zap low 3 octets
46         TLNN AC,(1_30.)         ; Class B or C, see which.
47          TRZA AC,177777         ;  Class B network, zap low 2 octets
48           TRZ AC,377            ;   Class C net, only zap 1 low octet
49 TERMIN
50
51 ;;; Misc defs
52 CALL==<PUSHJ P,>
53 RET==<POPJ P,>
54 CALRET==<JRST>
55 \f
56 IFN IMPP,[      ; ARPAnet IMP interface code
57 IFN KAIMP,[
58 $INSRT IMPOLD
59 ]
60 IFN KSIMP,[
61 $INSRT IMP
62 ]
63 ]
64
65 IFN NCPP,[      ; Old Arpanet NCP protocol code
66 $INSRT NCP
67 ]
68
69 IFN INETP,[     ; Internet Protocol code
70 $INSRT INET
71 ]
72
73 IFN TCPP,[      ; Transmission Control Protocol code
74 $INSRT TCP
75 ]
76
77 IFN CHAOSP,[    ; CHAOSnet interface and protocol code
78 $INSRT CHAOS
79 ]
80 \f
81 SUBTTL  General Network System Calls
82
83 ; .CALL NETRFC - Get a pending Request For Connection for a specific network
84 ;       Arg 1 - SIXBIT name of network
85 ;       Arg 2 - optional network-dependent arg
86 ;               (for CHAOS, points to packet buffer)
87 ;       Val 1 - network-dependent value
88 ;               For TCP and ARPNCP, this is <id>,,<port/socket #>
89 ; Control bits:
90         %NQREF==:1      ; Arg 2 is previously returned identifier,
91                         ; refuse connection and flush from queue.
92
93 NETRFC: MOVE C,CTLBTS(U)        ; Set up control bits in C
94 IFN TCPP,[
95         CAMN A,[SIXBIT /TCP/]
96          JRST TCPRQ
97 ]
98 IFN CHAOSP,[
99         CAMN A,[SIXBIT /CHAOS/]
100          JRST [ TRNE C,%NQREF   ; If refusing conn,
101                  JRST OPNL12    ; Ignore, can't handle yet.  "Mode not avail"
102                 CAIGE W,2       ; Must have a 2nd arg
103                  JRST OPNL30    ; "Too few args"
104                 MOVE A,B        ; Fake out old CHAOSQ call
105                 JRST CHAOSQ]
106 ]
107 IFN NCPP,[      ; NOP for now
108 ;       CAMN A,[SIXBIT /ARPNCP/]
109 ;        JRST IMPRQ
110 ]
111         JRST OPNL33             ; No match, say "meaningless args".
112 \f
113 ; .CALL NETBLK  - Wait for net channel state to change, or time out.
114 ;       Arg 1 - Channel (comes in R)
115 ;       Arg 2 - Undesired state
116 ;       Arg 3 - Optional timeout (as in .SLEEP), written back unless immediate
117 ;       Val 1 - New state
118 ;       Val 2 - Time left
119
120 NETBLK: HRRZ T,(R)              ; Get IOCHNM RH = device index
121         HLRZ I,(R)              ; Get LH = often connection index
122 IFN NCPP,[
123         CAIL T,NETDUI
124          CAILE T,NETDBO
125           CAIA
126            JRST [MOVE T,[HRRZ A,IMSOC4]
127                 JRST NETBLI]
128 ] ;NCPP
129 IFN CHAOSP,[
130         CAIE T,CHAIDN
131          CAIN T,CHAODN
132           JRST [MOVE T,[HRRZ A,CHSSTA]
133                 JRST NETBLI]
134 ] ;CHAOSP
135 IFN TCPP,[
136         CAIN T,TCPDUI
137          JRST [ MOVE T,[HLRZ A,XBSTAU]
138                 JRST NETBLI]
139         CAIN T,TCPDUO
140          JRST [ MOVE T,[HRRZ A,XBSTAU]
141                 JRST NETBLI]
142 ] ;TCP
143         JRST OPNL34     ; Not a net chan, say "Wrong Type Device".
144
145
146 ; T/ Instruction to XCT (not indexed) to get state in A
147 ; Entry at NETBLI adds (I) to the instruction.
148
149 NETBLI: ADDI T,(I)              ; Provide "index" for instruction.
150 NETBL0: CAIGE W,3
151          JRST [ HRLOI D,377777  ; No time given, use infinity
152                 JRST NETBL4 ]
153         TLNE C,1000             ; Skip if pointer rather than immediate
154          JRST [ HRRZ D,C        ; Get immediate time
155                 ADD D,TIME
156                 JRST NETBL4 ]
157         XCTR XRW,[MOVES D,(C)]  ; Get time, check writeability
158         JUMPGE D,[ MOVNS D      ; Relative time, make negative absolute
159                    SUB D,TIME
160                    JRST .+1 ]
161         UMOVEM D,(C)            ; Store back absolute time
162         MOVNS D                 ; Make positive
163 NETBL4: MOVEM D,AC0S+D(U)       ; Save absolute time to wait until
164         MOVEM B,AC0S+B(U)       ; Save undesired state
165         PUSHJ P,NETBL2          ; Skip if state change or timeout
166          PUSHJ P,UFLS
167         MOVE B,D
168         SUB B,TIME              ; How much used?
169         XCT T                   ; Return new state
170         JRST POPJ1
171
172 NETBL2: XCT T                   ; Get current state
173         CAME A,AC0S+B(U)        ; Skip if still match
174          JRST POPJ1
175         MOVE A,AC0S+D(U)        ; Timeout time
176         CAMG A,TIME
177          AOS (P)
178         POPJ P,
179 \f
180 SUBTTL Utilities - CVTH2A, CVTH3A
181
182
183 ; CVH2NA - Convert network host address in A to HOSTS2 format.
184 ;       A/ net address (any format)
185 ; Returns A
186
187 CVH2NA: PUSH P,B
188         LDB B,[301400,,A]       ; Get high 12 bits of net address
189         CAIGE B,70              ; If less than lowest HOSTS2-fmt value
190          JUMPN B,CVH2N3         ; then must be HOSTS3, go convert.
191         CAIL B,1000             ; If any of high 3 bits set,
192          JRST CVH2N3            ;  then it's a HOSTS3 strange-fmt number.
193         JUMPN B,CVH2N2
194         CAILE A,377             ; Zero network, so must be ARPA net
195          JRST CVH2N1            ; Not just 8 bits, just add net number.
196
197         ; Old-style 8-bit Arpanet host number
198         LSHC A,-6.
199         ROT B,6.
200         DPB B,[112000,,A]
201 CVH2N1: TLO A,(12_33)
202         JRST POPBJ
203
204         ; Probably HOSTS2 format number
205 CVH2N2: JRST POPBJ              ; For now, that's good enough.
206
207         ; HOSTS3 format number, convert it.
208 CVH2N3: CAIN B,12               ; Arpa net?
209          JRST [ LSHC A,-16.
210                 ANDI A,377
211                 ROT B,16.
212                 DPB B,[112000,,A]
213                 TLO A,(12_33)
214                 JRST POPBJ]
215         CAIN B,7+<NE%UNT_-24.>  ; Chaos net?
216          JRST [ ANDI A,177777   ; Yup, fix it up.
217                 TLO A,(7_33)
218                 JRST POPBJ]
219         CAIN B,22               ; LCS net?
220          JRST [ LSHC A,-8.
221                 ANDI A,-1
222                 LSH A,2
223                 LSHC A,8.
224                 TLO A,(22_33)
225                 JRST POPBJ]
226
227         ; Not a known net, but try to do something plausible.
228         ANDCM A,[-1_24.]        ; Preserve low 24 bits
229         DPB B,[331100,,A]       ; put net # into HOSTS2 field.
230         POP P,B
231         RET
232
233 ; CVH3NA - Convert network host address in A to HOSTS3 (Internet) format.
234 ;       A/ net address (any format)
235 ; Returns A
236
237 CVH3NA: PUSH P,B
238         LDB B,[301400,,A]       ; Get high 12 bits of net address
239         CAIGE B,70              ; If less than lowest HOSTS2 value,
240          JUMPN B,CVH3N3         ; it's already HOSTS3 format!  (unless zero)
241         CAIL B,1000             ; If any of high 3 bits were set,
242          JRST CVH3N3            ;  it must be a HOSTS3 strange-fmt addr.
243         JUMPN B,CVH3N2          ; If not zero, then must assume HOSTS2 fmt.
244
245         ; Old-format 8-bit Arpanet host number, or HOSTS2 with zero net.
246         CAILE A,377
247          JRST CVH3N6    ; If greater than 8 bits, assume HOSTS2, zero net.
248         LSHC A,-6       ; Put 10 bits spacing between host/imp #s.
249         LSH B,-<2+8.>
250         LSHC A,<2+8.+6>
251         TLO A,(12_24.)  ; and add ARPA network number.
252         JRST CVH3N3
253
254         ; HOSTS2 format number
255 CVH3N2: TRZE B,7        ; Zap low 3 bits to ensure correct comparison
256          JRST CVH3N5    ; If any were set, can't be Chaosnet.
257         CAIN B,7_3              ; Chaos net?
258          JRST [ ANDI A,177777           ; Yes, kill all but bottom 16 bits
259                 TLO A,(NE%UNT+<7_24.>)  ; Add Chaos net #
260                 JRST CVH3N3]
261 CVH3N5: CAIN B,12_3             ; Arpa net?
262 CVH3N6:  JRST [ LSHC A,-9.
263                 ANDI A,177777
264                 ROT B,9.
265                 DPB B,[201000,,A]
266                 TLO A,(12_24.)
267                 JRST CVH3N3]
268         CAIN B,22_3             ; LCS net?
269          JRST [ LSHC A,-8.
270                 LSH A,-2
271                 ANDI A,377
272                 LSHC A,-8.
273                 TLO A,(22_24.)
274                 JRST CVH3N3]
275
276         ; No match, assume it's HOSTS3.
277
278 CVH3N3: POP P,B
279         RET
280 \f
281 ;.CALL STYNET
282 ;ARG 1 - STY CHANNEL
283 ;ARG 2 - NET INPUT CHANNEL TO CONNECT STY OUTPUT TO, OR -1 TO DISCONNECT
284 ;ARG 3 - NET OUTPUT CHANNEL TO CONNECT STY INPUT TO
285 ;ARG 4 - CHARS TO SEND WHEN OUTPUT .RESET HAPPENS ON STY'S TTY
286 ;          UP TO 3 8-BIT CHARACTERS, LEFT JUSTIFIED.
287
288 NSTYNT: TLNN R,%CLSST
289          JRST OPNL34            ;1ST ARG NOT A STY CHANNEL.
290         HLRZ I,(R)              ;GET TTY # OF STY
291         HRRES B                 ;ALLOW IMMEDIATE -1
292         JUMPGE B,NSTYN2         ;JUMP IF CONNECTING.
293         PUSHJ P,NSTYN0          ;DISCONNECT
294          JRST OPNL41            ;WASN'T CONNECTED
295         JRST POPJ1
296
297 ;VARIOUS ROUTINES CALL HERE WITH THE TTY# OF A STY IN I, TO DISCONNECT THE
298 ; STY FROM THE NETWORK.  NOTE THIS ROUTINE MUST NOT CHANGE U AND MUST NOT
299 ; LSWCLR, SINCE IT COULD BE CALLED FROM IODCL VIA STYCLS OR NETCLS.
300
301 NSTYN0: MOVSI B,%SSNET          ;DISCONNECTING BOTH SIDES.
302         CONO PI,NETOFF
303         TDNN B,STYSTS-NFSTTY(I)
304          POPJ P,                        ;THIS STY NOT CONNECTED?
305         ANDCAB B,STYSTS-NFSTTY(I)       ;MARK AS NO LONGER CONNECTED
306         MOVE C,STYNTL-NFSTTY(I)         ;REMOVE THIS STY FROM ACTIVATION LIST
307         MOVEI D,STYNTA-STYNTL+NFSTTY
308 NSTYN1: CAMN I,STYNTL-NFSTTY(D)         ;FIND THE STY THAT POINTS TO THIS ONE,
309          MOVEM C,STYNTL-NFSTTY(D)       ;AND PATCH US OUT OF THE LIST.
310         SKIPE D,STYNTL-NFSTTY(D)        ;SEARCH WHOLE LIST TILL FIND WHO POINTS TO US.
311          JRST NSTYN1
312         SETOB C,STYNTL-NFSTTY(I)
313         EXCH C,STYNTI-NFSTTY(I) ;MARK THIS STY AS HAVING NO CONNECTION, GET SOCKET INDICES
314 IFN CHAOSP,[
315         TLNE B,%SSCHA
316          JRST [ MOVSI B,%SSCHA  ;DISCONNECT FROM CHAOS NET
317                 ANDCAM B,STYSTS-NFSTTY(I)
318                 MOVSI B,%CFSTY
319                 TDNN B,CHSSTA(C)
320                  JRST 4,.       ;CHAOS DOESN'T THINK IT WAS CONNECTED?
321                 ANDCAM B,CHSSTA(C)
322                 JRST NETOJ1 ]
323 ];CHAOSP
324 IFN TCPP,[
325         TLNE B,%SSTCP
326          JRST [ MOVSI B,%SSTCP          ; Disconnect from TCP connection
327                 ANDCAM B,STYSTS-NFSTTY(I)       ; Flush STY's "connect" bit
328                 MOVSI B,(XB%STY)
329                 TDNN B,XBUSER(C)        ; Make sure TCP thinks connected
330                  BUG                    ; It isn't??
331                 ANDCAM B,XBUSER(C)
332                 JRST NETOJ1]
333 ] ;TCPP
334 IFN NCPP,[
335         MOVE B,[40000,,777]
336         TDNN B,IMSOC5(C)
337          JRST 4,.               ;SOCKET DOESN'T THINK IT WAS CONNECTED?
338         ANDCAM B,IMSOC5(C)      ;AND MARK SOCKETS WE WERE CONNECTED TO AS DISCONNECTED
339         MOVSS C
340         TDNN B,IMSOC5(C)
341          JRST 4,.               ;SOCKET DOESN'T THINK IT WAS CONNECTED?
342         ANDCAM B,IMSOC5(C)
343         JRST NETOJ1
344 ] ;NCPP
345 .ELSE   BUG
346
347 ; Here to set up STY connection.
348
349 NSTYN2: MOVE Q,I                ;SAVE TTY # OF STY
350         MOVEI E,1
351         MOVE A,B                ;DECODE THE NETWORK INPUT CHANNEL
352         JSP T,CHNDCD
353         HRRZ A,(R)
354 IFN CHAOSP,[
355         CAIE A,CHAIDN
356          CAIN A,CHAODN
357           JRST [ HLRZ I,(R)     ;CONNECT TO CHAOS NET
358                  CONO PI,NETOFF
359                  MOVSI B,%CFSTY
360                  TDNE B,CHSSTA(I)
361                   JRST OPNL23   ;ALREADY CONNECTED, FILE LOCKED
362                  MOVSI C,%SSNET+%SSCHA
363                  TDNE C,STYSTS-NFSTTY(Q)
364                   JRST OPNL23   ;ALREADY CONNECTED, FILE LOCKED
365                  IORM B,CHSSTA(I)       ;OK, HOOK UP
366                  DPB Q,[$CFTTN,,CHSSTA(I)]
367                  JRST NSTYN3 ]
368 ];CHAOSP
369 IFN TCPP,[
370         CAIE A,TCPDUI
371          CAIN A,TCPDUO
372           JRST [HLRZ I,(R)      ; Connect to TCP, get TCB index
373                 CONO PI,NETOFF
374                 MOVSI B,(XB%STY)
375                 TDNE B,XBUSER(I)
376                  JRST OPNL23    ; TCB Already connected, say "File Locked"
377                 MOVSI C,%SSNET+%SSTCP
378                 TDNE C,STYSTS-NFSTTY(Q)
379                  JRST OPNL23    ; STY already connected, say "File Locked"
380                 DPB Q,[XB$STY (I)]      ; Store TTY # to connect TCB.
381                 JRST NSTYN3]
382 ] ;TCPP
383 IFN NCPP,[
384         JSP T,NETCHK    ;TEST LEGALITY;  OPNL IF LOSES
385         TDNE E,IMSOC2(I)
386          JRST OPNL2             ;WRONG DIRECTION IF IT'S AN OUTPUT CHANNEL
387         MOVE B,I                ;SAVE INPUT IMSOC INDEX
388         MOVE A,C                ;DECODE OUTPUT CHANNEL
389         JSP T,CHNDCD
390         JSP T,NETCHK
391         TDNN E,IMSOC2(I)
392          JRST OPNL2             ;WRONG DIRECTION IF INPUT SOCKET
393         CONO PI,NETOFF
394         MOVE E,[40000,,777]
395         TDNN E,IMSOC5(B)        ;ERROR IF EITHER CHANNEL ALREADY CONNECTED
396          TDNE E,IMSOC5(I)
397           JRST OPNL23           ;"FILE LOCKED"
398         MOVSI C,%SSNET
399         TDNE C,STYSTS-NFSTTY(Q)
400          JRST OPNL23            ;SIMILAR ERROR IF STY ALREADY CONNECTED
401         HRR E,Q                 ;GET 40000,,TTY #
402         IORM E,IMSOC5(I)
403         IORM E,IMSOC5(B)        ;MARK SOCKETS AS CONNECTED
404 ] ;NCPP
405
406 NSTYN3: SKIPGE STYNTL-NFSTTY(Q) ;HALT IF STY'S VARS ARE NOT CORRECT FOR A 
407          SKIPL STYNTI-NFSTTY(Q) ;NON-CONNECTED STY.
408           JRST 4,.
409         IORM C,STYSTS-NFSTTY(Q) ;ALL ERROR CAUGHT, SO MARK STY CONNECTED.
410         HRL B,I                 ;PUT INPUT IMSOC IDX,, OUTPUT IMSOC IDX
411         MOVSM B,STYNTI-NFSTTY(Q) ;INTO THE STY
412         TRZ D,7777              ;STORE THE OUTPUT RESET CHARACTERS - AT MOST 3
413         MOVEM D,STYORC-NFSTTY(Q)
414
415         ;ACTIVATE IN CASE HAS UNREAD INPUT
416 IFN NCPP,[
417         TLNN C,%SSCHA+%SSTCP
418          PUSHJ P,IMPUIN
419 ] ;NCPP
420 IFN CHAOSP,[
421         TLNE C,%SSCHA
422          PUSHJ P,CHINTI
423 ];CHAOSP
424 IFN TCPP,[
425         TLNE C,%SSTCP
426          PUSHJ P,TCPUII
427 ] ;TCPP
428         JRST NETOJ1
429 \f
430 SUBTTL  Clock interrupt level code
431
432 ; NETCLK - Slow net clock.  Called at clock level every 1/2 sec.
433 ;       Can clobber all ACs
434
435 NETCLK:
436 IFN CHAOSP, PUSHJ P,CHACLK      ; Run Chaos net 1/2-second clock
437 IFN TCPP, PUSHJ P,TCPCLK        ; Run TCP 1/2-sec clock
438         SETCMB A,NETCL1         ; Flip the 1 sec switch
439         JUMPE A,CPOPJ           ; Return unless time for 1-sec clock
440 IFN INETP,CALL IPFCLK           ; Run IP reassembly timeout every 1 sec
441         RET
442 EBLK
443 NETCL1: 0               ; Flip-flop to get 1-sec ticks
444 BBLK
445
446 ; STYNTC - Called at clock level every 1/60 sec to process all
447 ;       necessary transfers of data between STYs and associated
448 ;       net connections
449
450 STYNTC: CONO PI,NETOFF
451         SKIPN I,STYNTA          ;GET HEAD OF ACTIVATE LIST
452          JRST NETONJ            ;EMPTY
453         SETZM STYNTA            ;COPY LIST IN CASE A STY IS PUT BACK ON
454         CONO PI,NETON
455 STYNT7: MOVE A,STYNTL-NFSTTY(I) ;GET NEXT ON LIST
456         MOVEM A,STYNTB          ;SAVE FOR NEXT TIME AROUND LOOP
457         SETOM STYNTL-NFSTTY(I)  ;THIS ONE IS NO LONGER ON ACTIVATE LIST
458         MOVE A,STYSTS-NFSTTY(I)
459         TLNN A,%SSNET
460          JRST 4,.               ;STY CLAIMS NOT TO BE CONNECTED??
461         MOVE R,I                ;SAVE TTY #
462
463 IFN CHAOSP,[
464         TLNE A,%SSCHA
465          JRST STYCHA            ;CONNECTED TO CHAOS NET
466 ];CHAOSP
467 IFN TCPP,[
468         TLNE A,%SSTCP
469          JRST STYTCP
470 ] ;TCPP
471 IFN NCPP,[
472         JRST STYNCP
473 ];NCPP
474
475 STYNT8: SKIPE I,STYNTB          ;GET NEXT STY FROM COPIED ACTIVATION LIST
476          JRST STYNT7
477         POPJ P,
478
479 ;SUBROUTINE TO STANDARDIZE HOST NUMBER, OPNL25 IF NO GOOD
480 ;PROCESSES HOST NUMBER IN T, MUNGS H, CALLED BY JSP J,STDHST
481 STDHST:
482 IFN 1,[
483         EXCH A,T
484         CALL CVH3NA             ; Convert # to HOSTS3 fmt
485         EXCH A,T
486         LDB H,[301400,,T]       ; Get high 12 bits (net #)
487         CAIE H,12               ; Should be ARPA net
488          JRST OPNL25
489         TDZ T,[NW%ARP+<377_8.>] ; Flush the net # and logical host field
490         JRST (J)
491 ] ;IFN 1
492 IFN 0,[
493         LDB H,[331000,,T]       ;GET NETWORK-NUMBER FIELD
494         CAIE H,12               ;ONLY 12 OR 0 IS ACCEPTABLE
495          JUMPN H,OPNL25
496         TDNE T,[400600,,400]    ;MAKE SURE OTHER RANDOM BITS AREN'T ON
497          JRST OPNL25
498         TLZ T,777000            ;CLEAR NETWORK NUMBER
499         JUMPE T,OPNL25          ;0 IS NOT ACCEPTABLE
500         CAIL T,400              ;SKIP IF OLD-STYLE HOST NUMBER
501          JRST (J)
502         LDB H,[060200,,T]       ;GET HOST FIELD
503         ANDI T,77               ;GET IMP FIELD
504         EXCH H,T
505         DPB H,[112000,,T]       ;RECOMBINE
506         JRST (J)
507 ] ;IFN 0