1 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
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.
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.
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.
17 ;; For ITS network stuff, the following parameters are defined:
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)
24 ; CHAOSP - Include CHAOS net code
25 ; - other CHAOS stuff, all independent of internet stuff.
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
32 .RADIX 10.,<<<<<A_8>+B>_8>+C>_8>+D,!TERMIN
34 ; HOSTS3 full word network # values for certain networks
36 NW%CHS==:<NE%UNT+<7_24.>>
39 NW%AI==:HOSTN 128,52,0,0
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
56 IFN IMPP,[ ; ARPAnet IMP interface code
65 IFN NCPP,[ ; Old Arpanet NCP protocol code
69 IFN INETP,[ ; Internet Protocol code
73 IFN TCPP,[ ; Transmission Control Protocol code
77 IFN CHAOSP,[ ; CHAOSnet interface and protocol code
81 SUBTTL General Network System Calls
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 #>
90 %NQREF==:1 ; Arg 2 is previously returned identifier,
91 ; refuse connection and flush from queue.
93 NETRFC: MOVE C,CTLBTS(U) ; Set up control bits in C
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
107 IFN NCPP,[ ; NOP for now
108 ; CAMN A,[SIXBIT /ARPNCP/]
111 JRST OPNL33 ; No match, say "meaningless args".
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
120 NETBLK: HRRZ T,(R) ; Get IOCHNM RH = device index
121 HLRZ I,(R) ; Get LH = often connection index
126 JRST [MOVE T,[HRRZ A,IMSOC4]
132 JRST [MOVE T,[HRRZ A,CHSSTA]
137 JRST [ MOVE T,[HLRZ A,XBSTAU]
140 JRST [ MOVE T,[HRRZ A,XBSTAU]
143 JRST OPNL34 ; Not a net chan, say "Wrong Type Device".
146 ; T/ Instruction to XCT (not indexed) to get state in A
147 ; Entry at NETBLI adds (I) to the instruction.
149 NETBLI: ADDI T,(I) ; Provide "index" for instruction.
151 JRST [ HRLOI D,377777 ; No time given, use infinity
153 TLNE C,1000 ; Skip if pointer rather than immediate
154 JRST [ HRRZ D,C ; Get immediate time
157 XCTR XRW,[MOVES D,(C)] ; Get time, check writeability
158 JUMPGE D,[ MOVNS D ; Relative time, make negative absolute
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
168 SUB B,TIME ; How much used?
169 XCT T ; Return new state
172 NETBL2: XCT T ; Get current state
173 CAME A,AC0S+B(U) ; Skip if still match
175 MOVE A,AC0S+D(U) ; Timeout time
180 SUBTTL Utilities - CVTH2A, CVTH3A
183 ; CVH2NA - Convert network host address in A to HOSTS2 format.
184 ; A/ net address (any format)
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.
194 CAILE A,377 ; Zero network, so must be ARPA net
195 JRST CVH2N1 ; Not just 8 bits, just add net number.
197 ; Old-style 8-bit Arpanet host number
201 CVH2N1: TLO A,(12_33)
204 ; Probably HOSTS2 format number
205 CVH2N2: JRST POPBJ ; For now, that's good enough.
207 ; HOSTS3 format number, convert it.
208 CVH2N3: CAIN B,12 ; Arpa net?
215 CAIN B,7+<NE%UNT_-24.> ; Chaos net?
216 JRST [ ANDI A,177777 ; Yup, fix it up.
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.
233 ; CVH3NA - Convert network host address in A to HOSTS3 (Internet) format.
234 ; A/ net address (any format)
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.
245 ; Old-format 8-bit Arpanet host number, or HOSTS2 with zero net.
247 JRST CVH3N6 ; If greater than 8 bits, assume HOSTS2, zero net.
248 LSHC A,-6 ; Put 10 bits spacing between host/imp #s.
251 TLO A,(12_24.) ; and add ARPA network number.
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 #
261 CVH3N5: CAIN B,12_3 ; Arpa net?
262 CVH3N6: JRST [ LSHC A,-9.
268 CAIN B,22_3 ; LCS net?
276 ; No match, assume it's HOSTS3.
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.
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
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.
301 NSTYN0: MOVSI B,%SSNET ;DISCONNECTING BOTH SIDES.
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.
312 SETOB C,STYNTL-NFSTTY(I)
313 EXCH C,STYNTI-NFSTTY(I) ;MARK THIS STY AS HAVING NO CONNECTION, GET SOCKET INDICES
316 JRST [ MOVSI B,%SSCHA ;DISCONNECT FROM CHAOS NET
317 ANDCAM B,STYSTS-NFSTTY(I)
320 JRST 4,. ;CHAOS DOESN'T THINK IT WAS CONNECTED?
326 JRST [ MOVSI B,%SSTCP ; Disconnect from TCP connection
327 ANDCAM B,STYSTS-NFSTTY(I) ; Flush STY's "connect" bit
329 TDNN B,XBUSER(C) ; Make sure TCP thinks connected
337 JRST 4,. ;SOCKET DOESN'T THINK IT WAS CONNECTED?
338 ANDCAM B,IMSOC5(C) ;AND MARK SOCKETS WE WERE CONNECTED TO AS DISCONNECTED
341 JRST 4,. ;SOCKET DOESN'T THINK IT WAS CONNECTED?
347 ; Here to set up STY connection.
349 NSTYN2: MOVE Q,I ;SAVE TTY # OF STY
351 MOVE A,B ;DECODE THE NETWORK INPUT CHANNEL
357 JRST [ HLRZ I,(R) ;CONNECT TO CHAOS NET
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)]
372 JRST [HLRZ I,(R) ; Connect to TCP, get TCB index
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.
384 JSP T,NETCHK ;TEST LEGALITY; OPNL IF LOSES
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
392 JRST OPNL2 ;WRONG DIRECTION IF INPUT SOCKET
395 TDNN E,IMSOC5(B) ;ERROR IF EITHER CHANNEL ALREADY CONNECTED
397 JRST OPNL23 ;"FILE LOCKED"
399 TDNE C,STYSTS-NFSTTY(Q)
400 JRST OPNL23 ;SIMILAR ERROR IF STY ALREADY CONNECTED
401 HRR E,Q ;GET 40000,,TTY #
403 IORM E,IMSOC5(B) ;MARK SOCKETS AS CONNECTED
406 NSTYN3: SKIPGE STYNTL-NFSTTY(Q) ;HALT IF STY'S VARS ARE NOT CORRECT FOR A
407 SKIPL STYNTI-NFSTTY(Q) ;NON-CONNECTED STY.
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)
415 ;ACTIVATE IN CASE HAS UNREAD INPUT
430 SUBTTL Clock interrupt level code
432 ; NETCLK - Slow net clock. Called at clock level every 1/2 sec.
433 ; Can clobber all ACs
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
443 NETCL1: 0 ; Flip-flop to get 1-sec ticks
446 ; STYNTC - Called at clock level every 1/60 sec to process all
447 ; necessary transfers of data between STYs and associated
450 STYNTC: CONO PI,NETOFF
451 SKIPN I,STYNTA ;GET HEAD OF ACTIVATE LIST
453 SETZM STYNTA ;COPY LIST IN CASE A STY IS PUT BACK ON
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)
460 JRST 4,. ;STY CLAIMS NOT TO BE CONNECTED??
465 JRST STYCHA ;CONNECTED TO CHAOS NET
475 STYNT8: SKIPE I,STYNTB ;GET NEXT STY FROM COPIED ACTIVATION LIST
479 ;SUBROUTINE TO STANDARDIZE HOST NUMBER, OPNL25 IF NO GOOD
480 ;PROCESSES HOST NUMBER IN T, MUNGS H, CALLED BY JSP J,STDHST
484 CALL CVH3NA ; Convert # to HOSTS3 fmt
486 LDB H,[301400,,T] ; Get high 12 bits (net #)
487 CAIE H,12 ; Should be ARPA net
489 TDZ T,[NW%ARP+<377_8.>] ; Flush the net # and logical host field
493 LDB H,[331000,,T] ;GET NETWORK-NUMBER FIELD
494 CAIE H,12 ;ONLY 12 OR 0 IS ACCEPTABLE
496 TDNE T,[400600,,400] ;MAKE SURE OTHER RANDOM BITS AREN'T ON
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
502 LDB H,[060200,,T] ;GET HOST FIELD
503 ANDI T,77 ;GET IMP FIELD
505 DPB H,[112000,,T] ;RECOMBINE