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
58 IFN IMPP,[ ; ARPAnet IMP interface code
69 IFN NCPP,[ ; Old Arpanet NCP protocol code
74 IFN INETP,[ ; Internet Protocol code
80 IFN TCPP,[ ; Transmission Control Protocol code
86 IFN CHAOSP,[ ; CHAOSnet interface and protocol code
91 SUBTTL General Network System Calls
93 ; .CALL NETRFC - Get a pending Request For Connection for a specific network
94 ; Arg 1 - SIXBIT name of network
95 ; Arg 2 - optional network-dependent arg
96 ; (for CHAOS, points to packet buffer)
97 ; Val 1 - network-dependent value
98 ; For TCP and ARPNCP, this is <id>,,<port/socket #>
100 %NQREF==:1 ; Arg 2 is previously returned identifier,
101 ; refuse connection and flush from queue.
103 NETRFC: MOVE C,CTLBTS(U) ; Set up control bits in C
105 CAMN A,[SIXBIT /TCP/]
109 CAMN A,[SIXBIT /CHAOS/]
110 JRST [ TRNE C,%NQREF ; If refusing conn,
111 JRST OPNL12 ; Ignore, can't handle yet. "Mode not avail"
112 CAIGE W,2 ; Must have a 2nd arg
113 JRST OPNL30 ; "Too few args"
114 MOVE A,B ; Fake out old CHAOSQ call
117 IFN NCPP,[ ; NOP for now
118 ; CAMN A,[SIXBIT /ARPNCP/]
121 JRST OPNL33 ; No match, say "meaningless args".
123 ; .CALL NETBLK - Wait for net channel state to change, or time out.
124 ; Arg 1 - Channel (comes in R)
125 ; Arg 2 - Undesired state
126 ; Arg 3 - Optional timeout (as in .SLEEP), written back unless immediate
130 NETBLK: HRRZ T,(R) ; Get IOCHNM RH = device index
131 HLRZ I,(R) ; Get LH = often connection index
136 JRST [MOVE T,[HRRZ A,IMSOC4]
142 JRST [MOVE T,[HRRZ A,CHSSTA]
147 JRST [ MOVE T,[HLRZ A,XBSTAU]
150 JRST [ MOVE T,[HRRZ A,XBSTAU]
153 JRST OPNL34 ; Not a net chan, say "Wrong Type Device".
156 ; T/ Instruction to XCT (not indexed) to get state in A
157 ; Entry at NETBLI adds (I) to the instruction.
159 NETBLI: ADDI T,(I) ; Provide "index" for instruction.
161 JRST [ HRLOI D,377777 ; No time given, use infinity
163 TLNE C,1000 ; Skip if pointer rather than immediate
164 JRST [ HRRZ D,C ; Get immediate time
167 XCTR XRW,[MOVES D,(C)] ; Get time, check writeability
168 JUMPGE D,[ MOVNS D ; Relative time, make negative absolute
171 UMOVEM D,(C) ; Store back absolute time
172 MOVNS D ; Make positive
173 NETBL4: MOVEM D,AC0S+D(U) ; Save absolute time to wait until
174 MOVEM B,AC0S+B(U) ; Save undesired state
175 PUSHJ P,NETBL2 ; Skip if state change or timeout
178 SUB B,TIME ; How much used?
179 XCT T ; Return new state
182 NETBL2: XCT T ; Get current state
183 CAME A,AC0S+B(U) ; Skip if still match
185 MOVE A,AC0S+D(U) ; Timeout time
190 SUBTTL Utilities - CVTH2A, CVTH3A
193 ; CVH2NA - Convert network host address in A to HOSTS2 format.
194 ; A/ net address (any format)
198 LDB B,[301400,,A] ; Get high 12 bits of net address
199 CAIGE B,70 ; If less than lowest HOSTS2-fmt value
200 JUMPN B,CVH2N3 ; then must be HOSTS3, go convert.
201 CAIL B,1000 ; If any of high 3 bits set,
202 JRST CVH2N3 ; then it's a HOSTS3 strange-fmt number.
204 CAILE A,377 ; Zero network, so must be ARPA net
205 JRST CVH2N1 ; Not just 8 bits, just add net number.
207 ; Old-style 8-bit Arpanet host number
211 CVH2N1: TLO A,(12_33)
214 ; Probably HOSTS2 format number
215 CVH2N2: JRST POPBJ ; For now, that's good enough.
217 ; HOSTS3 format number, convert it.
218 CVH2N3: CAIN B,12 ; Arpa net?
225 CAIN B,7+<NE%UNT_-24.> ; Chaos net?
226 JRST [ ANDI A,177777 ; Yup, fix it up.
237 ; Not a known net, but try to do something plausible.
238 ANDCM A,[-1_24.] ; Preserve low 24 bits
239 DPB B,[331100,,A] ; put net # into HOSTS2 field.
243 ; CVH3NA - Convert network host address in A to HOSTS3 (Internet) format.
244 ; A/ net address (any format)
248 LDB B,[301400,,A] ; Get high 12 bits of net address
249 CAIGE B,70 ; If less than lowest HOSTS2 value,
250 JUMPN B,CVH3N3 ; it's already HOSTS3 format! (unless zero)
251 CAIL B,1000 ; If any of high 3 bits were set,
252 JRST CVH3N3 ; it must be a HOSTS3 strange-fmt addr.
253 JUMPN B,CVH3N2 ; If not zero, then must assume HOSTS2 fmt.
255 ; Old-format 8-bit Arpanet host number, or HOSTS2 with zero net.
257 JRST CVH3N6 ; If greater than 8 bits, assume HOSTS2, zero net.
258 LSHC A,-6 ; Put 10 bits spacing between host/imp #s.
261 TLO A,(12_24.) ; and add ARPA network number.
264 ; HOSTS2 format number
265 CVH3N2: TRZE B,7 ; Zap low 3 bits to ensure correct comparison
266 JRST CVH3N5 ; If any were set, can't be Chaosnet.
267 CAIN B,7_3 ; Chaos net?
268 JRST [ ANDI A,177777 ; Yes, kill all but bottom 16 bits
269 TLO A,(NE%UNT+<7_24.>) ; Add Chaos net #
271 CVH3N5: CAIN B,12_3 ; Arpa net?
272 CVH3N6: JRST [ LSHC A,-9.
278 CAIN B,22_3 ; LCS net?
286 ; No match, assume it's HOSTS3.
293 ;ARG 2 - NET INPUT CHANNEL TO CONNECT STY OUTPUT TO, OR -1 TO DISCONNECT
294 ;ARG 3 - NET OUTPUT CHANNEL TO CONNECT STY INPUT TO
295 ;ARG 4 - CHARS TO SEND WHEN OUTPUT .RESET HAPPENS ON STY'S TTY
296 ; UP TO 3 8-BIT CHARACTERS, LEFT JUSTIFIED.
298 NSTYNT: TLNN R,%CLSST
299 JRST OPNL34 ;1ST ARG NOT A STY CHANNEL.
300 HLRZ I,(R) ;GET TTY # OF STY
301 HRRES B ;ALLOW IMMEDIATE -1
302 JUMPGE B,NSTYN2 ;JUMP IF CONNECTING.
303 PUSHJ P,NSTYN0 ;DISCONNECT
304 JRST OPNL41 ;WASN'T CONNECTED
307 ;VARIOUS ROUTINES CALL HERE WITH THE TTY# OF A STY IN I, TO DISCONNECT THE
308 ; STY FROM THE NETWORK. NOTE THIS ROUTINE MUST NOT CHANGE U AND MUST NOT
309 ; LSWCLR, SINCE IT COULD BE CALLED FROM IODCL VIA STYCLS OR NETCLS.
311 NSTYN0: MOVSI B,%SSNET ;DISCONNECTING BOTH SIDES.
313 TDNN B,STYSTS-NFSTTY(I)
314 POPJ P, ;THIS STY NOT CONNECTED?
315 ANDCAB B,STYSTS-NFSTTY(I) ;MARK AS NO LONGER CONNECTED
316 MOVE C,STYNTL-NFSTTY(I) ;REMOVE THIS STY FROM ACTIVATION LIST
317 MOVEI D,STYNTA-STYNTL+NFSTTY
318 NSTYN1: CAMN I,STYNTL-NFSTTY(D) ;FIND THE STY THAT POINTS TO THIS ONE,
319 MOVEM C,STYNTL-NFSTTY(D) ;AND PATCH US OUT OF THE LIST.
320 SKIPE D,STYNTL-NFSTTY(D) ;SEARCH WHOLE LIST TILL FIND WHO POINTS TO US.
322 SETOB C,STYNTL-NFSTTY(I)
323 EXCH C,STYNTI-NFSTTY(I) ;MARK THIS STY AS HAVING NO CONNECTION, GET SOCKET INDICES
326 JRST [ MOVSI B,%SSCHA ;DISCONNECT FROM CHAOS NET
327 ANDCAM B,STYSTS-NFSTTY(I)
330 JRST 4,. ;CHAOS DOESN'T THINK IT WAS CONNECTED?
336 JRST [ MOVSI B,%SSTCP ; Disconnect from TCP connection
337 ANDCAM B,STYSTS-NFSTTY(I) ; Flush STY's "connect" bit
339 TDNN B,XBUSER(C) ; Make sure TCP thinks connected
347 JRST 4,. ;SOCKET DOESN'T THINK IT WAS CONNECTED?
348 ANDCAM B,IMSOC5(C) ;AND MARK SOCKETS WE WERE CONNECTED TO AS DISCONNECTED
351 JRST 4,. ;SOCKET DOESN'T THINK IT WAS CONNECTED?
357 ; Here to set up STY connection.
359 NSTYN2: MOVE Q,I ;SAVE TTY # OF STY
361 MOVE A,B ;DECODE THE NETWORK INPUT CHANNEL
367 JRST [ HLRZ I,(R) ;CONNECT TO CHAOS NET
371 JRST OPNL23 ;ALREADY CONNECTED, FILE LOCKED
372 MOVSI C,%SSNET+%SSCHA
373 TDNE C,STYSTS-NFSTTY(Q)
374 JRST OPNL23 ;ALREADY CONNECTED, FILE LOCKED
375 IORM B,CHSSTA(I) ;OK, HOOK UP
376 DPB Q,[$CFTTN,,CHSSTA(I)]
382 JRST [HLRZ I,(R) ; Connect to TCP, get TCB index
386 JRST OPNL23 ; TCB Already connected, say "File Locked"
387 MOVSI C,%SSNET+%SSTCP
388 TDNE C,STYSTS-NFSTTY(Q)
389 JRST OPNL23 ; STY already connected, say "File Locked"
390 DPB Q,[XB$STY (I)] ; Store TTY # to connect TCB.
394 JSP T,NETCHK ;TEST LEGALITY; OPNL IF LOSES
396 JRST OPNL2 ;WRONG DIRECTION IF IT'S AN OUTPUT CHANNEL
397 MOVE B,I ;SAVE INPUT IMSOC INDEX
398 MOVE A,C ;DECODE OUTPUT CHANNEL
402 JRST OPNL2 ;WRONG DIRECTION IF INPUT SOCKET
405 TDNN E,IMSOC5(B) ;ERROR IF EITHER CHANNEL ALREADY CONNECTED
407 JRST OPNL23 ;"FILE LOCKED"
409 TDNE C,STYSTS-NFSTTY(Q)
410 JRST OPNL23 ;SIMILAR ERROR IF STY ALREADY CONNECTED
411 HRR E,Q ;GET 40000,,TTY #
413 IORM E,IMSOC5(B) ;MARK SOCKETS AS CONNECTED
416 NSTYN3: SKIPGE STYNTL-NFSTTY(Q) ;HALT IF STY'S VARS ARE NOT CORRECT FOR A
417 SKIPL STYNTI-NFSTTY(Q) ;NON-CONNECTED STY.
419 IORM C,STYSTS-NFSTTY(Q) ;ALL ERROR CAUGHT, SO MARK STY CONNECTED.
420 HRL B,I ;PUT INPUT IMSOC IDX,, OUTPUT IMSOC IDX
421 MOVSM B,STYNTI-NFSTTY(Q) ;INTO THE STY
422 TRZ D,7777 ;STORE THE OUTPUT RESET CHARACTERS - AT MOST 3
423 MOVEM D,STYORC-NFSTTY(Q)
425 ;ACTIVATE IN CASE HAS UNREAD INPUT
440 SUBTTL Clock interrupt level code
442 ; NETCLK - Slow net clock. Called at clock level every 1/2 sec.
443 ; Can clobber all ACs
446 IFN CHAOSP, PUSHJ P,CHACLK ; Run Chaos net 1/2-second clock
447 IFN TCPP, PUSHJ P,TCPCLK ; Run TCP 1/2-sec clock
448 SETCMB A,NETCL1 ; Flip the 1 sec switch
449 JUMPE A,CPOPJ ; Return unless time for 1-sec clock
450 IFN INETP,CALL IPFCLK ; Run IP reassembly timeout every 1 sec
453 NETCL1: 0 ; Flip-flop to get 1-sec ticks
456 ; STYNTC - Called at clock level every 1/60 sec to process all
457 ; necessary transfers of data between STYs and associated
460 STYNTC: CONO PI,NETOFF
461 SKIPN I,STYNTA ;GET HEAD OF ACTIVATE LIST
463 SETZM STYNTA ;COPY LIST IN CASE A STY IS PUT BACK ON
465 STYNT7: MOVE A,STYNTL-NFSTTY(I) ;GET NEXT ON LIST
466 MOVEM A,STYNTB ;SAVE FOR NEXT TIME AROUND LOOP
467 SETOM STYNTL-NFSTTY(I) ;THIS ONE IS NO LONGER ON ACTIVATE LIST
468 MOVE A,STYSTS-NFSTTY(I)
470 JRST 4,. ;STY CLAIMS NOT TO BE CONNECTED??
475 JRST STYCHA ;CONNECTED TO CHAOS NET
485 STYNT8: SKIPE I,STYNTB ;GET NEXT STY FROM COPIED ACTIVATION LIST
489 ;SUBROUTINE TO STANDARDIZE HOST NUMBER, OPNL25 IF NO GOOD
490 ;PROCESSES HOST NUMBER IN T, MUNGS H, CALLED BY JSP J,STDHST
494 CALL CVH3NA ; Convert # to HOSTS3 fmt
496 LDB H,[301400,,T] ; Get high 12 bits (net #)
497 CAIE H,12 ; Should be ARPA net
499 TDZ T,[NW%ARP+<377_8.>] ; Flush the net # and logical host field
503 LDB H,[331000,,T] ;GET NETWORK-NUMBER FIELD
504 CAIE H,12 ;ONLY 12 OR 0 IS ACCEPTABLE
506 TDNE T,[400600,,400] ;MAKE SURE OTHER RANDOM BITS AREN'T ON
508 TLZ T,777000 ;CLEAR NETWORK NUMBER
509 JUMPE T,OPNL25 ;0 IS NOT ACCEPTABLE
510 CAIL T,400 ;SKIP IF OLD-STYLE HOST NUMBER
512 LDB H,[060200,,T] ;GET HOST FIELD
513 ANDI T,77 ;GET IMP FIELD
515 DPB H,[112000,,T] ;RECOMBINE