home *** CD-ROM | disk | FTP | other *** search
/ Mega CD-ROM 1 / megacd_rom_1.zip / megacd_rom_1 / NETWORK / PCRTE222.ZIP / SRC.ZIP / BOOTP.INC < prev    next >
Text File  |  1991-12-11  |  11KB  |  322 lines

  1. ;;************************************************************************* 
  2. ;;                         bootp.inc       bootp.inc
  3. ;;*************************************************************************
  4. ;;
  5. ;;  Copyright (C) 1989 Northwestern University, Vance Morrison
  6. ;;
  7. ;;
  8. ;; Permission to view, compile, and modify for LOCAL (intra-organization) 
  9. ;; USE ONLY is hereby granted, provided that this copyright and permission 
  10. ;; notice appear on all copies.  Any other use by permission only.
  11. ;;
  12. ;; Northwestern University makes no representations about the suitability 
  13. ;; of this software for any purpose.  It is provided "as is" without expressed 
  14. ;; or implied warranty.  See the copywrite notice file for complete details.
  15. ;;
  16. ;;*****************************************************************************
  17. ;;
  18. ;; AUTHOR: Vance Morrison
  19. ;;****************************************************************************
  20. ;; definition of Bootp structure
  21.  
  22. BOOTPC = 44h                          ;; udp port for server responces 
  23. BOOTPS = 43h                          ;; udp port for client requests
  24.  
  25. ;;****************************************************************************
  26. ;; definition of BOOTP structure
  27.  
  28. BOOTP_REQUEST = 1
  29. BOOTP_REPLY = 2
  30.  
  31. MYID = 3845                                     ;; a unique ID
  32.  
  33. bootp           STRUC
  34.     bootp_op            DB 0                ;; operation
  35.     bootp_htype         DB 0                ;; hardware type (ethernet = 1)
  36.     bootp_hlen          DB 0                ;; hardware address len
  37.     bootp_hops          DB 0                ;; hop count (start at 0)
  38.     bootp_xid           DD 0                ;; random transaction id
  39.     bootp_secs          DW 0
  40.     bootp_unused        DW 0
  41.     bootp_ciaddr        DD 0                ;; client IP address
  42.     bootp_yiaddr        DD 0                ;; client IP address (servers reply)
  43.     bootp_siaddr        DD 0                ;; server IP address
  44.     bootp_giaddr        DD 0                ;; gateway IP address
  45.     bootp_chaddr        DB 16 DUP (0)       ;; client harware address
  46.     bootp_sname         DB 64 DUP (0)       ;; server name 
  47.     bootp_file          DB 128 DUP (0)      ;; file to boot from 
  48.     bootp_magic         DD 0                ;; magic number 
  49.     bootp_vendor        DB 60 DUP (0)       ;; vendor specific stuff
  50. bootp           ENDS
  51.  
  52.  
  53. ;;******************************************************************************
  54. ;;  BOOTP_DECLARE name, udp, dls, udp_sock1, udp_sock2
  55. ;;       BOOTP_DECLARE delcares a BOOTP listener called 'name'.  'udp'
  56. ;;       is a udp object, 'udp_sock1', 'udp_sock2' are two unique numbers
  57. ;;       that can but used to create sockets with the udp object.  The
  58. ;;       Data link objects are assumed to be 1..<dls>.
  59. ;;
  60. BOOTP_DECLARE   MACRO  name, udp, dls
  61.     .errb <dls>
  62.  
  63.     .DATA
  64.     bootp_&name&_udp = udp
  65.     bootp_&name&_dls = dls
  66.     bootp_&name&_my_ip = dl_ip_1_ip         ;; make equal to any of my addresses
  67.     bootp_&name&_request_sock = (name*100+1)
  68.     bootp_&name&_reply_sock = (name*100+2)
  69.     global bootp_&name&_forward:dword
  70.     .CODE
  71.  
  72.     UDP_SOCK_DECLARE %bootp_&name&_request_sock, %bootp_&name&_udp, BOOTPS
  73.     UDP_SOCK_DECLARE %bootp_&name&_reply_sock, %bootp_&name&_udp, BOOTPC
  74. ENDM
  75.  
  76.  
  77. ;;******************************************************************************
  78. ;;   BOOTP_DEFINE   my_ip, forward_host
  79. ;;       BOOTP_DEFINE sets aside the memory and acutally does the 
  80. ;;       initialization for the bootp object 'name'.  'forward_host'
  81. ;;       is the address of a IP address to forward any bootp request to.  
  82. ;;       This address can be a directed broadcast.  
  83. ;;
  84. BOOTP_DEFINE   MACRO   name, forward_host
  85.     local around, request_code, reply_code, drop, tftp_around, tftp_request
  86.     .errb <forward_host>
  87.  
  88.     .DATA
  89.     bootp_&name&_forward DD ?
  90.  
  91.     .CODE
  92.     jmp around          ;; declare code objects
  93.         request_code:
  94.         reply_code:
  95.             BOOTP_REQUEST_PACKET_in_AX_BX_CX_ES name, drop
  96.             BOOTP_REPLY_PACKET_in_AX_BX_CX_ES name, drop
  97.             drop:
  98.             RET
  99.     around:
  100.  
  101.     ;; this code should be thrown out when CISCO do bootp properly
  102.     TFTP_PORT = 45H
  103.     jmp tftp_around
  104.         tftp_request:
  105.         TFTP_REQUEST_PACKET_in_AX_BX_CX_ES name, %myip
  106.         RET
  107.     tftp_around:
  108.     UDP_R_READ %bootp_&name&_udp, TFTP_PORT, tftp_request
  109.     ;; end of KLUDGE code (dont forget to trough out TFTP_REQUEST_PACKET too)
  110.  
  111.     cmp word ptr forward_host, 0
  112.     jz done
  113.     cmp word ptr forward_host+2, 0
  114.     jz done
  115.  
  116.         mov AX, word ptr forward_host               ;; save the forwarding host
  117.         mov word ptr bootp_&name&_forward, AX
  118.         mov AX, word ptr forward_host+2
  119.         mov word ptr bootp_&name&_forward+2, AX
  120.  
  121.         UDP_SOCK_DEFINE %bootp_&name&_request_sock, request_code
  122.         UDP_SOCK_DEFINE %bootp_&name&_reply_sock, reply_code
  123.     done:
  124. ENDM
  125.  
  126.  
  127. ;;******************************************************************************
  128. ;;   BOOTP_REQUEST_PACKET   name
  129. ;;
  130. BOOTP_REQUEST_PACKET_in_AX_BX_CX_ES MACRO name, drop
  131.     local done
  132.     .errb <drop>
  133.  
  134.         ;; since bootp requests are often sent to a broadcast address,
  135.         ;; I am a bit paranoid about the packets I receive.  Basicly
  136.         ;; I ONLY forward requests from that poor sap that doesn't know
  137.         ;; his IP address.  Anyone else I assume can boot without my help 
  138.     mov SI, BX
  139.     cmp byte ptr ES:[SI+bootp_op], BOOTP_REQUEST
  140.     jnz done
  141.         mov AL, ES:[SI+bootp_hops]
  142.         cmp AL, 2
  143.         ja drop
  144.         inc AL
  145.         mov ES:[SI+bootp_hops], AL
  146.  
  147.         mov AX, word ptr ES:[SI+bootp_giaddr]       ;; is the gateway filled in
  148.         or AX, AX
  149.         jnz drop
  150.         mov AX, word ptr ES:[SI+bootp_giaddr+2]     ;; is the gateway filled in
  151.         or AX, AX
  152.         jnz drop
  153.  
  154.         mov AX, word ptr bootp_&name&_my_ip         ;; fill in me as gateway
  155.         mov word ptr ES:[SI+bootp_giaddr], AX
  156.         mov AX, word ptr bootp_&name&_my_ip+2
  157.         mov word ptr ES:[SI+bootp_giaddr+2], AX
  158.  
  159.         mov AX, word ptr bootp_&name&_forward
  160.         mov BX, word ptr bootp_&name&_forward+2
  161.         or AX, AX
  162.         jz drop
  163.         or BX, BX
  164.         jz drop
  165.         mov CX, size bootp
  166.         mov DX, BOOTPS
  167.  
  168.         push SI
  169.         push ES
  170.         UDP_SOCK_W_ACCESS_in_AX_BX_CX_DX_out_AX_DI_ES %bootp_&name&_reply_sock
  171.         pop  DX
  172.         pop  SI
  173.         or AX, AX
  174.         jnz drop
  175.  
  176.         mov BX, DS              ;; save DS
  177.         mov DS, DX
  178.         mov CX, size bootp
  179.         rep                     ;; copy the packet
  180.         movsb
  181.         mov DS, BX              ;; restore DS
  182.  
  183.         mov CX, size bootp
  184.         UDP_SOCK_W_WRITE_in_CX %bootp_&name&_reply_sock
  185.     done:
  186. ENDM
  187.  
  188.  
  189. ;;******************************************************************************
  190. ;;   BOOTP_REPLY_PACKET   name
  191. ;;
  192. BOOTP_REPLY_PACKET_in_AX_BX_CX_ES MACRO name, drop
  193.     local done, sendit
  194.     .errb <drop>
  195.  
  196.     mov SI, BX
  197.     cmp ES:[SI+bootp_op], BOOTP_REPLY
  198.     jnz done
  199.  
  200.     mov AX, word ptr ES:[SI+bootp_yiaddr]       ;; load up the destination
  201.     mov BX, word ptr ES:[SI+bootp_yiaddr+2]     
  202.  
  203.     IRP idx,<1,2,3,4,5,6,7,8>
  204.     if idx le bootp_&name&_dls
  205.         ;; send it out the right interface
  206.     BOOTP_GET_BROADCAST_DL_in_AX_BX_out_AX_BX_const_SI_ES name, idx, sendit
  207.     endif
  208.     endm
  209.     jmp drop
  210.  
  211.     sendit:
  212.     mov CX, size bootp
  213.     mov DX, BOOTPC
  214.  
  215.     push SI
  216.     push ES
  217.     UDP_SOCK_W_ACCESS_in_AX_BX_CX_DX_out_AX_DI_ES %bootp_&name&_request_sock
  218.     pop  DX
  219.     pop  SI
  220.     or AX, AX
  221.     jnz drop
  222.  
  223.     mov BX, DS              ;; save DS
  224.     mov DS, DX
  225.     mov CX, size bootp
  226.     rep                     ;; copy the packet
  227.     movsb
  228.     mov DS, BX              ;; restore DS
  229.  
  230.     mov CX, size bootp
  231.     UDP_SOCK_W_WRITE_in_CX %bootp_&name&_request_sock
  232. done:
  233. ENDM
  234.  
  235.  
  236.  
  237. ;;************************************************************************* 
  238. ;; BOOTP_GET_BROADCAST checks to see if the address in AX,BX is on the
  239. ;; local dl 'mydl' and if it is loads AX,BX with the broadcast address 
  240. ;; for 'mydl' and jumps to 'success'.  AX, BX is not on 'mydl' then
  241. ;; AX,BX, is unchanged
  242. ;;
  243. BOOTP_GET_BROADCAST_DL_in_AX_BX_out_AX_BX_const_SI_ES MACRO name, mydl, success
  244.     local done
  245.     .errb <success>
  246.  
  247.     cmp AX, word ptr dl_ip_&mydl&_net
  248.     jnz done
  249.     mov CX, BX
  250.     and CX, word ptr dl_ip_&mydl&_mask+2
  251.     cmp CX, word ptr dl_ip_&mydl&_net+2
  252.     jnz done
  253.     mov BX, word ptr dl_ip_&mydl&_broad+2
  254.     jmp success
  255.     done:
  256. ENDM
  257.  
  258.  
  259. ;;******************************************************************************
  260. ;; TFTP_REQUEST_PACKET MACRO name
  261. ;; tftp_request_packet is a KLUGE that will make CISCO's boot properly though
  262. ;; a gateway.  You see Cisco's are brain dead and after they receive the 
  263. ;; bootp reply they ignore the fact that they now have the servers address
  264. ;; and try to TFTP their configuration file by broadcasting a TFTP command
  265. ;; on the local network.  Here i simply act as a repeater of these packets
  266. ;;
  267. TFTP_REQUEST_PACKET_in_AX_BX_CX_ES MACRO bootp, ip
  268.     local done
  269.     .errb <ip>
  270.  
  271.         ;; much of this is TOTALLY ILLEGAL, and breaks every rule in the
  272.         ;; book.  It essentially has the effect of sending out the
  273.         ;; IP packet as if it came from a source other than here
  274.         ;; (in this case it acts as if it came from the original
  275.         ;; sender).  I only do this because I really hope that this
  276.         ;; code will only be needed for a short time.
  277.     mov SI, BX
  278.     sub SI, size udp
  279.     add CX, size udp
  280.     mov AX, word ptr bootp_&bootp&_forward
  281.     or AX, AX
  282.     jz done
  283.     mov BX, word ptr bootp_&bootp&_forward+2
  284.     mov DL, UDP_PROTO
  285.     push SI
  286.     push ES
  287.     push CX
  288.     IP_W_ACCESS_in_AX_BX_CX_DL_out_AX_DI_ES ip
  289.     pop CX
  290.     pop DX
  291.     pop SI
  292.     or AX, AX
  293.     jnz done
  294.  
  295.     mov BX, ES      ;; save ES
  296.     mov ES, DX      ;; restore the input ES
  297.  
  298.     sub SI, 20
  299.     mov AX, word ptr ES:[SI+ip_src]
  300.     mov word ptr ip_&ip&_data.ip_write_src, AX
  301.     mov AX, word ptr ES:[SI+ip_src+2]
  302.     mov word ptr ip_&ip&_data.ip_write_src+2, AX
  303.     add SI, 20
  304.  
  305.     mov ES, BX      ;; restore ES
  306.  
  307.     mov BX, DS      ;; save DS
  308.     mov DS, DX      ;; DS = input ES
  309.  
  310.     mov DX, CX      ;; save CX
  311.     inc CX
  312.     shr CX, 1
  313.     rep
  314.     movsw
  315.     mov DS, BX      ;; restore DS
  316.     mov CX, DX      ;; restore CX
  317.  
  318.     IP_W_WRITE_in_CX ip
  319.     done:
  320. ENDM
  321.  
  322.