home *** CD-ROM | disk | FTP | other *** search
/ Programmer's ROM - The Computer Language Library / programmersrom.iso / ada / defdata / iface.src < prev    next >
Encoding:
Text File  |  1988-05-03  |  47.7 KB  |  1,290 lines

  1. --::::::::::::::
  2. --ulp_buffer_.ada
  3. --::::::::::::::
  4. -----------------------------------------------------------------------
  5. --
  6. --         DoD Protocols    NA-00002-200       80-01034-100(-)
  7. --         E-Systems, Inc.  August 07, 1985
  8. --
  9. --         ULP_BUFFER_.ADA       Author : Jim Baldo
  10. --
  11. -----------------------------------------------------------------------
  12. with SYSTEM;                            use SYSTEM;
  13.      
  14.                         package BUFFER_DATA is
  15.      
  16. -----------------------------------------------------------------------------
  17. --This package represents the data abstraction of a message that travels   --
  18. --through each layer in the DoD reference model.  Upon recieving a message --
  19. --the protocol uses a pointer to gain access to the beginning of its       --
  20. --header.  The package is implementation dependent.  Its intend is to      --
  21. --facilatate the portibility of this communications program by narrowing   --
  22. --the packages to be change to an absolute minimum for different machines. --
  23. --                                                                         --
  24. --design:                                                                  --
  25. --                                                                         --
  26. --                                                                         --
  27. -- The packed bit stream buffer definition.                                --
  28. -- A buffer record contains the following information:                     --
  29. --  STATUS      : indicating the current owner, if any. A process must not --
  30. --                free a buffer if it is owned by any other process.       --
  31. --  TELNET_PTR  : indicates the position of the first byte of data for     --
  32. --                Telnet.                                                  --
  33. --  TCP_PTR     : indicates the position of the first byte of data for TCP.--
  34. --  IP_PTR      : indicates the position of the first byte of data for IP. --
  35. --  SUBNET_PTR  : Indicates the position of the first byte of data         --
  36. --                        for SUBNET                                       --
  37. --  SIZE        : total size in bytes                                      --
  38. --  BYTE        : The actual transmitted data, in an array of packed bytes.--
  39. --  NEXT        : A link field used to manage free buffers.                --
  40. --                                                                         --
  41. --                                                                         --
  42. --                                                                         --
  43. --      Organization of buffer                                             --
  44. --       Note that unused portion of the buffer is at the front or the back--
  45. --         of the buffer.                                                  --
  46. --                                                                         --
  47. --      +-------------+                                                    --
  48. --      |             |                                                    --
  49. --      |   unused    |                                                    --
  50. --      |             |                                                    --
  51. --      +-------------+ <-------- SUBNET_PTR                               --
  52. --      |             |                                                    --
  53. --      |    SUBNET   |                                                    --
  54. --      |   header    |                                                    --
  55. --      |             |                                                    --
  56. --      +-------------+ <-------- IP_PTR                                   --
  57. --      |             |                                                    --
  58. --      |     IP      |                                                    --
  59. --      |   header    |                                                    --
  60. --      |             |                                                    --
  61. --      +-------------+ <-------- TCP_PTR                                  --
  62. --      |             |                                                    --
  63. --      |    TCP      |                                                    --
  64. --      |   header    |                                                    --
  65. --      |             |                                                    --
  66. --      +-------------+ <-------- TELNET_PTR                               --
  67. --      |             |                                                    --
  68. --      |   TELNET    |                                                    --
  69. --      |    data     |                                                    --
  70. --      |             |                                                    --
  71. --      +-------------+                                                    --
  72. --      |             |                                                    --
  73. --      |   unused    |                                                    --
  74. --      |             |                                                    --
  75. --      +-------------+                                                    --
  76. --                                                                         --
  77. -----------------------------------------------------------------------------
  78.      
  79.         subtype THIRTYTWO_BITS is INTEGER; -- DEC/Ada
  80.         --TEL subtype THIRTYTWO_BITS is INTEGER; --Telesoft Ada version 1.5
  81.         subtype SIXTEEN_BITS is SHORT_INTEGER; -- DEC/Ada
  82.         --TEL subtype SIXTEEN_BITS is SHORT_INTEGER; --Telesoft Ada version 1.5
  83.         subtype SYSTEM_BYTE is UNSIGNED_BYTE; -- DEC/Ada
  84.         --TEL subtype SYSTEM_BYTE is SYSTEM.BYTE; -- Telesoft Ada version 1.5
  85.      
  86.         MAXIMUM_DATAGRAM_SIZE : constant SIXTEEN_BITS  := 576;
  87.         type BUFFER_STATUS is (NONE, OWNER_TELNET, OWNER_TCP, OWNER_IP,
  88.                                OWNER_X25);
  89.         type BUFFER_AREA IS ARRAY(1..MAXIMUM_DATAGRAM_SIZE) OF SYSTEM_BYTE;
  90.      
  91.         TELNET_SIZE : constant SIXTEEN_BITS := 512; --for efficent block transfe
  92.         TCP_SIZE : constant SIXTEEN_BITS := 512;
  93.         IP_SIZE : constant SIXTEEN_BITS := 512;
  94.         SUBNET_SIZE : constant SIXTEEN_BITS := 512; --set appropiately to SUBNET
  95.                                                --specification
  96.      
  97.         subtype TELNET_PTR_TYPE is SIXTEEN_BITS  range 0..TELNET_SIZE;
  98.         subtype TCP_PTR_TYPE is SIXTEEN_BITS  range 0..TCP_SIZE;
  99.         subtype IP_PTR_TYPE is SIXTEEN_BITS  range 0..IP_SIZE;
  100.         subtype SUBNET_PTR_TYPE is SIXTEEN_BITS  range 0..SUBNET_SIZE;
  101.      
  102.         type PACKED_BUFFER;
  103.         type PACKED_BUFFER_PTR is access PACKED_BUFFER;
  104.         type PACKED_BUFFER is
  105.                 record
  106.                         STATUS     : BUFFER_STATUS := NONE;
  107.                         IN_USE     : BOOLEAN := false;
  108.                                          -- THE LAYER USING IT MAY NOT
  109.                                          -- BE THE OWNER.
  110.                         SIZE     : SIXTEEN_BITS  range 0..MAXIMUM_DATAGRAM_SIZE;
  111.                         TELNET_PTR : TELNET_PTR_TYPE;
  112.                         TCP_PTR    : TCP_PTR_TYPE;
  113.                         IP_PTR     : IP_PTR_TYPE;
  114.                         SUBNET_PTR : SUBNET_PTR_TYPE;
  115.                         BYTE       : BUFFER_AREA;
  116.                         NEXT       : PACKED_BUFFER_PTR;
  117.                 end record;
  118.      
  119.         --type BUFFER_ERROR_TYPE is (RETURNING_A_BUFFER,OUT_OF_FREE_BUFFERS);
  120.      
  121.         procedure INIT;
  122.      
  123.                 --This subprogram is called when the system is intialize to
  124.                 --create a finite number of buffers.
  125.      
  126.         procedure BUFFREE
  127.                 ( BUFPTR :  in out PACKED_BUFFER_PTR;
  128.                   BUFFTYPE : in SIXTEEN_BITS );
  129.      
  130.                 --This subprogram frees a buffer to be used again.
  131.                 --Change buffer status to free and place it on a free list
  132.                 --of buffers.
  133.      
  134.         procedure BUFFGET
  135.                 ( BUFPTR : in out PACKED_BUFFER_PTR;
  136.                   BUFFTYPE : in SIXTEEN_BITS );
  137.      
  138.                 --This subprogram obtains a buffer to be used.
  139.      
  140. end BUFFER_DATA;
  141.      
  142. --::::::::::::::
  143. --ulp_buffer.ada
  144. --::::::::::::::
  145. -----------------------------------------------------------------------
  146. --
  147. --         DoD Protocols    NA-00002-200       80-01035-100(-)
  148. --         E-Systems, Inc.  August 07, 1985
  149. --
  150. --         ULP_BUFFER.ADA       Author : Jim Baldo
  151. --
  152. -----------------------------------------------------------------------
  153. with UNCHECKED_CONVERSION;
  154. with TEXT_IO;                         use TEXT_IO;
  155.  
  156.  
  157. ----------------------------------------------------------------------------
  158. -- 
  159. -- Implementation for DEC VAX installation only!
  160. --
  161. ----------------------------------------------------------------------------
  162.  
  163. package    body BUFFER_DATA  is
  164.  
  165. package INT_IO is new INTEGER_IO( THIRTYTWO_BITS );
  166.   
  167. HEAD : PACKED_BUFFER_PTR; -- The pointer to the head of the buffer free 
  168. BUFFER_COUNT : THIRTYTWO_BITS ;
  169.  
  170. BUFFER_PRINT_FLAG : THIRTYTWO_BITS  := 1;
  171.  
  172. task buffer_manager is
  173.   pragma priority (15) ; 
  174.   entry free (bufptr : in out packed_buffer_ptr) ;
  175.   entry get  (bufptr :    out packed_buffer_ptr) ;
  176. end buffer_manager ;
  177.  
  178. task body buffer_manager is
  179. begin
  180. loop
  181.   select
  182.     accept free (bufptr : in out packed_buffer_ptr) do
  183.       bufptr.next := head;
  184.     head := bufptr;
  185.         end free ;
  186.   or
  187.     accept  get  (bufptr : out packed_buffer_ptr) do
  188.       bufptr := head;
  189.       if head /= null then
  190.         head := head.next ;
  191.       end if ;
  192.     end get ;
  193.   or
  194.     terminate;
  195.   end select ;
  196. end loop ;
  197. exception
  198.   when others => 
  199.     put_line("ERROR IN BUFFER MANAGER") ;
  200.  
  201. end buffer_manager ;
  202.  
  203.  
  204. --
  205. -- The view from the outside world:
  206. --
  207.  
  208. procedure BUFFREE
  209.     ( BUFPTR : in out PACKED_BUFFER_PTR; 
  210.           BUFFTYPE : in SIXTEEN_BITS ) is
  211. begin
  212.  if BUFPTR.STATUS = NONE and then NOT BUFPTR.IN_USE then
  213.     BUFFER_COUNT := BUFFER_COUNT + 1; 
  214. --    if BUFFER_PRINT_FLAG /= 0 then --for debug only(JB 1/25/85)
  215. --     TEXT_IO.NEW_LINE;
  216. --         TEXT_IO.PUT("FREEING A BUFFER. NUMBER OF FREE BU");
  217. --     TEXT_IO.INTEGER_IO.PUT(BUFFER_COUNT);
  218. --     TEXT_IO.NEW_LINE;
  219. --    end if;
  220.     bufptr.in_use := true;
  221.     buffer_manager.free(bufptr) ;
  222.     bufptr := null; -- return a null pointer
  223.  end if;
  224. exception
  225.   when others => 
  226.     put_line("ERROR IN BUFFREE") ;
  227. end BUFFREE;
  228.  
  229. procedure BUFFGET
  230.     (BUFPTR : in out PACKED_BUFFER_PTR; 
  231.      BUFFTYPE : in SIXTEEN_BITS ) is
  232. begin
  233.  buffer_manager.get(bufptr) ;
  234.  if bufptr /= null then
  235.    bufptr.in_use     := false ;
  236.    bufptr.telnet_ptr := 255 ;
  237.    bufptr.tcp_ptr    := 255 ;
  238.    bufptr.ip_ptr     := 255 ;
  239.    bufptr.subnet_ptr := 255 ;
  240.    bufptr.status     := NONE ;
  241.  else
  242.    text_io.put_line("BUFFER_ERROR  OUT_OF_FREE_BUFFERS") ; -- for debug
  243.  end if ;
  244.  if BUFFER_COUNT /= 0 then
  245.   BUFFER_COUNT := BUFFER_COUNT - 1;
  246.  end if;
  247. -- if BUFFER_PRINT_FLAG /= 0 then--for debug only (JB 1/25/85)
  248. --    if BUFFER_COUNT /= 0 then
  249. --        TEXT_IO.NEW_LINE;
  250. --                TEXT_IO.PUT
  251. --                 ("GETTING A BUFFER. NUMBER OF FREE BU");
  252. --        TEXT_IO.INTEGER_IO.PUT(BUFFER_COUNT);
  253. --        TEXT_IO.NEW_LINE;
  254. --    else
  255. --                TEXT_IO.PUT_LINE("NO FREE BUFFERS ON BUFFER GET");
  256. --    end if;
  257. -- end if;
  258. exception
  259.   when others =>
  260.     TEXT_IO.PUT_LINE("ERROR IN BUFFER GET");
  261.     raise ;
  262. end BUFFGET;
  263.  
  264. procedure INIT is
  265.  
  266.  I : THIRTYTWO_BITS ;
  267.  NEXT_BUFFER : PACKED_BUFFER_PTR;
  268. begin
  269.   -- get one hundred and one buffers.
  270.   HEAD := new PACKED_BUFFER;
  271.   NEXT_BUFFER := new PACKED_BUFFER;
  272.   HEAD.NEXT := NEXT_BUFFER;
  273.   for I in 1..50 loop
  274.     next_buffer := new packed_buffer;
  275.     buffree(next_buffer,0) ;
  276.     end loop;
  277.   BUFFER_COUNT := 50;
  278.   if BUFFER_PRINT_FLAG /= 0 then
  279.     TEXT_IO.PUT("THE NUMBER OF INITIAL BUFFERS IS ");
  280.     INT_IO.PUT(BUFFER_COUNT);
  281.     TEXT_IO.NEW_LINE;
  282.   end if;
  283. exception 
  284.   when STORAGE_ERROR =>
  285.     TEXT_IO.PUT_LINE("OUT OF ROOM TO INITIALIZE BUFFERS");
  286.   when others =>
  287.     TEXT_IO.PUT_LINE("ERROR IN INITIALIZE BUFFERS");
  288. end INIT;
  289.  
  290.  
  291.  
  292. --
  293. -- Package initialization
  294. --
  295.  
  296.  
  297. begin
  298.  BUFFER_COUNT := 0; -- initialize buffer count.
  299. end BUFFER_DATA;
  300. --::::::::::::::
  301. --ulp_ipglb_.ada
  302. --::::::::::::::
  303. -----------------------------------------------------------------------
  304. --
  305. --         DoD Protocols    NA-00002-200       80-01036-100(-)
  306. --         E-Systems, Inc.  August 07, 1985
  307. --
  308. --         ULP_IPGLB_.ADA       Author : Jim Baldo
  309. --
  310. -----------------------------------------------------------------------
  311. with BUFFER_DATA ;        use BUFFER_DATA ;
  312. with SYSTEM;            use SYSTEM;
  313. with TEXT_IO;            use TEXT_IO;
  314.  
  315.             package IP_GLOBALS is
  316.  
  317.         -----------------------------------------------
  318.         --This implementation is for use with the    --
  319.         --DEC/Ada compiler .                         --
  320.         -----------------------------------------------
  321.  
  322. ------------------------------------------------------------------------------
  323. -- THIS SPECIFICATION CONTAINS ALL NECESSARY GLOBAL VARIABLES FOR THE       --
  324. -- INTERNET PROTOCOL.                                                       --
  325. ------------------------------------------------------------------------------
  326.  
  327.         subtype LOCAL_ADDRESS_TYPE  is SIXTEEN_BITS ;
  328.     NUMBER_OF_ADDRESSES : constant SIXTEEN_BITS  := 4; -- TEMPORARY VALUE ***
  329.     MAX_HOSTS : constant SIXTEEN_BITS  := 4; -- TEMP.
  330.     type MY_ADDRESS_LIST is array(1..MAX_HOSTS) of LOCAL_ADDRESS_TYPE ;
  331.     type ADDRESS_LIST is array(1..NUMBER_OF_ADDRESSES) of THIRTYTWO_BITS ;
  332.     VALID_ADDRESS_LIST : constant ADDRESS_LIST := (1, 2, 3, 128);
  333.     MY_IP_ADDRESS : constant MY_ADDRESS_LIST := (1,2,3,128); -- TEMPORARY **
  334.     BAD_CHECKSUM : SIXTEEN_BITS  := 0;
  335.     WHOIAM : constant THIRTYTWO_BITS  := 1 ; 
  336.  
  337.     subtype    SEVEN_BITS is SIXTEEN_BITS ;
  338.     subtype    TEN_BITS is SIXTEEN_BITS ;
  339.     subtype    THREE_BITS is SIXTEEN_BITS ;
  340.     subtype    TWO_BITS is SIXTEEN_BITS ;
  341.     subtype    FOUR_OCTETS is THIRTYTWO_BITS ;
  342.     subtype    TWO_OCTETS is SIXTEEN_BITS ;
  343.     subtype    ONE_OCTET is SIXTEEN_BITS ;
  344.     subtype    HALF_OCTET is SIXTEEN_BITS ;
  345.     subtype    SIX_BITS is SIXTEEN_BITS ;
  346.     subtype    ONE_BIT    is SIXTEEN_BITS ;
  347.  
  348.     subtype BTYPE_TYPE is SIXTEEN_BITS ;
  349.  
  350.         subtype OPTION_TYPE_RANGE is SIXTEEN_BITS range 1..50;
  351.  
  352.     type OPTION_TYPE is array(OPTION_TYPE_RANGE) of SIXTEEN_BITS ;
  353.  
  354.     type BUFFER_POINTER is
  355.         record
  356.             BTYPE :    BTYPE_TYPE;
  357.             VERSION    : HALF_OCTET;
  358.             IHL : HALF_OCTET;
  359.             TOS : ONE_OCTET;
  360.             TOT_LEN    : TWO_OCTETS;
  361.             ID : TWO_OCTETS;
  362.             FLAGS : THREE_BITS;
  363.             FRAG_OFFSET : TWO_OCTETS;
  364.             TTL : ONE_OCTET;
  365.             PROT : ONE_OCTET;
  366.             IPCSUM : TWO_OCTETS;
  367.             SOURCE : FOUR_OCTETS;
  368.             DEST : FOUR_OCTETS;
  369.               --OPTIONS    FOR IP HERE.
  370.             IP_OPTIONS : OPTION_TYPE := 
  371.                         (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  372.                          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  373.                          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  374.                          0);
  375.         end record;
  376.  
  377. type PRECEDENCE_TYPE is ( NETWORK_CONTROL, -- 111
  378.                           INTERNETWORK_CONTROL, -- 110
  379.                           CRITIC_ECP, -- 101
  380.                           FLASH_OVERRIDE, --100
  381.                           FLASH, --011
  382.                           IMMEDIATE, --010
  383.                           PRIORITY, --001
  384.                           ROUTINE); --000
  385.  
  386. type RELIABILITY_TYPE is ( NORMAL,
  387.                            HIGH);
  388.  
  389. type DELAY_TYPE is ( NORMAL,
  390.                      LOW);
  391.  
  392. type THROUGHPUT_TYPE is ( NORMAL,
  393.                           HIGH);
  394.  
  395. subtype DATAGRAM_LENGTH is SIXTEEN_BITS ;
  396.  
  397. type RESULT_TYPE is (OK, NOK);
  398.  
  399. type IP_ACTION is ( IP_SEND, ERROR_MESSAGE, DATA_FROM_SUBNET, 
  400.                    FROM_TCP, RECEIVE_IP, NO_IP_ACTION ) ;
  401.  
  402. type IP_MESSAGE(EVENT : IP_ACTION := IP_SEND) is
  403.  record
  404.   BUFPTR : PACKED_BUFFER_PTR := null;
  405.   case EVENT is
  406.    when IP_SEND => 
  407.     LOCAL_DESTINATION : LOCAL_ADDRESS_TYPE ;
  408.     PRECEDENCE : PRECEDENCE_TYPE := ROUTINE;
  409.     RELIABILITY : RELIABILITY_TYPE := NORMAL;
  410.     DELAY_IP : DELAY_TYPE := NORMAL;
  411.     THROUGHPUT : THROUGHPUT_TYPE := NORMAL;
  412.     LENGTH : DATAGRAM_LENGTH := 0 ;
  413.    when ERROR_MESSAGE => ERROR_NUMBER : SIXTEEN_BITS ;
  414.    when RECEIVE_IP => 
  415.     SOURCE : THIRTYTWO_BITS ;
  416.     PROT : SIXTEEN_BITS ;
  417.     RESULT : RESULT_TYPE;
  418.    when FROM_TCP => 
  419.     DEST : THIRTYTWO_BITS ;
  420.     TOS, TTL, LEN, ID, DF : SIXTEEN_BITS ;
  421.     OPTIONS : OPTION_TYPE ;
  422.     SRC : THIRTYTWO_BITS ;
  423.    when DATA_FROM_SUBNET => BYTE_COUNT : SIXTEEN_BITS ;
  424.    when NO_IP_ACTION => null;
  425.   end case;
  426.  end record;
  427.  
  428. end IP_GLOBALS;
  429. --::::::::::::::
  430. --ulp_vmodulo_.ada
  431. --::::::::::::::
  432. -----------------------------------------------------------------------
  433. --
  434. --         DoD Protocols    NA-00002-200       80-01040-100(-)
  435. --         E-Systems, Inc.  August 07, 1985
  436. --
  437. --         ULP_VMODULO_.ADA       Author : Jim Baldo
  438. --
  439. -----------------------------------------------------------------------
  440. with BUFFER_DATA ;                      use BUFFER_DATA ;
  441.      
  442.                         package MODULO is
  443.      
  444. type MODULAR is record
  445.  HI, LOW : THIRTYTWO_BITS ;
  446. end record;
  447.      
  448. function "<" (X,Y: MODULAR) return BOOLEAN;
  449.      
  450. function "<=" (X,Y: MODULAR) return BOOLEAN;
  451.      
  452. function ">" (X,Y: MODULAR) return BOOLEAN;
  453.      
  454. function ">=" (X,Y : MODULAR) return BOOLEAN;
  455.      
  456. function "+" (X,Y: MODULAR) return MODULAR;
  457.      
  458. function "+" (X: MODULAR;Y : THIRTYTWO_BITS ) return MODULAR;
  459.      
  460. function "+" ( X : THIRTYTWO_BITS ;
  461.                Y : MODULAR) return MODULAR;
  462.      
  463. function "+" (X : MODULAR; Y : SIXTEEN_BITS ) return MODULAR;
  464.      
  465. function "+" ( X : SIXTEEN_BITS ;
  466.                Y : MODULAR) return MODULAR;
  467.      
  468. function "-" ( X : MODULAR;
  469.                Y : SIXTEEN_BITS ) return MODULAR;
  470.      
  471. function "-" (X,Y: MODULAR) return MODULAR;
  472.      
  473. function LONG(X : MODULAR) return THIRTYTWO_BITS ;
  474.      
  475. function MODULAR_CONVERT (X : SIXTEEN_BITS ) return MODULAR;
  476.      
  477. function MODULAR_CONVERT (X : THIRTYTWO_BITS ) return MODULAR;
  478.      
  479. function GET_MODULAR(PP:STRING) return MODULAR;
  480.      
  481. procedure PUT_MODULAR(PP : MODULAR);
  482.      
  483. end MODULO;
  484.      
  485. --::::::::::::::
  486. --ulp_vmodulo.ada
  487. --::::::::::::::
  488. -----------------------------------------------------------------------
  489. --
  490. --         DoD Protocols    NA-00002-200       80-01041-100(-)
  491. --         E-Systems, Inc.  August 07, 1985
  492. --
  493. --         ULP_VMODULO.ADA       Author : Jim Baldo
  494. --
  495. -----------------------------------------------------------------------
  496.      
  497. with TEXT_IO;                   use TEXT_IO;
  498.      
  499.                 package body MODULO is
  500.      
  501. package INT_IO is new INTEGER_IO( THIRTYTWO_BITS );
  502.      
  503. function LONG(X : MODULAR) return THIRTYTWO_BITS   is
  504.      
  505. begin
  506.  return X.HI+X.LOW ;  -- DOES NOT WORK ALL THE TIME! MAY RAISE NUMERIC ERROR
  507. end LONG;
  508.      
  509. function MODULAR_CONVERT (X : SIXTEEN_BITS ) return MODULAR is
  510. Y : MODULAR ;
  511. begin
  512.  Y.HI := 0 ;
  513.  Y.LOW := THIRTYTWO_BITS (X);
  514.  return Y;
  515. exception
  516. when CONSTRAINT_ERROR =>
  517. -- PUT_LINE("CONSTRAINT ERROR IN INT MODULAR_CONVERT");
  518. raise;
  519. when others =>
  520. -- PUT_LINE("ERROR IN INT MODULAR_CONVERT");
  521. raise;
  522. end;
  523.      
  524. function MODULAR_CONVERT (X : THIRTYTWO_BITS  ) return MODULAR is
  525. Y : MODULAR;
  526. begin
  527.  Y.HI := X / 2**16 ;
  528.  Y.LOW := X MOD 2**16 ;
  529.  return Y;
  530. exception
  531. when CONSTRAINT_ERROR =>
  532. -- PUT_LINE("CONSTRAINT ERROR IN LONG_INT MODULAR_CONVERT");
  533. raise;
  534. when others =>
  535. -- PUT_LINE("ERROR IN LONG_INT MODULAR_CONVERT");
  536. raise;
  537. end;
  538.      
  539. procedure PUT_MODULAR(PP : MODULAR) is
  540. begin
  541.   TEXT_IO.PUT("THE ANSWER IS ");
  542.   IF PP.HI <= 2**15-1 THEN
  543.     INT_IO.PUT((PP.HI * (2**16)) + PP.LOW) ;
  544.     TEXT_IO.PUT_LINE("");
  545.   ELSE
  546.     TEXT_IO.PUT(" negative ") ;
  547.     INT_IO.PUT(PP.HI) ;
  548.     TEXT_IO.PUT(",");
  549.     INT_IO.PUT(PP.LOW) ;
  550.     TEXT_IO.PUT_LINE("") ;
  551.   END IF ;
  552. end;
  553.      
  554. function GET_MODULAR(PP:STRING) return MODULAR is
  555. X : MODULAR ;
  556. begin
  557. --  TEXT_IO.PUT_LINE(PP);
  558. --  TEXT_IO.PUT_LINE("");
  559. -- return VAL;
  560. X.HI := 0 ; X.LOW := 0 ;
  561. RETURN(X) ;
  562. end;
  563.      
  564.      
  565. function "+" (X : SIXTEEN_BITS ; Y : MODULAR) return MODULAR is
  566. begin
  567.   RETURN(MODULAR_CONVERT(X) + Y) ;
  568. end;
  569.      
  570.      
  571. function "+" ( X : MODULAR;
  572.                Y : SIXTEEN_BITS ) return MODULAR is
  573. begin
  574.   RETURN(MODULAR_CONVERT(Y) + X) ;
  575. end;
  576.      
  577.      
  578. function "+" ( X : THIRTYTWO_BITS  ;
  579.                Y : MODULAR) return MODULAR is
  580. begin
  581.   RETURN(MODULAR_CONVERT(X) + Y) ;
  582. end;
  583.      
  584.      
  585. function "+" (X : MODULAR;Y : THIRTYTWO_BITS  ) return MODULAR is
  586. begin
  587.   RETURN(MODULAR_CONVERT(Y) + X) ;
  588. end;
  589.      
  590.      
  591.      
  592. function "+" (X,Y: MODULAR) return MODULAR is
  593. Z : MODULAR;
  594. CARRY : INTEGER := 0 ;
  595. begin
  596. Z.LOW := X.LOW + Y.LOW;
  597. IF Z.LOW >= 2**16 THEN          -- CARRY
  598.   Z.LOW := Z.LOW - 2**16 ;
  599.   CARRY := 1 ;
  600. END IF ;
  601. Z.HI := (Y.HI + X.HI + CARRY) MOD 2**16 ;
  602. return Z;
  603. end;
  604.      
  605. function "<=" (X,Y : MODULAR) return BOOLEAN is
  606. begin
  607. if X.HI = Y.HI then
  608.   RETURN X.LOW <= Y.LOW ;
  609. elsif (X.HI -  Y.HI) > 2**15  then   -- we wrapped around
  610.   if X.HI > Y.HI  then                 -- Y wrapped around
  611.     return (TRUE) ;
  612.   else
  613.     return (FALSE) ;
  614.   end if ;
  615. else
  616.   return (X.HI <= Y.HI) ;
  617. end if ;
  618. end;
  619.      
  620.      
  621.      
  622. function ">=" (X,Y : MODULAR) return BOOLEAN is
  623. begin
  624. if X.HI = Y.HI then
  625.   RETURN X.LOW >= Y.LOW ;
  626. elsif (X.HI -  Y.HI) > 2**15  then   -- we wrapped around
  627.   if X.HI < Y.HI  then                 -- Y wrapped around
  628.     return (TRUE) ;
  629.   else
  630.     return (FALSE) ;
  631.   end if ;
  632. else
  633.   return (X.HI >= Y.HI) ;
  634. end if ;
  635. end;
  636.      
  637.      
  638.      
  639. function "<" (X,Y : MODULAR) return BOOLEAN is
  640. begin
  641. return(not (X >= Y)) ;
  642. end;
  643.      
  644.      
  645. function ">" (X,Y : MODULAR) return BOOLEAN is
  646. begin
  647. return(not (X <= Y)) ;
  648. end;
  649.      
  650.      
  651.      
  652. function "-" ( X : MODULAR;
  653.                Y : SIXTEEN_BITS ) return MODULAR is
  654.      
  655. begin
  656. return(X - MODULAR_CONVERT(Y)) ;
  657. end;
  658.      
  659.      
  660. function "-" (X, Y : MODULAR) return MODULAR is
  661. Z : MODULAR ;
  662. BORROW : INTEGER := 0 ;
  663. begin
  664. Z.LOW := X.LOW - Y.LOW ;
  665. if Z.LOW < 0 then
  666.   Z.LOW := Z.LOW + 2**16 ;    -- BORROW
  667.   BORROW := 1 ;
  668.   end if ;
  669. Z.HI := (X.HI - Y.HI - BORROW) ;
  670. IF Z.HI < 0 THEN
  671.   Z.HI := 2**16 - ABS(Z.HI) ;
  672. END IF ;
  673. RETURN (Z) ;
  674. end;
  675.      
  676. end MODULO;
  677. --::::::::::::::
  678. --ulp_tcpglbdat_.ada
  679. --::::::::::::::
  680. -----------------------------------------------------------------------
  681. --
  682. --         DoD Protocols    NA-00002-200       80-01039-100(-)
  683. --         E-Systems, Inc.  August 07, 1985
  684. --
  685. --         ULP_TCPGLBDAT_.ADA       Author : Jim Baldo
  686. --
  687. -----------------------------------------------------------------------
  688. with STARLET ;                  use STARLET ;
  689. with MODULO;                    use MODULO;
  690. with IP_GLOBALS;                use IP_GLOBALS;
  691. with BUFFER_DATA;               use BUFFER_DATA;
  692.      
  693.                 package T_TCP_GLOBALS_DATA_STRUCTURES is
  694.      
  695.         -----------------------------------------------------------
  696.         --This implementation is for use with the DEC/Ada        --
  697.         --compiler .                                             --
  698.         -----------------------------------------------------------
  699.      
  700. --*****************************************************************************
  701. --*Implementation Restrictions                                                *
  702. --*---------------------------                                                *
  703. --* Some of these types could have their bit size set when the compiler       *
  704. --* is able to do it.                                                         *
  705. --*****************************************************************************
  706.      
  707.         TABLE_RANGE : constant SIXTEEN_BITS  := 32;
  708.         subtype ERROR_TYPE is SIXTEEN_BITS ;
  709.         type STATUS_TYPE is
  710.                 (CONNECTION_OPEN, CONNECTION_CLOSED, OPENING, CLOSING);
  711.         type ACKPASS is (PASSIVE, ACTIVE);
  712.         type TIMER_TYPE is (TIME_WAIT_TIMER, RETRANS_TIMER, TIMEOUT_TIMER);
  713.         type HEADER_TYPE is
  714.                 (ACK, SYN, SYN_ACK, SEGMENT, SEG_ACK, FIN, RST, RST_ACK);
  715.         type STATES is (CLOSED,SYN_SENT,SYN_RECEIVED,ESTABLISHED,LISTEN,
  716.                 FIN_WAIT_1,CLOSE_WAIT,FIN_WAIT_2,CLOSING,TIME_WAIT,LAST_ACK);
  717.         type SECURE is array(1..9) of SIXTEEN_BITS ;
  718.                                         -- EACH ELEMENT OF THIS ARRAY IS ONE
  719.                                        -- OCTET OF SECURITY OPTION INFO. AFTER
  720.                                        -- THE TYPE AN LENGTH FIELD.
  721.         type TABLE_TYPE is array(1..TABLE_RANGE) of SIXTEEN_BITS ;
  722.         type TIME_ACTION is (NONE, RETRANSMIT_TIMEOUT, CONNECTION_TIMEOUT,
  723.                      TIME_WAIT_TIMEOUT);
  724.         subtype WND_PORT is SIXTEEN_BITS ; -- THE ACTUAL RANGE IS + OR - 2**16-1
  725.         subtype SEVEN_BITS is SIXTEEN_BITS ;
  726.         subtype TEN_BITS is SIXTEEN_BITS ;
  727.         subtype TWO_BITS is INTEGER;
  728.         subtype FOUR_OCTETS is THIRTYTWO_BITS ;
  729.         subtype TWO_OCTETS is SIXTEEN_BITS ;
  730.         subtype ONE_OCTET is SIXTEEN_BITS ;
  731.         subtype HALF_OCTET is SIXTEEN_BITS ;
  732.         subtype SIX_BITS is SIXTEEN_BITS ;
  733.         subtype ONE_BIT is SIXTEEN_BITS ;
  734.      
  735.         type BUFFER_POINTER is
  736.                 record
  737.                         BTYPE : SIXTEEN_BITS ;
  738.                         DATA_LEN : SIXTEEN_BITS  := 0;
  739.                         SOURCE_PORT : TWO_OCTETS;
  740.                         DESTINATION_PORT : TWO_OCTETS;
  741.                         SEQ_NUM : MODULAR;
  742.                         ACK_NUM : MODULAR;
  743.                         DATA_OFFSET : HALF_OCTET;
  744.                         RESERVED : SIX_BITS;
  745.                         URG_FLAG : ONE_BIT;
  746.                         ACK : ONE_BIT;
  747.                         PUSH_FLAG : ONE_BIT;
  748.                         RST : ONE_BIT;
  749.                         SYN : ONE_BIT;
  750.                         FIN : ONE_BIT;
  751.                         WINDOW : TWO_OCTETS;
  752.                         TCP_CSUM : TWO_OCTETS;
  753.                         URG_PTR : TWO_OCTETS;
  754.                         --OPTIONS FOR TCP
  755.                         TCP_OPTIONS : OPTION_TYPE
  756.                                            := (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  757.                                              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  758.                                              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  759.                                              0);
  760.                         DATA : BUFFER_AREA;
  761.                                 -- ARRAY OF SYSTEM.BYTES. FROM USER LEVEL.
  762.                 end record;
  763.         ERROR_TABLE_CLEAR : constant TABLE_TYPE
  764.                                 := (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  765.                                   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  766.                                   0, 0, 0, 0, 0, 0, 0);
  767.      
  768. --*********************QUEUE TYPES******************************
  769.         type QNAME is (TRANSMIT_QUEUE, TCP_RETRANSMIT_QUEUE,
  770.                TCP_RECEIVED_SEGMENT_QUEUE, RECEIVE_QUEUE,
  771.                PROCESSED_SEGMENTS_FOR_USER_QUEUE);
  772.      
  773.         type STD_Q_ITEM is
  774.                 record
  775.                         BUFFER : PACKED_BUFFER_PTR;
  776.                         UNPACKED_BUFFER : BUFFER_POINTER;
  777.                         LENGTH : SIXTEEN_BITS ;
  778.                 end record;
  779.         type STD_QUEUE_ELEMENT;
  780.         type STD_QUEUE_ELEMENT_POINTER is access STD_QUEUE_ELEMENT;
  781.         type STD_QUEUE_ELEMENT is
  782.                 record
  783.                         ELEMENT : STD_Q_ITEM;
  784.                         TIME : THIRTYTWO_BITS ; -- FOR THE RETRANSMISSION TIME.
  785.                         IP_ID : SIXTEEN_BITS ; -- THE IP ID FOR RETRANSMISSION
  786.                         NEXT : STD_QUEUE_ELEMENT_POINTER;
  787.                 end record;
  788.         type STD_HEAD_PTR is
  789.                 record
  790.                         ELEMENT_COUNT : SIXTEEN_BITS ;
  791.                         FIRST_ELEMENT : STD_QUEUE_ELEMENT_POINTER;
  792.                         LAST_ELEMENT : STD_QUEUE_ELEMENT_POINTER;
  793.                 end record;
  794.         type STD_QUEUE_HEAD_POINTERS is array(QNAME) of STD_HEAD_PTR;
  795. --*********************QUEUE TYPES******************************
  796.         NUMBER_OF_QUEUES : constant SIXTEEN_BITS  := 5;
  797.         MAX_QUEUE_SIZE : constant SIXTEEN_BITS  := 32;
  798.         INITIAL_QUEUE_HEADER : STD_HEAD_PTR := (0, NULL, NULL);
  799.         INITIAL_QUEUE_HEADER_POINTERS : STD_QUEUE_HEAD_POINTERS :=
  800.         (INITIAL_QUEUE_HEADER, INITIAL_QUEUE_HEADER, INITIAL_QUEUE_HEADER,
  801.          INITIAL_QUEUE_HEADER, INITIAL_QUEUE_HEADER);
  802.      
  803.         type TRANSMISSION_CONTROL_BLOCK;
  804.         type TCB_PTR is access TRANSMISSION_CONTROL_BLOCK;
  805.      
  806.         type TRANSMISSION_CONTROL_BLOCK is
  807.                 record
  808.                         TCP_CHANNEL_NAME : STRING(1..30) ;
  809.                         TCP_CHANNEL_PTR  : CHANNEL_TYPE ;
  810.                         STATE : STATES;
  811.                         CONNECTION_STATUS : STATUS_TYPE;
  812.                         LOCAL_PORT : SIXTEEN_BITS  := -1;
  813.                         LOCAL_NET : SIXTEEN_BITS  := 0;--TEMPORARY**
  814.                         LOCAL_HOST : SIXTEEN_BITS  := 1;-- TEMPORARY**
  815.                         SOURCE_ADDRESS : THIRTYTWO_BITS  := 1;-- TEMPORARY**
  816.                         DESTINATION_ADDRESS : THIRTYTWO_BITS ;
  817.                         FOREIGN_PORT : SIXTEEN_BITS  := -1;
  818.                         FOREIGN_HOST : THIRTYTWO_BITS  := -1;
  819.                         FOREIGN_NET : THIRTYTWO_BITS  := -1;
  820.                         SND_UNA : MODULAR;
  821.                         SND_UP : MODULAR;
  822.                         SND_NXT : MODULAR;
  823.                         SND_WND : SIXTEEN_BITS  := 190;
  824.                         RCV_NXT : MODULAR;
  825.                         PRECEDENCE : SIXTEEN_BITS  := 0;
  826.                         USER_NOTIFICATION : BOOLEAN := FALSE;
  827.                         SECURITY : SECURE := (0, 0, 0, 0, 0, 0, 0, 0, 0);
  828. --    SOURCE_PORT       : SIXTEEN_BITS ;   --   LIMITED BITS AND RANGE IS YET TO
  829.  BE DET
  830. --    ERMINED
  831.                         BUFFSIZE : SIXTEEN_BITS ;
  832.                         RCV_BUFFER_SIZE : WND_PORT;
  833.                         RCV_URGENT_POINTER : SIXTEEN_BITS ;
  834.                         SND_WL1 : MODULAR; -- SEQ NUM OF THE  LAST SEGMENT
  835.                                            --USED TO UPDATE SND.WND
  836.                         SND_WL2 : MODULAR;-- RECORDS THE ACK NUM OF THE
  837.                         --LAST SEGMENT USED TO
  838.                         -- UPDATE SND.WND. THIS VARIABLE AND THE ABOVE ONE
  839.                         -- PREVENT AN OLD SEGMENT FROM BEING USED TO UPDATE
  840.                         -- THE WINDOW.
  841.                         RCV_WINDOW : WND_PORT := 190;
  842.                         INIT_RCV_SEQ_NUM : MODULAR;
  843.                         ISS : MODULAR;-- THE INITIAL SEND SEQUENCE NUMBER (ISS)
  844.                         RETRANS_INTERVAL : SIXTEEN_BITS  := 30;
  845.                                 -- LAST ARE PROBABLY TEMPORARY
  846.                         MAX_RETRY_OF_PACKET : SIXTEEN_BITS  RANGE 0..8;
  847.                         PROTOCOL : SIXTEEN_BITS  := 0;
  848.                                 --(PTCL) UNKNOWN VALUE FOR TCP***
  849.                         ACTIVE_PASSIVE : ACKPASS;
  850.                         CLOSE_PENDING : BOOLEAN := FALSE;
  851.                                 -- FOR A CLOSE WITH DATA TO SEND.
  852.                         ERROR_TABLE : TABLE_TYPE := ERROR_TABLE_CLEAR;
  853.                         QHEADS : STD_QUEUE_HEAD_POINTERS
  854.                                 := INITIAL_QUEUE_HEADER_POINTERS;
  855.                         IDENT : SIXTEEN_BITS  := -1;
  856.                                 -- THE IDENTIFICATION NUMBER FOR AN IP DATAGRAM
  857.                         RETRANS_IDENT : SIXTEEN_BITS ;
  858.                         -- SUPPLIED BY THE QUEUE RETRANS ROUTINE FOR IP.
  859.                         NEXT_CONNECTION_TIMEOUT : THIRTYTWO_BITS ;
  860.                         NEXT_TIME_WAIT_TIMEOUT : THIRTYTWO_BITS ;
  861.                         CONNECTION_TIMEOUT : SIXTEEN_BITS  := 180;
  862.                                 -- DEFAULT IS 180 SECONDS OR 3 MINUTES
  863.                         CLOSE_OK_NOTIFICATION : BOOLEAN := FALSE;
  864.                         NEXT : TCB_PTR;
  865.         end record;
  866.      
  867. -- THE PSEUDO HEADER
  868.         SOURCE, DESTINATION : THIRTYTWO_BITS ;
  869.         PROTOCOL, IP_TOS : SIXTEEN_BITS ;
  870.         -- THE SECURITY OPTION FROM IP
  871.         SECURITY : SECURE;
  872.         SECURE_CLEAR : SECURE := (0, 0, 0, 0, 0, 0, 0, 0, 0);
  873.      
  874.         MAX_PORTS : constant SIXTEEN_BITS  := 4;
  875.         type PORT_LIST is array(1..MAX_PORTS) of SIXTEEN_BITS ;
  876.      
  877.         VALID_PORT_LIST : PORT_LIST := ( 20, 21, 23, 25);
  878.      
  879.         LEN, IDENT  : SIXTEEN_BITS ;
  880.         LCN_TCB_STATE : STATES;
  881.         TYPE_FLAG : HEADER_TYPE;
  882.         RESERVE : TCB_PTR;
  883.         BIT_SET : constant SIXTEEN_BITS  := 1;
  884.         LCN : TCB_PTR; -- THE GLOBAL LOCAL CONNECTION NAME
  885.         OPTIONS : OPTION_TYPE;
  886. -- THESE DECLARATIONS ARE CONSTANT IP PARAMETERS.
  887.         ONE_MINUTE : constant SIXTEEN_BITS  := 60; --   00111100
  888.         TOS : constant SIXTEEN_BITS  := 0;
  889.                 --      THE VALUE FROM TCP SPEC FOR THE IP AS THE LOWER
  890.                 --      LEVEL PROTOCOL.
  891.         TTL : constant SIXTEEN_BITS  := ONE_MINUTE;
  892.         DONT_FRAGMENT : constant SIXTEEN_BITS  := 1; -- WE ARE NOT A GATEWAY.
  893.         CLEAR : OPTION_TYPE
  894.                 := (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  895.                         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
  896.         TCP_SECURITY_OPTIONS : OPTION_TYPE
  897.                                 := (130,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  898.                                        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  899.                                        0,0,0,0,0,0,0,0,0,0,0,0);
  900.      
  901. end T_TCP_GLOBALS_DATA_STRUCTURES;
  902. --::::::::::::::
  903. --new_ncommu_.ada
  904. --::::::::::::::
  905. -----------------------------------------------------------------------
  906. --
  907. --         DoD Protocols    NA-00002-200       80-01037-100(-)
  908. --         E-Systems, Inc.  August 07, 1985
  909. --
  910. --         NEW_NCOMMU_.ADA       Author : Jim Baldo
  911. --
  912. -----------------------------------------------------------------------
  913. with STARLET;                           use STARLET;
  914. with IP_GLOBALS;                        use IP_GLOBALS;
  915. with BUFFER_DATA;                       use BUFFER_DATA;
  916. with T_TCP_GLOBALS_DATA_STRUCTURES;     use T_TCP_GLOBALS_DATA_STRUCTURES;
  917.      
  918.                 package WITH_ULP_COMMUNICATE is
  919.      
  920.         ---------------------------------------------------------------
  921.         --This implementation is for use with DEC/Ada compiler.      --
  922.         ---------------------------------------------------------------
  923.      
  924. -------------------------------------------------------------------------------
  925. --This package contains all the data abstractions and operations necessary   --
  926. --to support the User/TCP interface and TCP/lower-level interface.           --
  927. --The enumerated type ACTION represents the type of request primitive        --
  928. --that is sent by the upper layer or lower layer protocols.                  --
  929. -------------------------------------------------------------------------------
  930.      
  931. type STATUS_TYPE is ( CONNECTION_OPEN, CONNECTION_CLOSED, OPENING, CLOSING);
  932. type SECURITIES is array(1..9) of SIXTEEN_BITS ;
  933. type STATE_TYPE is ( CLOSED, SYN_SENT, SYN_RECEIVED, ESTABLISHED, LISTEN,
  934.                      FIN_WAIT_1, CLOSE_WAIT, FIN_WAIT_2, CLOSING, TIME_WAIT,
  935.                      LAST_ACK); -- same as in TCPGLB
  936.      
  937. type STATUS_RECORD is
  938.  record
  939.   SOURCE_PORT : SIXTEEN_BITS ;
  940.   SOURCE_ADDRESS : THIRTYTWO_BITS ;
  941.   DESTINATION_PORT : SIXTEEN_BITS ;
  942.   DESTINATION_ADDRESS : THIRTYTWO_BITS ;
  943.   CONNECTION_STATE : STATE_TYPE;
  944.   STATUS : STATUS_TYPE;
  945.   LOCAL_RCV_WINDOW : SIXTEEN_BITS ;
  946.   REMOTE_RCV_WINDOW : SIXTEEN_BITS ;
  947.   OCTETS_ON_RETRANSMIT_QUEUE : SIXTEEN_BITS ;
  948.   DATA_WAITING_FOR_ULP : SIXTEEN_BITS ;
  949.   URGENT_STATE : BOOLEAN;
  950.   PRECEDENCE : SIXTEEN_BITS ;
  951.   SECURITY : SECURITIES;
  952.   ULP_TIMEOUT : SIXTEEN_BITS ;
  953. end record;
  954.      
  955. subtype LCN_TYPE is TCB_PTR;
  956.      
  957. type LCN_PTR_TYPE is
  958.  record
  959.   LCN_PTR : LCN_TYPE := null;
  960.   CHANNEL_PTR : CHANNEL_TYPE ;
  961.   CHANNEL_NAME : STRING(1..30) ;
  962.  end record;
  963.      
  964. -------------------------------------------------------------------------------
  965. -- THE MESSAGE NUMBERS FOR THE USER AND THEIR MEANING FOLLOW                 --
  966. -- -1 : NO USER ACTION                                                       --
  967. --                                                                           --
  968. -- 2: CONNECTION ILLEGAL                                                     --
  969. -- 3: CONNECTION DOES NOT EXIST                                              --
  970. -- 4: FOREIGN SOCKET UNSPECIFIED                                             --
  971. -- 5: INSUFFICIENT RESOURCES                                                 --
  972. -- 6: CONNECTION CLOSING                                                     --
  973. -- 7: URGENT DATA                                                            --
  974. -- 8: OK ON ABORT                                                            --
  975. -- 9: PRECEDENCE NOT ALLOWED                                                 --
  976. -- 10: BUFFER FOR USER                                                       --
  977. -- 11: SECURITY/COMPARTMENT ILLEGAL                                          --
  978. -- 12: CONNECTION EXISTS                                                     --
  979. -- 14: RETURN LCN                                                            --
  980. -- 15: TCB POINTER AND STATE                                                 --
  981. -- 16: CONNECTION RESET                                                      --
  982. -- 17: CONNECTION REFUSED                                                    --
  983. -- 18: OK ON CLOSE                                                           --
  984. -- 19: PUSHED BUFFER FOR USER                                                --
  985. -- 20: OUT OF BUFFERS                                                        --
  986. -- 21: COULDN'T DO RESET                                                     --
  987. -- 22: IP OVERLOADED.                                                        --
  988. -- 23: CONNECTION IS NOW OPEN.                                               --
  989. -------------------------------------------------------------------------------
  990.      
  991. type USER_MESSAGE(MESSAGE_NUMBER : SIXTEEN_BITS  := 0) is
  992.   record
  993.    LOCAL_CONNECTION_NAME : LCN_PTR_TYPE;
  994.     case MESSAGE_NUMBER is
  995.       when 10 | 19  =>
  996.                 DATA_BUFFER : PACKED_BUFFER_PTR;
  997.       when 15 =>
  998.                 -- STATUS PARAMETERS
  999.                 STATUS_PARAMS : STATUS_RECORD;
  1000.       when others => null;
  1001.     end case;
  1002.   end record;
  1003.      
  1004. type ACTION is (OPEN,SEND,RECEIVE,ABOR_T,CLOSE,STATUS,DATA_FROM_IP,
  1005.                 TIMER_TIMEOUT, ERROR_MESSAGE, TIMEOUT_IN_RETRANS_QUEUE,
  1006.                 TIMEOUT_IN_TIME_WAIT, NO_TCP_ACTION);
  1007.      
  1008. subtype SECURITY_OPTION_ARRAY is SIXTEEN_BITS range 1..9;
  1009.      
  1010. type SECURITY_OPTION_TYPE is array( SECURITY_OPTION_ARRAY ) of SIXTEEN_BITS ;
  1011.                                         -- EACH ELEMENT CONTAINS AN
  1012.                                              -- OCTET OF SECURITY DATA.
  1013. type TCP_OPTION_TYPE is array(1..50) of SIXTEEN_BITS ;
  1014.      
  1015. type ACKPASS is (PASSIVE, ACTIVE);
  1016.      
  1017. type TIMER_PARAMS is
  1018.         record
  1019.                 MESSAGE_NUMBER : SIXTEEN_BITS ;
  1020.         end record;
  1021.      
  1022. type TIME_WAIT_PARAMS is
  1023.         record
  1024.          LOCAL_CONNECTION_NAME : LCN_PTR_TYPE;
  1025.         end record;
  1026.      
  1027. type OPEN_PARAMS is
  1028.  record
  1029.   LOCAL_PORT, FOREIGN_PORT : SIXTEEN_BITS ;
  1030.   FOREIGN_NET_HOST : THIRTYTWO_BITS ;
  1031.   ACTIVE_PASSIVE : ACKPASS;
  1032.   BUFFER_SIZE, TIMEOUT : SIXTEEN_BITS ;
  1033.   LOCAL_CONNECTION_NAME : LCN_PTR_TYPE;
  1034.   SECURITY, PRECEDENCE : SIXTEEN_BITS ;
  1035.   OPTIONS : TCP_OPTION_TYPE;
  1036. end record;
  1037.      
  1038. type STATUS_PARAMS is
  1039.  record
  1040.   LOCAL_CONNECTION_NAME : LCN_PTR_TYPE;
  1041.  end record;
  1042.      
  1043. type ERROR_PARAMS is
  1044.  record
  1045.   ERROR_INDICATOR : SIXTEEN_BITS ; -- THIS MAY CHANGE.
  1046.  end record;
  1047.      
  1048. type RETRANS_PARAMS is
  1049.  record
  1050.   QUEUE_NUM : SIXTEEN_BITS ;
  1051.  end record;
  1052.      
  1053. type SEG_ARRIVE_PARAMS is
  1054.  record
  1055.   BUFPTR : PACKED_BUFFER_PTR;
  1056.   BYTE_COUNT : SIXTEEN_BITS ;
  1057.   SOURCE_ADDRESS, DESTINATION_ADDRESS : THIRTYTWO_BITS ;
  1058.   PROTOCOL : SIXTEEN_BITS ;
  1059.   TOS : SIXTEEN_BITS ;
  1060.   SECURITY : SECURITY_OPTION_TYPE;
  1061.  end record;
  1062.      
  1063. type SEND_PARAMS is
  1064.  record
  1065.   LOCAL_CONNECTION_NAME : LCN_PTR_TYPE;
  1066.   BUFPTR : PACKED_BUFFER_PTR;
  1067.   BYTE_COUNT, PUSH_FLAG, URG_FLAG, TIMEOUT : SIXTEEN_BITS ;
  1068. end record;
  1069.      
  1070. type RECEIVE_PARAMS is
  1071.  record
  1072.   LOCAL_CONNECTION_NAME : LCN_PTR_TYPE;
  1073.   BUFPTR : PACKED_BUFFER_PTR;
  1074.   BYTE_COUNT : SIXTEEN_BITS ;
  1075.  end record;
  1076.      
  1077. type ABORT_CLOSE_PARAMS is
  1078.  record
  1079.   LOCAL_CONNECTION_NAME : LCN_PTR_TYPE;
  1080.  end record;
  1081.      
  1082. --TCP responds to message which are associated with a type of event.  The
  1083. --data abstraction of MESSAGE creates the appropiate message for the given
  1084. --event.
  1085. type MESSAGE(EVENT : ACTION := OPEN) is
  1086.  record
  1087.   case EVENT is
  1088.    when   ABOR_T |  CLOSE
  1089.         => ABORT_CLOSE_PARAMETERS : ABORT_CLOSE_PARAMS;
  1090.      
  1091.    when DATA_FROM_IP
  1092.         => DATA_FROM_IP_PARAMETERS : SEG_ARRIVE_PARAMS;
  1093.      
  1094.    when RECEIVE
  1095.         => RECEIVE_PARAMETERS : RECEIVE_PARAMS;
  1096.      
  1097.    when SEND => SEND_PARAMETERS : SEND_PARAMS;
  1098.      
  1099.    when OPEN  => OPEN_PARAMETERS : OPEN_PARAMS;
  1100.      
  1101.    when STATUS
  1102.               => STATUS_PARAMETERS : STATUS_PARAMS;
  1103.      
  1104.    when  TIMEOUT_IN_TIME_WAIT
  1105.               =>  TIME_WAIT_PARAMETERS : TIME_WAIT_PARAMS;
  1106.      
  1107.    when TIMEOUT_IN_RETRANS_QUEUE
  1108.               => RETRANS_PARAMETERS     : RETRANS_PARAMS;
  1109.      
  1110.    when ERROR_MESSAGE
  1111.               => ERROR_PARAMETERS : ERROR_PARAMS;
  1112.      
  1113.    when TIMER_TIMEOUT
  1114.               => TIMER_PARAMETERS : TIMER_PARAMS;
  1115.      
  1116.    when NO_TCP_ACTION => NULL;
  1117.  end case;
  1118. end record;
  1119.      
  1120. procedure  WAIT_FOR_TCP_MESSAGE(USER_MESS : in out USER_MESSAGE);
  1121.      
  1122.         --This procedure obtains a message in a queue for the ULP from TCP.
  1123.      
  1124. procedure MESSAGE_FOR_TCP( TCP_MESSAGE : in out MESSAGE;
  1125.                            REQUEST_OK : out BOOLEAN ) ;
  1126.      
  1127.         --This procedure is used by ULP to put a message  for TCP.
  1128.      
  1129. end WITH_ULP_COMMUNICATE;
  1130. --::::::::::::::
  1131. --new_ncommu.ada
  1132. --::::::::::::::
  1133. -----------------------------------------------------------------------
  1134. --
  1135. --         DoD Protocols    NA-00002-200       80-01038-100(-)
  1136. --         E-Systems, Inc.  August 07, 1985
  1137. --
  1138. --         NEW_NCOMMU.ADA       Author : Jim Baldo
  1139. --
  1140. -----------------------------------------------------------------------
  1141. with CONDITION_HANDLING ;            use CONDITION_HANDLING ;
  1142. with UNCHECKED_CONVERSION ;
  1143. with TEXT_IO ;                    use TEXT_IO;
  1144. with TASKING_SERVICES ;                use TASKING_SERVICES ;
  1145. with SYSTEM ;                    use SYSTEM ;
  1146.  
  1147.         package    body WITH_ULP_COMMUNICATE is
  1148.  
  1149. package CONVERT_INT_16_TO_STRING is new INTEGER_IO( SIXTEEN_BITS ) ;
  1150. package CONVERT_INT_32_TO_STRING is new INTEGER_IO( THIRTYTWO_BITS ) ;
  1151.  
  1152. MBX_STATUS  : COND_VALUE_TYPE ;
  1153. TO_TCP_CHANNEL : CHANNEL_TYPE ;
  1154. XMESSAGE : MESSAGE;
  1155.  
  1156. type XUSER_MESSAGE_TYPE is record
  1157.   THE_USER_MESSAGE : USER_MESSAGE ;
  1158.   THE_BUFFER       : PACKED_BUFFER ;
  1159.   THE_STATUS_PARAMS : STATUS_RECORD ;
  1160. end record ;
  1161.  
  1162. type XMESSAGE_TYPE  is record
  1163.   THE_TCP_MESSAGE : MESSAGE ;
  1164.   THE_BUFFER      : PACKED_BUFFER ;
  1165. end record ;
  1166.  
  1167.  
  1168.  
  1169. function PHYSICAL_ADDRESS is new 
  1170.            UNCHECKED_CONVERSION ( ADDRESS, UNSIGNED_LONGWORD ) ;
  1171.  
  1172. procedure  WAIT_FOR_TCP_MESSAGE(USER_MESS : in out USER_MESSAGE) is
  1173.  
  1174.  
  1175. XUSER_MESSAGE : XUSER_MESSAGE_TYPE ;
  1176. BUFFER : PACKED_BUFFER_PTR ;
  1177.  
  1178. begin
  1179.   TASK_QIOW ( STATUS  => MBX_STATUS ,
  1180.               CHAN    => USER_MESS.LOCAL_CONNECTION_NAME.CHANNEL_PTR ,
  1181.               FUNC    => IO_READVBLK ,
  1182.               P1      => PHYSICAL_ADDRESS ( XUSER_MESSAGE'ADDRESS ) ,
  1183.               P2      => UNSIGNED_LONGWORD (XUSER_MESSAGE'SIZE/8 ) ) ;
  1184.  USER_MESS := XUSER_MESSAGE.THE_USER_MESSAGE ;
  1185.  case USER_MESS.MESSAGE_NUMBER is
  1186.    when 10 | 19 =>
  1187.      BUFFGET( BUFFER, 1);
  1188.      USER_MESS.DATA_BUFFER := BUFFER ;
  1189.      USER_MESS.DATA_BUFFER.ALL := XUSER_MESSAGE.THE_BUFFER ;
  1190.    when 15 => 
  1191.      USER_MESS.STATUS_PARAMS := XUSER_MESSAGE.THE_STATUS_PARAMS ;
  1192.    when 8 | 16 | 18 | 24 => --connection closed: aborted; reset; 
  1193.                             --connection timeout; delete mailbox
  1194.      DELMBX( STATUS  => MBX_STATUS ,
  1195.              CHAN    => USER_MESS.LOCAL_CONNECTION_NAME.CHANNEL_PTR ) ;
  1196.    when others =>
  1197.      null ;
  1198.    end case ;
  1199. end WAIT_FOR_TCP_MESSAGE;
  1200.  
  1201. procedure MESSAGE_FOR_TCP( TCP_MESSAGE : in out MESSAGE;
  1202.                            REQUEST_OK : out BOOLEAN) is
  1203.  
  1204. CHANNEL : CHANNEL_TYPE ;
  1205. FOREIGN_NET_HOST : STRING(1..5) ;
  1206. FOREIGN_PORT : STRING(1..5) ;
  1207. LOCAL_NET_HOST : STRING(1..5) ;
  1208. LOCAL_PORT : STRING(1..5) ;
  1209. CHANNEL_NAME : STRING(1..30) ;
  1210. XTCP_MESSAGE : XMESSAGE_TYPE ;
  1211.  
  1212. begin
  1213.  if TCP_MESSAGE.EVENT = OPEN then
  1214.      -- Create a mailbox 
  1215.      CHANNEL_NAME := "                              " ;
  1216.      FOREIGN_NET_HOST := "     " ;
  1217.      FOREIGN_PORT := "     " ;
  1218.      LOCAL_NET_HOST := "     " ;
  1219.      LOCAL_PORT := "     " ;
  1220.      CONVERT_INT_32_TO_STRING.PUT ( FOREIGN_NET_HOST ,
  1221.                                     TCP_MESSAGE.OPEN_PARAMETERS.
  1222.                                                  FOREIGN_NET_HOST ) ;
  1223.      CONVERT_INT_16_TO_STRING.PUT ( FOREIGN_PORT ,
  1224.                                     TCP_MESSAGE.OPEN_PARAMETERS.
  1225.                                                  FOREIGN_PORT ) ;
  1226.      CONVERT_INT_32_TO_STRING.PUT ( LOCAL_NET_HOST ,
  1227.                                     WHOIAM ) ;
  1228.      CONVERT_INT_16_TO_STRING.PUT ( LOCAL_PORT ,
  1229.                                     TCP_MESSAGE.OPEN_PARAMETERS.
  1230.                                                  LOCAL_PORT ) ;
  1231.      CHANNEL_NAME(1..3) := "MBX";
  1232.      CHANNEL_NAME(4..8) := FOREIGN_NET_HOST ;
  1233.      CHANNEL_NAME(9..13) := FOREIGN_PORT ;
  1234.      CHANNEL_NAME(14..18) := LOCAL_NET_HOST ;
  1235.      CHANNEL_NAME(19..23) := LOCAL_PORT ;
  1236.      CREMBX( STATUS => MBX_STATUS ,
  1237.              PRMFLG => true       ,             -- permanent
  1238.              CHAN   => CHANNEL    , 
  1239.              MAXMSG => XUSER_MESSAGE_TYPE'SIZE/8,        --size of message
  1240.              BUFQUO => 10 * XUSER_MESSAGE_TYPE'SIZE/8, --size of queue
  1241.              LOGNAM => CHANNEL_NAME ) ;
  1242.      if NOT SUCCESS(MBX_STATUS) then
  1243.        PUT_LINE("Could not create tcp channel") ;
  1244.      else
  1245.       TCP_MESSAGE.OPEN_PARAMETERS.LOCAL_CONNECTION_NAME.CHANNEL_PTR := 
  1246.                                                                 CHANNEL ;
  1247.       TCP_MESSAGE.OPEN_PARAMETERS.LOCAL_CONNECTION_NAME.CHANNEL_NAME := 
  1248.                                                              CHANNEL_NAME;
  1249.       XTCP_MESSAGE.THE_TCP_MESSAGE := TCP_MESSAGE ;
  1250.       TASK_QIOW ( STATUS  => MBX_STATUS,
  1251.                   CHAN    => TO_TCP_CHANNEL ,
  1252.                   FUNC    => IO_WRITEVBLK + IO_M_NOW,
  1253.                   P1      => PHYSICAL_ADDRESS (XTCP_MESSAGE'ADDRESS),
  1254.                   P2      => UNSIGNED_LONGWORD (XTCP_MESSAGE'SIZE/8 ) );
  1255.       end if;
  1256.      else
  1257.       XTCP_MESSAGE.THE_TCP_MESSAGE := TCP_MESSAGE ;
  1258.       if TCP_MESSAGE.EVENT = SEND then
  1259.         XTCP_MESSAGE.THE_BUFFER  := TCP_MESSAGE.SEND_PARAMETERS.BUFPTR.ALL ;
  1260.         BUFFREE( TCP_MESSAGE.SEND_PARAMETERS.BUFPTR, 0);
  1261.       elsif TCP_MESSAGE.EVENT = RECEIVE then
  1262.         BUFFREE( TCP_MESSAGE.RECEIVE_PARAMETERS.BUFPTR, 1);
  1263.       end if ;
  1264.       TASK_QIOW ( STATUS  => MBX_STATUS,
  1265.                   CHAN    => TO_TCP_CHANNEL ,
  1266.                   FUNC    => IO_WRITEVBLK + IO_M_NOW,
  1267.                   P1      => PHYSICAL_ADDRESS (XTCP_MESSAGE'ADDRESS),
  1268.                   P2      => UNSIGNED_LONGWORD (XTCP_MESSAGE'SIZE/8 ) );
  1269.  
  1270.  
  1271.      end if ;
  1272. REQUEST_OK := SUCCESS (MBX_STATUS) ;
  1273. EXCEPTION
  1274.   WHEN OTHERS => 
  1275.     PUT_LINE("EXCEPTION IN MESSAGE_FOR_TCP") ;
  1276. end MESSAGE_FOR_TCP;
  1277.  
  1278.  
  1279. begin
  1280.      CREMBX( STATUS => MBX_STATUS ,
  1281.              PRMFLG => true       ,             -- permanent
  1282.              CHAN   => TO_TCP_CHANNEL, 
  1283.              MAXMSG => XMESSAGE'SIZE,        --size of message
  1284.              BUFQUO => 10 * XMESSAGE'SIZE ,  --size of queue
  1285.              LOGNAM => "TO_TCP_CHANNEL") ;      -- fixed name
  1286.      if NOT SUCCESS(MBX_STATUS) then
  1287.        PUT_LINE("Could not assign tcp channel") ;
  1288.      end if ;
  1289. END WITH_ULP_COMMUNICATE;
  1290.