home *** CD-ROM | disk | FTP | other *** search
/ Super Net 1 / SUPERNET_1.iso / PC / OTROS / MSDOS / PKTDRVR / PDCLK207.ZIP / PDCLKSRC / TBLBUILD.ASM < prev   
Encoding:
Assembly Source File  |  1993-10-09  |  25.7 KB  |  1,440 lines

  1. ;========================================================================
  2.  
  3. ; Copyright (C) 1991 by Jan.Engvald@ldc.lu.se, see file COPYING.
  4.  
  5. InAdrArpa    db    7,"in-addr",4,"arpa",0
  6. Qtype        dw    0c00h
  7. Qclass        dw    0100h
  8. InAdrArpaLen    equ    $-InAdrArpa
  9.  
  10. k16        dw    16
  11. TblSize     dw    16
  12. TblSizeLast    dw    16*16
  13. TblLineLen    dw    72            ; (new format is 81)
  14. TblActive    dw    0
  15. TblActLast    dw    0
  16. TblWrNext    dw    0
  17. TblIpProbe    dw    130+256*235, 132+256*0
  18. TblProbeNext    dw    0
  19. TblProbIntvl    dw    9
  20. TblSeen     dw    0, 0
  21.  
  22. TmpTbl        dw    0, 0, 0, 0, 0, 0, 0
  23.  
  24. SegmData    equ    $
  25. SegIpHwTbl    dw    0
  26. SegHwIpTbl    dw    0
  27. SegmNamTbl    dw    0
  28. SegmNamTbl2    dw    0
  29. TableSegs    equ    ($-SegmData)/2
  30.  
  31. Slot        struc                ; structure for SegIpHwTbl
  32. SlotIp        dw    0, 0
  33. SlotHw        dw    0, 0, 0
  34. SlotDupl    db    '>'
  35. SlotPend    db    'p'
  36. SlotNamPtr    dw    0
  37. SlotSeen    dw    0
  38. Slot        ends
  39.  
  40. Handle        dw    -1
  41. if DEBUG
  42. NameHwTbl    db    "hwtbl.tst", 0
  43. NameIpTbl    db    "iptbl.tst", 0
  44. else
  45. NameHwTbl    db    "hwtbl.txt", 0
  46. NameIpTbl    db    "iptbl.txt", 0
  47. endif ; DEBUG
  48.  
  49. MsgTblSize      db      "Wrote    0 table entries, "
  50. MsgTblAct       db      "   0 active this run.", CR, LF, '$'
  51.  
  52. TblTime         dw      0, 0, 0, 0
  53.  
  54.         align    16
  55. MsgTblDispl     db      60 dup (' ')
  56. MsgTblSeen      db      11 dup (' ')
  57. MsgTblTime    db    "00:00:00", CR, '$'
  58.  
  59.  
  60.  
  61. ;************************************************************************
  62. ;*        TblDisplay 
  63. ;************************************************************************
  64.  
  65. TblDisplay    proc    near
  66.         assume    ds:code_s
  67.         push    cs
  68.         pop    es
  69.         mov    ah,2Ch            ; get time
  70.         int    21h
  71.         mov    di,offset TblTime
  72.         mov    si,di
  73.         cld
  74.         mov    al,ch
  75.         cbw
  76.         stosw
  77.         mov    al,cl
  78.         cbw
  79.         stosw
  80.         mov    al,dh
  81.         cbw
  82.  
  83.         cmp    ax,[di]         ; new second yet?
  84.         jne    TblNewTime
  85.         ret
  86.  
  87.   TblNewTime:
  88.         stosw
  89.  
  90.         mov    ch,':'
  91.         mov    cl,3
  92.         mov    di,offset MsgTblTime
  93.         call    PutNumsD2F0         ; put time of day
  94.  
  95.         mov    ax,TblSeen
  96.         mov    dx,TblSeen+2
  97.         mov    di,offset MsgTblSeen
  98.         mov    PutNumFiller,' '
  99.         mov    PutMinDigits,10
  100.         call    PutBigNum        ; put ARP broadcasts seen
  101.  
  102.         mov    dx,offset MsgTblDispl
  103.         call    DosPr$
  104.         ret
  105. TblDisplay    endp
  106.  
  107.  
  108.  
  109. ;************************************************************************
  110. ;*        FindIn16Table
  111. ;*
  112. ;*    Input:         DS:SI = address of search string key (saved)
  113. ;*            AX = string length (saved)
  114. ;*            ES = table segment (saved)
  115. ;*            BX = table size in bytes
  116. ;*    Output:      ES:BX = table slot address of entry less or equal to key
  117. ;*            Zero flag if equal to key
  118. ;*    Destroys:    BX, flags
  119. ;*
  120. ;* Before use, the table must be filled with all ones, except slot 0 which
  121. ;* must be filled with zeros. Slot 0 may never be changed.
  122. ;************************************************************************
  123.  
  124. FindIn16Table    proc    near
  125.         assume    ds:nothing
  126.         push    cx
  127.         push    dx
  128.         push    di
  129.         push    bp
  130.         mov    bp,si
  131.         mov    cx,bx
  132.         xor    bx,bx
  133.         mov    dx,8000h        ; find proper 2**x size
  134.   FindLenLoop:
  135.         cmp    dx,cx
  136.         jb    FindHalfChk        ; start binary search
  137.         shr    dx,1
  138.         jmp    short FindLenLoop
  139.  
  140.   FindLess:
  141.         sub    bx,dx
  142.   FindGreater:
  143.         shr    dx,1            ; divide step by two
  144.   FindHalfChk:
  145.         cmp    dx,16            ; step < slot size?
  146.         jb    FindDone
  147.         add    bx,dx            ; position halfway
  148.  
  149.         mov    di,bx
  150.         mov    si,bp
  151.         mov    cx,ax
  152.         repe    cmpsb            ; compare strings
  153.         ja    FindGreater
  154.         jb    FindLess
  155.   FindDone:
  156.         mov    si,bp
  157.         pop    bp
  158.         pop    di
  159.         pop    dx
  160.         pop    cx
  161.         ret
  162. FindIn16Table    endp
  163.  
  164.  
  165.  
  166. ;************************************************************************
  167. ;*        GetHexNums
  168. ;************************************************************************
  169.  
  170. GetHexNums    proc    near
  171.         assume    ds:nothing
  172.   GetHexNum:
  173.         xor    dx,dx
  174.   GetHexDig:
  175.         lodsb
  176.         cmp    al,'0'
  177.         jb    GetHexEnd
  178.         cmp    al,'9'
  179.         ja    GetHexTst
  180.         sub    al,'0'
  181.         jmp    short GetHexConv
  182.   GetHexTst:
  183.         cmp    al,'a'
  184.         jb    GetHexEnd
  185.         cmp    al,'f'
  186.         ja    GetHexEnd
  187.         sub    al,'a'-10
  188.   GetHexConv:
  189.         cbw
  190.         add    ax,dx
  191.         mov    cx,ax
  192.         mul    k16
  193.         mov    dx,ax
  194.         jmp    short GetHexDig
  195.   GetHexEnd:
  196.         cmp    al,'-'
  197.         mov    ax,cx
  198.         stosb
  199.         je    GetHexNum
  200.         ret
  201. GetHexNums    endp
  202.  
  203.  
  204.  
  205. ;************************************************************************
  206. ;*        Ins16ByteSlot
  207. ;************************************************************************
  208.  
  209. Ins16ByteSlot    proc    near
  210.         SHOW_EVENT    'a'
  211.         assume    ds:nothing
  212.         push    ds
  213.         mov    cx,cs:TblSize
  214.         push    es
  215.         pop    ds
  216.         sub    cx,bx
  217.         mov    si,bx
  218.         sub    si,2
  219.         add    si,cx
  220.         mov    di,si
  221.         add    di,16
  222.         std
  223.         shr    cx,1
  224.         rep    movsw
  225.         cld
  226.         pop    ds
  227.         ret
  228. Ins16ByteSlot    endp
  229.  
  230.  
  231.  
  232. ;************************************************************************
  233. ;*        FindHostInTbls
  234. ;************************************************************************
  235.  
  236. FindHostInTbls    proc    near
  237.         assume    ds:nothing
  238.         push    dx
  239.         push    ax
  240.  
  241.         mov    es,cs:SegHwIpTbl
  242.         mov    bx,cs:TblSize
  243.         mov    ax,11
  244.         mov    si,bp
  245.         push    [si+10]
  246.         mov    byte ptr [si+10],' '
  247.         call    FindIn16Table
  248.         pop    [si+10]
  249.         jz    InitHwMatch
  250.  
  251.         add    bx,16
  252.         call    Ins16byteSlot
  253.         mov    si,bp
  254.         mov    cx,10/2
  255.         mov    di,bx
  256.         rep    movsw            ; (SlotHw SlotIp)
  257.  
  258.         mov    ax,'  '
  259.         stosw                ; SlotDupl SlotPend
  260.         mov    ax,TblSize
  261.         stosw                ; SlotNamPtr
  262.   InitHwMatch:
  263.         mov    es,SegIpHwTbl
  264.         mov    bx,cs:TblSize
  265.         mov    ax,11
  266.         mov    si,bp
  267.         sub    si,4
  268.         push    [si+10]
  269.         mov    byte ptr [si+10],' '
  270.         call    FindIn16Table
  271.         pop    [si+10]
  272.         jz    InitIpMatch
  273.  
  274.         add    bx,16
  275.         call    Ins16byteSlot
  276.         mov    si,bp
  277.         sub    si,4
  278.         mov    cx,10/2
  279.         mov    di,bx
  280.         rep    movsw            ; SlotIp SlotHw
  281.  
  282.         mov    ax,'  '
  283.         stosw                ; SlotDupl SlotPend
  284.         mov    ax,cs:TblSize
  285.         stosw                ; SlotNamPtr
  286.         xor    ax,ax
  287.         stosw                ; SlotSeen
  288.         or    sp,sp
  289.   InitIpMatch:
  290.         pushf
  291.         test    cs:GenFlags,PROBE_REPLY
  292.         jnz    FindHostProbe
  293.  
  294.         inc    es:[bx].SlotSeen
  295.         add    cs:TblSeen,1
  296.         adc    cs:TblSeen+2,0
  297.   FindHostProbe:
  298.         popf
  299.         pop    ax
  300.         pop    dx
  301.         ret
  302. FindHostInTbls    endp
  303.  
  304.  
  305.  
  306. ;************************************************************************
  307. ;*        TableInit
  308. ;************************************************************************
  309.  
  310. TableInit    proc    near
  311.         assume    ds:code_s
  312.         test    Argflags,MAKE_TABLE
  313.         jnz    TableInit2
  314.         ret
  315.   TableInit2:
  316.         mov    bx,(TableSegs-1)*2
  317.         mov    dx,cs
  318.         add    dx,1000h
  319.         mov    ax,'  '         ; NamTbl2 must be blanked
  320.   TableFF:
  321.         mov    word ptr SegmData[bx],dx
  322.         mov    es,dx
  323.         add    dx,1000h
  324.         cmp    dx,PspTopMem        ; end of free memory?
  325.         jbe    TableFits
  326.  
  327.         mov    al,'M'-'0'
  328.         call    Terminate
  329.   TableFits:
  330.         mov    cx,08000h        ; prefill all 64 kb
  331.         xor    di,di
  332.         rep    stosw
  333.  
  334.         sub    bx,2
  335.         mov    ax,0ffffh        ; IpHwTbl prefill
  336.         jns    TableFF
  337.  
  338.         xor    ax,ax            ; zerofill first slot
  339.         mov    es,SegIpHwTbl
  340.         mov    cx,16/2
  341.         xor    di,di
  342.         rep    stosw
  343.  
  344.         mov    es,SegHwIpTbl
  345.         mov    cx,16/2
  346.         xor    di,di
  347.         rep    stosw
  348.  
  349.         push    cs
  350.         pop    es
  351.  
  352.         mov    dx,offset NameHwTbl
  353.         mov    ax,3d02h
  354.         int    21h
  355.         jc    TabInitHw
  356.  
  357.         mov    bx,ax
  358.         mov    ah,3eh
  359.         int    21h
  360.         jmp    TabTstIp
  361.   TabInitHw:
  362.         mov    dx,offset NameHwTbl
  363.         xor    cx,cx
  364.         mov    ah,3ch
  365.         int    21h
  366.         jc    TabOpenErr
  367.   TabTstIP:
  368.         mov    dx,offset NameIpTbl
  369.         mov    ax,3d02h
  370.         int    21h
  371.         mov    Handle,ax
  372.         jnc    TabRdNext
  373.  
  374.         mov    dx,offset NameIpTbl
  375.         xor    cx,cx
  376.         mov    ah,3ch
  377.         int    21h
  378.         jc    TabOpenErr
  379.         jmp    TabRdClOK
  380.   TabOpenErr:
  381.         mov    al,'O'-'0'
  382.         call    Terminate
  383.  
  384.   
  385.   TabRdLong:
  386.         mov    TblLineLen,81
  387.         mov    cx,9
  388.         mov    dx,offset FileBuf+72
  389.         jmp    short TabRdMore
  390.   
  391.   TabRdNext:
  392.         push    cs
  393.         pop    es
  394.         mov    cx,TblLineLen
  395.         mov    dx,offset FileBuf
  396.   TabRdMore:            
  397.         mov    bx,Handle
  398.         mov    ah,3fh
  399.         int    21h
  400.         jc    TabRdErr
  401.  
  402.         mov    si,offset FileBuf
  403.         cmp    byte ptr [si],'Z'-040h
  404.         je    TabRdEof
  405.             
  406.         or    ax,ax
  407.         jz    TabRdEof
  408.  
  409.         cmp    TblLineLen,72
  410.         jne    TabOkLen
  411.  
  412.         cmp    byte ptr FileBuf+71,LF
  413.         jne    TabRdLong
  414.   TabOkLen:
  415.         mov    di,offset TmpTbl
  416.         mov    bp,di
  417.         call    GetIpNr
  418.         jnz    TabRdErr
  419.  
  420.         mov    si,offset FileBuf+53
  421.         call    GetHexNums
  422.  
  423.         push    si
  424.         mov    si,bp
  425.         movsw
  426.         movsw
  427.  
  428.         add    bp,4
  429.         call    FindHostInTbls
  430.         je    InitDup
  431.  
  432.         push    es
  433.         mov    si,offset FileBuf+16
  434.         mov    di,TblSize
  435.         call    NamePut
  436.         add    TblSize,16
  437.         pop    es
  438.   InitDup:
  439.         pop    si
  440.         cmp    byte ptr [si],LF
  441.         je    TabRdOld
  442.  
  443.         call    Skip_Blanks
  444.         call    GetNum
  445.         dec    ax
  446.         cwd
  447.         add    es:[bx].SlotSeen,ax
  448.         add    TblSeen,ax
  449.         adc    TblSeen+2,dx
  450.         inc    si
  451.   TabRdOld:
  452.         push    cs
  453.         pop    es
  454.             
  455.         cmp    byte ptr [si],LF
  456.         jne    TabRdErr
  457.  
  458.         mov    byte ptr [si+1],'$'
  459.  
  460.         mov    dx,offset FileBuf
  461.         call    DosPr$
  462.         jmp    TabRdNext
  463.  
  464.   TabRdErr:
  465.         mov    al,'R'-'0'
  466.         call    Terminate
  467.  
  468.   TabRdEof:
  469.         mov    bx,Handle
  470.         mov    ah,3eh
  471.         int    21h
  472.         jnc    TabRdClOK
  473.  
  474.         mov    al,'C'-'0'
  475.         call    Terminate
  476.   TabRdClOK:
  477. if DEBUG eq 0
  478.         call    ProbeIpInit
  479. endif ; not DEBUG
  480.         mov    cx,SavedTicks
  481.         mov    TblProbeNext,cx
  482.         mov    TblWrNext,cx
  483.         cmp    EchoTarget,0
  484.         jnz    TableInitRet
  485.  
  486. TableReady:
  487.         or    GenFlags,TBL_READY
  488.         mov    si,offset DefGwyNum
  489.         lodsw
  490.         mov    cx,ax
  491.         jcxz    TableInitRet
  492.   TableGwyLoop:
  493.         push    cx
  494.         lodsw
  495.         mov    dx,ax
  496.         lodsw
  497.         push    si
  498.         push    ds
  499.         push    es
  500.         call    BufAlloc
  501.         mov    [bx].dTimOutMsg,0    ; we don't require an answer
  502.         mov    [bx].dTickTimeout,0    ; don't wait
  503.         call    SendArpReq        ; send arp
  504.         call    BufRelease
  505.         pop    es
  506.         pop    ds
  507.         pop    si
  508.         pop    cx
  509.         loop    TableGwyLoop
  510.  
  511.   TableInitRet:
  512.         ret
  513. TableInit    endp
  514.  
  515.  
  516.  
  517. ProbeIpInit    proc    near
  518.         mov    dx,MyNet
  519.         mov    ax,Mynet+2
  520.         mov    TblIpProbe,dx
  521.         inc    ah
  522.         mov    TblIpProbe+2,ax
  523.         ret
  524. ProbeIpInit    endp
  525.  
  526.  
  527.  
  528. ;************************************************************************
  529. ;*        TblProbe
  530. ;************************************************************************
  531.  
  532. MsgNeedMask    db    "Need to know network mask", CR, LF, '$'
  533.  
  534. TblProbe    proc    near
  535.         assume    ds:nothing
  536.         mov    ds,cs:MySegm
  537.         assume    ds:code_s
  538.         cmp    InSendAndW,0
  539.         jnz    TblProbeRet
  540.  
  541.         test    GenFlags,TBL_READY
  542.         jz    TblProbeRet
  543.  
  544.         mov    cx,SavedTicks
  545.         mov    ax,cx
  546.         sub    ax,TblProbIntvl     ; 2 - 9 probes a second
  547.         sub    ax,TblProbeNext
  548.         js    TblProbeRet
  549.  
  550.         mov    TblProbeNext,cx
  551.  
  552.         mov    ax,cx
  553.         sub    ax,TblWrNext
  554.         js    TblWrLater
  555.  
  556.         add    cx,182*20        ; limit write to once in 200 s
  557.         mov    TblWrNext,cx
  558.  
  559.         mov    ax,TblSize
  560.         mov    dx,TblActive
  561.         cmp    dx,TblActLast
  562.         ja    TblProbeWr
  563.  
  564.         cmp    ax,TblSizeLast
  565.         jbe    TblWrLater
  566.   TblProbeWr:
  567.         mov    TblActLast,dx
  568.         mov    TblSizeLast,ax
  569.         call    TableWr
  570.   TblWrLater:
  571.         test    ArgFlags,TBL_PROBE
  572.         jnz    TblDoProbe
  573.   TblProbeRet:
  574.         ret
  575.  
  576.   TblDoProbe:
  577.         cmp    MyMask,0
  578.         jne    TblProbeChkIntvl
  579.         mov    dx,offset MsgNeedMask
  580.         mov    al,'P'-'0'
  581.         call    PrTerminate
  582.   TblProbeChkIntvl:
  583. if DEBUG
  584.         cmp    TblProbIntvl,1
  585. else
  586.         cmp    TblProbIntvl,2
  587. endif ; DEBUG
  588.         jbe    TblProbMin
  589.         dec    TblProbIntvl
  590.   TblProbMin:
  591.  
  592.         mov    dx,TblIpProbe
  593.         mov    ax,TblIpProbe+2
  594.         cmp    ax,ArpTabIp2+2        ; end of subnet numbers?
  595.         jne    TblProbeMore
  596.         cmp    dx,ArpTabIp1+2
  597.         jne    TblProbeMore
  598.         call    ProbeIpInit
  599.   TblProbeMore:
  600.         push    ds
  601.         push    es
  602.         call    BufAlloc
  603.         mov    [bx].dTimOutMsg,0    ; we don't require an answer
  604.         mov    [bx].dTickTimeout,0    ; don't wait
  605.         call    SendArpReq        ; send arp
  606.         call    BufRelease
  607.         pop    es
  608.         pop    ds
  609.  
  610.         add    ah,1            ; increment IP #
  611.         adc    al,0
  612.         adc    dh,0
  613.         adc    dl,0
  614.         mov    TblIpProbe,dx
  615.         mov    TblIpProbe+2,ax
  616.  
  617.         mov    si,offset TblIpProbe
  618.         mov    di,offset MsgTblDispl
  619.         call    PutIpNum
  620.         call    BlankUntil16
  621.         ret
  622. TblProbe    endp
  623.  
  624.  
  625.  
  626. ;************************************************************************
  627. ;*        DoTable
  628. ;************************************************************************
  629.  
  630. DoTable     proc    near
  631.         assume    ds:nothing
  632.         test    cs:GenFlags,TBL_READY
  633.         jz    TableRetRel0
  634.         cmp    cs:TblSize,0fff0h
  635.         jb    $+5
  636.   TableRetRel0:
  637.         jmp    TableRetRel
  638.  
  639.         mov    ax,[bx].dPtrPhys
  640.         call    ArpFindHw
  641.         mov    [bx].dIdxHwDst,di
  642.  
  643.         mov    di,[bx].dPtrIp
  644.         cmp    word ptr [di-2],0008h    ; is this an IP pkt?
  645.         jne    DoTabArp
  646.  
  647.         mov    dx,[di].iIpSrc
  648.         mov    ax,[di].iIpSrc+2
  649.         or    dx,dx
  650.         jz    TableRetRel0        ; ignore bootp requests
  651.         mov    di,[bx].dPtrPhys
  652.         add    di,cs:Hlen
  653.         mov    bp,di
  654.         add    di,cs:Hlen
  655.         mov    [di],dx
  656.         mov    [di+2],ax
  657.         mov    cx,0200h        ; fake an ARP reply
  658.         mov    [bx].dIdxHwDst,ARPMYIDX
  659.         jmp    short DoTabCommon
  660.   DoTabArp:
  661.         mov    cx,[di].iArpOp
  662.         add    di,iArpMyHwAd
  663.         mov    bp,di
  664.         add    di,cs:Hlen
  665.         mov    dx,[di]
  666.         mov    ax,[di+2]
  667.   DoTabCommon:
  668.         mov    byte ptr [di+4],' '
  669.         mov    ds:[bp-4],dx
  670.         mov    ds:[bp-4+2],ax
  671.         push    bx
  672.  
  673.         and    cs:GenFlags,not PROBE_REPLY
  674.         cmp    cx,0200h        ; ignore arp REPLIES from hosts
  675.         jne    DoTabUpdate        ; already known (probably a
  676.         cmp    [bx].dIdxHwDst,ARPMYIDX ; proxy arp gateway)
  677.         jne    DoTabUpdate
  678.  
  679.         or    cs:GenFlags,PROBE_REPLY
  680.         push    ax
  681.         mov    es,cs:SegHwIpTbl
  682.         mov    si,bp
  683.         mov    ax,11
  684.         mov    bx,cs:TblSize
  685.         call    FindIn16Table        ; this Hw+IP addr already known?
  686.         pop    ax
  687.         je    DoTabUpdate        ; -yes, lets update name
  688.  
  689.         push    ax
  690.         mov    si,bp
  691.         mov    ax,cs:Hlen
  692.         mov    bx,cs:TblSize
  693.         call    FindIn16Table        ; this Hw addr already known?
  694.         pop    ax
  695.         jne    DoTabUpdate        ; -no, must be a new one
  696.         or    bx,bx            ; does he use hw addr zero?
  697.         jz    DoTabUpdate        ; -yes, put him in the tables
  698.         cmp    bx,cs:TblSize        ; he believes HE is broadcast?
  699.         jb    TableAnswered        ; -no
  700.   DoTabUpdate:                    ; put this addr in the tables
  701.         call    FindHostInTbls
  702.         jne    TableAdd
  703.  
  704.         cmp    byte ptr es:[bx].SlotPend,' '
  705.         je    TableNew
  706.  
  707.         cmp    byte ptr es:[bx].SlotPend,'s'
  708.         jb    TablePending
  709.         dec    cs:TblActive
  710.   TableNew:
  711.         mov    byte ptr es:[bx].SlotPend,'p'
  712.         inc    cs:TblActive
  713.         jmp    short TableAsk
  714.   TablePending:
  715.         cmp    byte ptr es:[bx].SlotPend,'p'
  716.         jb    TableAnswered
  717.  
  718.         inc    byte ptr es:[bx].SlotPend
  719.   TableAnswered:
  720.         push    cs
  721.         pop    es
  722.         pop    bx
  723.         jmp    TableRetRel
  724.  
  725.   TableAdd:
  726.         SHOW_EVENT    'b'
  727.         mov    byte ptr es:[bx].SlotPend,'p'
  728.         inc    cs:TblActive
  729.         push    dx
  730.         push    ax
  731.         push    bx
  732.         mov    si,bp
  733.         add    si,cs:Hlen
  734.         mov    di,cs:TblSize
  735.         mov    es,cs:SegmNamTbl
  736.         call    PutIpNum        ; use IP # as name until
  737.         call    BlankUntil16        ;   we get nameserver reply
  738.         add    cs:TblSize,16
  739.         pop    bx
  740.         pop    ax
  741.         pop    dx
  742.   TableAsk:
  743.         SHOW_EVENT    'c'
  744.         mov    cs:TblProbIntvl,9    ; slow down probe to
  745.         mov    es,cs:SegIpHwTbl    ;   twice a second
  746.         mov    cx,es:[bx].SlotNamPtr
  747.         push    cx            ; save name tbl idx
  748.  
  749.         push    cs
  750.         pop    es
  751.  
  752.         xor    ch,ch
  753.         mov    cl,dh
  754.         xor    dh,dh
  755.         push    dx
  756.         push    cx
  757.         mov    cl,ah
  758.         xor    ah,ah
  759.         push    ax
  760.         push    cx
  761.  
  762.         mov    di,offset FileBuf
  763.         mov    bl,4
  764.         mov    cs:PutMinDigits,1
  765.   TableNumLoop:
  766.         mov    si,di
  767.         inc    di
  768.         pop    ax
  769.         call    PutNum
  770.         mov    es:[si],dl
  771.         dec    bl
  772.         jnz    TableNumLoop
  773.  
  774.         mov    si,offset InAdrArpa
  775.         mov    cx,InAdrArpaLen
  776.   TableNumL2:
  777.         movs    byte ptr es:[FileBuf],cs:[InAdrArpa]
  778.         loop    TableNumL2
  779.  
  780.         mov    dx,1234h        ; tblbuild udp src port
  781.         pop    ax            ; NsId = name table index
  782.         mov    si,offset FileBuf    ; Ns question string
  783.  
  784.         call    NsResolve        ; ask name for this #
  785.         SHOW_EVENT    'd'
  786.         pop    bx
  787.   TableRetRel:
  788.         call    BufRelease
  789.   TableRet:
  790.         ret
  791. DoTable     endp
  792.  
  793.  
  794.  
  795. ;************************************************************************
  796. ;*        BlankUntil16 byte boundry
  797. ;************************************************************************
  798.  
  799. BlankUntil16    proc    near
  800.         assume    ds:nothing
  801.         mov    al,' '
  802.   BlankMore:
  803.         test    di,0fh
  804.         jz    BlankRet
  805.         stosb
  806.         jmp    short BlankMore
  807.   BlankRet:
  808.         ret
  809. BlankUntil16    endp
  810.  
  811.  
  812.  
  813. ;************************************************************************
  814. ;*        NamePut from DS:SI to TblName[DI]
  815. ;************************************************************************
  816.  
  817. NamePut     proc    near
  818.         assume    ds:nothing
  819.         mov    es,cs:SegmNamTbl
  820.         mov    cx,16
  821.   NamePutLoop:
  822.         lodsb
  823.         cmp    al,CR
  824.         je    NamePutEnd
  825.         stosb
  826.         loop    NamePutLoop
  827.  
  828.         sub    di,16
  829.         mov    es,cs:SegmNamTbl2
  830.         mov    cx,16
  831.   NamePutLoop2:
  832.         lodsb
  833.         cmp    al,CR
  834.         je    NamePutEnd2
  835.         stosb
  836.         loop    NamePutLoop2
  837.  
  838.   NamePutEnd2:
  839.         call    BlankUntil16
  840.         jmp    short NamePutRet
  841.  
  842.   NamePutEnd:
  843.         call    BlankUntil16
  844.  
  845.         mov    es,cs:SegmNamTbl2
  846.         sub    di,16
  847.         stosb
  848.         jmp    short NamePutEnd2
  849.   NamePutRet:
  850.         push    cs
  851.         pop    es
  852.         ret
  853. NamePut     endp
  854.  
  855.  
  856.  
  857. ;************************************************************************
  858. ;*        ThisIpFirst
  859. ;*    Input:        CS:DI = addr of length prepended IP list
  860. ;*            DS:BX = IP description buffer pointer
  861. ;*    Output:     Moves source IP # to front of IP list
  862. ;************************************************************************
  863.  
  864. ThisIpFirst    proc    near
  865.         assume    ds:nothing
  866.         push    es
  867.         push    cs
  868.         pop    es
  869.         mov    si,[bx].dPtrIp
  870.         mov    dx,[si].iIpSrc
  871.         mov    ax,[si].iIpSrc+2
  872.         mov    cl,-1
  873.         mov    ch,cs:[di]         ; list length
  874.   ThisIpNext2:
  875.         inc    di
  876.         inc    di
  877.   ThisIpNext4:
  878.         inc    cl
  879.         cmp    cl,ch            ; more entries in list?
  880.         jae    ThisIpRet
  881.  
  882.         xchg    ax,dx
  883.         scasw                ; first IP word match?
  884.         xchg    ax,dx
  885.         jne    ThisIpNext2
  886.  
  887.         scasw                ; second IP word match?
  888.         jne    ThisIpNext4
  889.  
  890.         dec    di
  891.         lea    si,[di-4]
  892.         std
  893.         xor    ch,ch
  894.         shl    cx,1
  895.         jcxz    ThisIpL1e
  896.   ThisIpL1:
  897.         movs    word ptr es:[DefNS],cs:[DefNS]
  898.         loop    ThisIpL1        ; move entries downlist
  899.   ThisIpL1e:
  900.         cld
  901.         inc    si
  902.         mov    cs:[si],dx         ; insert src IP in front
  903.         mov    cs:[si+2],ax
  904.   ThisIpRet:
  905.         pop    es
  906.         ret
  907. ThisIpFirst    endp
  908.  
  909.  
  910. ;************************************************************************
  911. ;*        DoName
  912. ;************************************************************************
  913.  
  914. DoName        proc    near
  915.         assume    ds:nothing
  916.         test    cs:GenFlags,TBL_READY
  917.         jnz    NameInited
  918.  
  919.         ret
  920.   NameInited:
  921.         SHOW_EVENT    'e'
  922.         push    ds
  923.         pop    es
  924.         lea    si,[di].uNsQuest
  925.         mov    bp,[di].uNsId
  926.         lea    di,[di].uNsNscount    ; used for scratch
  927.         mov    dx,si
  928.         inc    dx
  929.  
  930.   BS        equ    'H'-040h
  931.         call    NameDecode
  932.         mov    word ptr [si],'  '
  933.         mov    word ptr [si+2],BS+256*BS
  934.         add    si,4
  935.  
  936.         push    dx
  937.         push    si
  938.         mov    si,dx
  939.         call    GetIpNr
  940.         pop    si
  941.         pop    dx
  942.  
  943.         mov    di,[bx].dPtrUdp
  944.         cmp    [di].uNsAncount,0100h
  945.         je    NameHaveAns
  946.         push    dx
  947.         jmp    short NameNoAnswer
  948.   NameHaveAns:
  949.         mov    di,si
  950.         call    NameDecode
  951.         jnz    NameDcCompr
  952.         mov    dx,di
  953.         inc    dx
  954.   NameDcCompr:
  955.   TAB        equ    'I'-040h
  956.         push    dx
  957.         mov    word ptr [si],TAB+256*'N'
  958.         mov    word ptr [si+2],'ma'
  959.         mov    word ptr [si+4],'0e'
  960.         mov    word ptr [si+6],'00'
  961.         mov    word ptr [si+8],'=0'
  962.         lea    di,[si+5]
  963.         add    si,10
  964.         mov    ax,bp
  965.         mov    cl,4
  966.         shr    ax,cl
  967.         call    PutNumD4Fb
  968.         mov    cs:PutMinDigits,2
  969.  
  970.         mov    di,si
  971.         call    NameDecode
  972.   NameNoAnswer:
  973.         mov    word ptr [si],' '+256*CR
  974.         mov    word ptr [si+2],LF+256*'$'
  975.  
  976.         mov    si,[bx].dPtrUdp
  977.         mov    ax,[si].uNsNScount
  978.         mov    dx,[si].uNsNscount+2
  979.         xchg    ah,al
  980.         xchg    dh,dl
  981.         mov    [si].uNsNScount,dx
  982.         mov    [si].uNsNScount+2,ax
  983.         lea    si,[si].uNsNScount
  984.         push    bx
  985.         mov    bx,cs:TblSize
  986.         mov    es,cs:SegIpHwTbl
  987.         push    ax
  988.         mov    ax,4
  989.         call    FindIn16Table
  990.         pop    ax
  991.         mov    si,bx
  992.         pop    bx
  993.         je    NameFound
  994.   NameNotFound:
  995.         pop    dx
  996.         call    DosPr$
  997.         mov    al,'A'-'0'
  998.         call    Terminate
  999.   NameFound:                    ; find question to this answer
  1000.         mov    cx,si
  1001.   NameFindNxtHi:
  1002.         cmp    bp,es:[si].SlotNamPtr
  1003.         je    NameFoundThis
  1004.         add    si,16
  1005.         cmp    dx,es:[si]
  1006.         jne    NameFindLower
  1007.         cmp    ax,es:[si+2]
  1008.         je    NameFindNxtHi
  1009.   NameFindLower:
  1010.         mov    si,cx
  1011.   NameFindNxtLo:
  1012.         sub    si,16
  1013.         cmp    bp,es:[si].SlotNamPtr
  1014.         je    NameFoundThis
  1015.         cmp    dx,es:[si]
  1016.         jne    NameNotFound
  1017.         cmp    ax,es:[si+2]
  1018.         jne    NameNotFound
  1019.         jmp    short NameFindNxtLo
  1020.   NameFoundThis:
  1021.         mov    bp,[bx].dPtrUdp
  1022.         mov    dx,ds:[bp].uNsAncount
  1023.         mov    ax,ds:[bp].uNsOpwd
  1024.         and    ah,0fh
  1025.         cmp    ah,1            ; format error?
  1026.         jne    NameFmtOK
  1027.  
  1028.         mov    al,'F'-'0'
  1029.         call    Terminate
  1030.   NameFmtOK:
  1031.         mov    byte ptr es:[si].SlotPend,'t' ; try again next time
  1032.  
  1033.         cmp    ah,2            ; temporary server problem?
  1034.         je    NameSkipUpd
  1035.  
  1036.         test    al,4            ; authorititive answer?
  1037.         jz    NameTryLater
  1038.  
  1039.         mov    byte ptr es:[si].SlotPend,'0' ; we ask no more about this #
  1040.   NameTryLater:
  1041.         or    ah,ah            ; any other error?
  1042.         jnz    NameSkipUpd
  1043.  
  1044.         cmp    dx,0100h        ; any answer?
  1045.         jne    NameSkipUpd
  1046.  
  1047.         mov    byte ptr es:[si].SlotPend,'N' ; we ask no more about this #
  1048.         test    al,4            ; authorititive answer?
  1049.         jz    NameNotAuth
  1050.  
  1051.         mov    byte ptr es:[si].SlotPend,'A' ; we ask no more about this #
  1052.   NameNotAuth:
  1053.         mov    si,es:[si].SlotNamPtr
  1054.         xchg    si,di
  1055.         inc    si
  1056.         call    NamePut            ; put real name into nametable
  1057.         SHOW_EVENT    'f'
  1058.   NameSkipUpd:
  1059.         push    cs
  1060.         pop    es
  1061.         pop    dx
  1062.         call    DosPr$
  1063.  
  1064.         or    cs:Events,GOT_NSREPLY
  1065.         mov    di,offset DefNsNum
  1066.         call    ThisIpFirst        ; stick to this nameserver
  1067.   NameRet:
  1068.         ret
  1069. DoName        endp
  1070.  
  1071.  
  1072.  
  1073. ;************************************************************************
  1074. ;*        TabMarkGw
  1075. ;************************************************************************
  1076.  
  1077. TabMarkGw    proc    near
  1078.         SHOW_EVENT    'g'
  1079.         assume    ds:code_s
  1080.         mov    bx,TblSize
  1081.         mov    ds,SegIpHwTbl
  1082.         assume    ds:nothing
  1083.   TabMarkLoop:
  1084.         mov    si,bx
  1085.         mov    dx,[si].SlotIp
  1086.         mov    ax,[si].SlotIp+2
  1087.         mov    cx,cs:DefGwyNum
  1088.         mov    si,offset DefGwys
  1089.         jcxz    TabGwyDone
  1090.   TabGwyLoop:
  1091.         cmp    ax,cs:[si].SlotIp+2
  1092.         jne    TabGwyNext
  1093.         cmp    dx,cs:[si].SlotIp
  1094.         jne    TabGwyNext
  1095.         mov    byte ptr [bx].SlotDupl,'+'
  1096.         jmp    short TabGwyDone
  1097.   TabGwyNext:
  1098.         add    si,4
  1099.         loop    TabGwyLoop
  1100.   TabGwyDone:
  1101.         sub    bx,16
  1102.         jns    TabMarkLoop
  1103.  
  1104.         mov    bx,cs:TblSize
  1105.   TabDupLoop:
  1106.         mov    si,bx
  1107.   TabMarkHwLoop:
  1108.         sub    si,16
  1109.         js    TabDupNext
  1110.  
  1111.         mov    ax,[si].SlotHw+4
  1112.         cmp    ax,[bx].SlotHw+4
  1113.         jne    TabMarkHwLoop
  1114.         mov    ax,[si].SlotHw+2
  1115.         cmp    ax,[bx].SlotHw+2
  1116.         jne    TabMarkHwLoop
  1117.         mov    ax,[si].SlotHw
  1118.         cmp    ax,[bx].SlotHw
  1119.         jne    TabMarkHwLoop
  1120.  
  1121.         cmp    byte ptr [si].SlotDupl,'+'
  1122.         je    TabMarkHwDup
  1123.  
  1124.         mov    byte ptr [si].SlotDupl,'>'
  1125.         cmp    byte ptr [bx].SlotDupl,'>'
  1126.         je    TabMarkHwDup
  1127.  
  1128.         cmp    byte ptr [bx].SlotDupl,'+'
  1129.         je    TabMarkHwLoop
  1130.  
  1131.         mov    byte ptr [bx].SlotDupl,'='
  1132.         jmp    short TabMarkHwLoop
  1133.  
  1134.   TabMarkHwDup:
  1135.         cmp    byte ptr [bx].SlotDupl,'+'
  1136.         je    TabMarkHwLoop
  1137.  
  1138.         mov    byte ptr [bx].SlotDupl,'>'
  1139.         jmp    short TabMarkHwLoop
  1140.   TabDupNext:
  1141.         sub    bx,16
  1142.         jns    TabDupLoop
  1143.  
  1144.         push    cs
  1145.         pop    ds
  1146.         ret
  1147. TabMarkGw    endp
  1148.  
  1149.  
  1150. ;************************************************************************
  1151. ;*        TabOpen
  1152. ;************************************************************************
  1153.  
  1154. TabOpen     proc    near
  1155.         assume    ds:code_s
  1156.         mov    ax,3d02h
  1157.         int    21h
  1158.         mov    Handle,ax
  1159.         jnc    TabOpenRet
  1160.         mov    al,'B'-'0'
  1161.         call    Terminate
  1162.   TabOpenRet:
  1163.         ret
  1164. TabOpen     endp
  1165.  
  1166.  
  1167.  
  1168. ;************************************************************************
  1169. ;*        TabPutHw
  1170. ;************************************************************************
  1171.  
  1172. TabPutHw    proc    near
  1173.         assume    ds:nothing
  1174.         mov    ds,cs:SegIpHwTbl
  1175.         lea    si,[bx].SlotHw
  1176.         call    PutHwNum
  1177.  
  1178.         mov    ds,cs:SegIpHwTbl
  1179.         cmp    byte ptr [bx].SlotDupl,'>'
  1180.         clc
  1181.         jne    TabPutHwRet
  1182.  
  1183.         stc
  1184.  
  1185.   TabPutHwRet:
  1186.         ret
  1187. TabPutHw    endp
  1188.  
  1189.  
  1190.  
  1191. ;************************************************************************
  1192. ;*        TabPutName
  1193. ;************************************************************************
  1194.  
  1195. TabPutName    proc    near
  1196.         assume    ds:nothing
  1197.         push    bx
  1198.         mov    ds,cs:SegIpHwTbl
  1199.         mov    bx,[bx].SlotNamPtr
  1200.         mov    cx,8
  1201.         mov    ds,cs:SegmNamTbl
  1202.         mov    si,bx
  1203.         mov    dl,[si]
  1204.         rep    movsw
  1205.         mov    cx,8
  1206.         mov    ds,cs:SegmNamTbl2
  1207.         mov    si,bx
  1208.         rep    movsw
  1209.         mov    ax,'# '
  1210.         stosw
  1211.  
  1212.         pop    bx
  1213.         push    bx
  1214.         mov    ds,cs:SegIpHwTbl
  1215.         mov    si,bx
  1216.         mov    ah,[si].SlotPend
  1217.         cmp    dl,'0'
  1218.         jb    TabPutKnown
  1219.         cmp    dl,'9'
  1220.         ja    TabPutKnown
  1221.         mov    al,'-'
  1222.   TabPutKnown:
  1223.         mov    dx,[si].SlotIp
  1224.         mov    cx,[si].SlotIp+2
  1225.         cmp    dx,[si].SlotIp+16
  1226.         jne    TabPutNeN
  1227.         cmp    cx,[si].SlotIp+16+2
  1228.         jne    TabPutNeN
  1229.         mov    al,'='
  1230.   TabPutNeN:
  1231.         cmp    dx,[si].SlotIp-16
  1232.         jne    TabPutNeP
  1233.         cmp    cx,[si].SlotIp-16+2
  1234.         jne    TabPutNeP
  1235.         mov    al,'<'
  1236.   TabPutNeP:
  1237.         stosw
  1238.         mov    al,[bx].SlotDupl
  1239.         stosb
  1240.         pop    bx
  1241.         ret
  1242. TabPutName    endp
  1243.  
  1244.  
  1245.  
  1246. ;************************************************************************
  1247. ;*        TabPutIp
  1248. ;************************************************************************
  1249.  
  1250. TabPutIp    proc    near
  1251.         assume    ds:nothing
  1252.         mov    ds,cs:SegIpHwTbl
  1253.         mov    si,bx
  1254.         call    PutIpNum
  1255.         ret
  1256. TabPutIp    endp
  1257.  
  1258.  
  1259.  
  1260. ;************************************************************************
  1261. ;*        TabWrLine
  1262. ;************************************************************************
  1263.  
  1264. TabWrLine    proc    near
  1265.         push    cs
  1266.         pop    ds
  1267.         assume    ds:code_s
  1268.         push    bx
  1269.         mov    cx,di
  1270.         mov    dx,offset FileBuf
  1271.         sub    cx,dx
  1272.         mov    bx,Handle
  1273.         mov    ah,40h
  1274.         int    21h
  1275.         jnc    TabWrOK
  1276.   TabWrErr:
  1277.         mov    al,'W'-'0'
  1278.         call    Terminate
  1279.   TabWrOK:
  1280.         pop    bx
  1281.         ret
  1282. TabWrLine    endp
  1283.  
  1284.  
  1285.  
  1286. ;************************************************************************
  1287. ;*        TabClose
  1288. ;************************************************************************
  1289.  
  1290. TabClose    proc    near
  1291.         assume    ds:code_s
  1292.         mov    byte ptr FileBuf,'Z'-40h
  1293.         mov    dx,offset FileBuf
  1294.         mov    cx,1
  1295.         mov    bx,Handle
  1296.         mov    ah,40h
  1297.         int    21h
  1298.         jc    TabWrErr
  1299.  
  1300.         mov    bx,Handle
  1301.         mov    ah,3eh
  1302.         int    21h
  1303.         jnc    TabHwClOK
  1304.  
  1305.         mov    al,'C'-'0'
  1306.         call    Terminate
  1307.   TabHwClOK:
  1308.         ret
  1309. TabClose    endp
  1310.  
  1311.  
  1312.  
  1313. ;************************************************************************
  1314. ;*        TabWrSeen
  1315. ;************************************************************************
  1316.  
  1317. TabWrSeen    proc    near
  1318.         assume    ds:nothing
  1319.         mov    ax,[bx].SlotSeen
  1320.         push    cs
  1321.         pop    ds
  1322.         assume    ds:code_s
  1323.         mov    PutMinDigits,9
  1324.         call    PutNumFb
  1325.         mov    PutMinDigits,1
  1326.         ret
  1327. TabWrSeen    endp
  1328.  
  1329.  
  1330.  
  1331. ;************************************************************************
  1332. ;*        TableWr
  1333. ;************************************************************************
  1334.  
  1335. TableWr     proc    near
  1336.         assume    ds:code_s
  1337.         cmp    TblSize,16
  1338.         ja    TableExist
  1339.         ret
  1340.  
  1341.   TableExist:
  1342.         push    bx
  1343.  
  1344.         call    TabMarkGw
  1345.  
  1346.         mov    dx,offset NameIpTbl
  1347.         call    TabOpen
  1348.         mov    bx,16
  1349.   TabIpNext:
  1350.         mov    di,offset FileBuf
  1351.  
  1352.         call    TabPutIp
  1353.         assume    ds:nothing
  1354.  
  1355.         call    BlankUntil16
  1356.  
  1357.         call    TabPutName
  1358.  
  1359.         push    cs:ArgFlags
  1360.         and    cs:ArgFlags, not LANW_TABLE
  1361.         call    TabPutHw
  1362.         pop    cs:ArgFlags
  1363.  
  1364.         call    TabWrSeen
  1365.  
  1366.         mov    ax,CR+256*LF
  1367.         stosw
  1368.  
  1369.         call    TabWrLine
  1370.         assume    ds:code_s
  1371.  
  1372.         add    bx,16
  1373.         cmp    bx,TblSize
  1374.         jb    TabIpNext
  1375.  
  1376.         call    TabClose
  1377.  
  1378.         mov    dx,offset NameHwTbl
  1379.         call    TabOpen
  1380.         mov    bx,16
  1381.   TabHwNext:
  1382.         mov    di,offset FileBuf
  1383.         call    TabPutHw
  1384.         assume    ds:nothing
  1385.         pushf
  1386.  
  1387.         mov    al,' '
  1388.         stosb
  1389.         call    TabPutName
  1390.  
  1391.         call    TabPutIp
  1392.  
  1393.         call    BlankUntil16
  1394.         sub    di,10
  1395.  
  1396.         call    TabWrSeen
  1397.  
  1398.         mov    ax,CR+256*LF
  1399.         stosw
  1400.  
  1401.         popf
  1402.  
  1403.         call    TabWrLine
  1404.         assume    ds:code_s
  1405.   TabPutHwSkip:
  1406.         add    bx,16
  1407.         cmp    bx,TblSize
  1408.         jb    TabHwNext
  1409.  
  1410.         mov    bx,16
  1411.         mov    es,SegIpHwTbl
  1412.   TabPutRestore:
  1413.         mov    es:[bx].SlotDupl,' '
  1414.         add    bx,16
  1415.         cmp    bx,TblSize
  1416.         jb    TabPutRestore
  1417.         push    cs
  1418.         pop    es
  1419.  
  1420.         call    TabClose
  1421.  
  1422.         pop    bx
  1423.  
  1424.         mov    di,offset MsgTblSize+6
  1425.         mov    ax,TblSize
  1426.         mov    cl,4
  1427.         shr    ax,cl
  1428.         dec    ax
  1429.         call    PutNumD4Fb
  1430.         mov    di,offset MsgTblAct
  1431.         mov    ax,TblActive
  1432.         call    PutNum
  1433.         mov    dx,offset MsgTblSize
  1434.         call    DosPr$
  1435.         ret
  1436. TableWr     endp
  1437.  
  1438. ;========================================================================
  1439.  
  1440.