📄 ppp.asm
字号:
mov esi, RX_LCP_ECHO_REQ
call debug_output
popa
mov al, 0
mov [rx_str+8],al
mov [rx_str+9],al
mov [rx_str+10],al
mov [rx_str+11],al
mov ebx, LCP
mov ecx, LCP_ECHO_REP
movzx edx, byte [rx_str + 5]
mov esi, rx_str + 7
call MakePacket
ppp_003a:
mov eax, [state]
cmp eax, 3
jne ppp_013
mov eax, 4
mov [state], eax
jmp ppp_013
ppp_004:
cmp eax, PAP
jne ppp_005
mov al, [rx_str + 4]
cmp al, PPP_ACK
jne ppp_013
; Debugging output to debug board
pusha
mov esi, RX_PAP_ACK
call debug_output
popa
mov eax, 5
mov [state],eax
jmp ppp_013
ppp_005:
cmp eax, IPCP
jne ppp_006
mov al, [rx_str + 4]
cmp al, REQ
jne ppp_005a
; Debugging output to debug board
pusha
mov esi, RX_IPCP_REQ
call debug_output
popa
mov ebx, 0x04
call TestOptions
cmp edx, 0
jz ppp_005b
mov ecx, PPP_ACK
mov eax, 6
mov [state], eax
jmp ppp_005c
ppp_005b:
mov ecx, REJ
ppp_005c:
mov ebx, IPCP
movzx edx, byte [rx_str + 5]
mov esi, rx_str + 7
call MakePacket
jmp ppp_013
ppp_005a:
cmp al, PPP_ACK
jne ppp_005d
; Debugging output to debug board
pusha
mov esi, RX_IPCP_ACK
call debug_output
popa
mov al, [rx_str + 5]
mov ecx, [number]
cmp al, cl
jne ppp_013
mov eax, 7
mov [state], eax
mov eax, 5800
call settimer
mov eax, IPOnp
mov [prompt], eax ; set up prompt to display
mov al,[IPOnp_len]
mov [prompt_len], al
call draw_window
jmp ppp_013
ppp_005d:
cmp al, PPP_NAK
jne ppp_005e
; Debugging output to debug board
pusha
mov esi, RX_IPCP_NAK
call debug_output
popa
mov al, [rx_str + 10]
mov [addr1], al
mov al, [rx_str + 11]
mov [addr2], al
mov al, [rx_str + 12]
mov [addr3], al
mov al, [rx_str + 13]
mov [addr4], al
pusha
call draw_window
mov eax,52
mov ebx,3
mov cl, [addr4]
shl ecx, 8
mov cl, [addr3]
shl ecx, 8
mov cl, [addr2]
shl ecx, 8
mov cl, [addr1]
int 0x40 ; Set the stacks IP address
popa
mov ebx, IPCP ;; added 28/4/03
mov ecx, REQ
movzx edx, byte [rx_str + 5]
mov esi, rx_str + 7
call MakePacket
jmp ppp_013
ppp_005e:
cmp al, REJ
jne ppp_005f
jmp ppp_013
ppp_005f:
cmp al, TERM
jne ppp_013
jmp ppp_013
ppp_006:
cmp eax, IP
jne ppp_007
;;
;;
;;
;; This is where we will pass the IP packet up to the stack
;;
;;
;;
mov eax, 52
mov ebx, 6
mov edx, 1500 ; this should be exact amount
mov esi, rx_str + 4
int 0x40
; Debugging output to debug board
pusha
mov esi, RX_IP
call debug_output
popa
jmp ppp_013
ppp_007:
cmp eax, CCP
jne ppp_008
mov al, [rx_str + 4]
cmp al, REQ
jne ppp_013
; Debugging output to debug board
pusha
mov esi, RX_CCP_REQ
call debug_output
popa
mov ebx, 0x04
call TestOptions
cmp edx, 0
jz ppp_007b
mov ecx, PPP_ACK
jmp ppp_007c
ppp_007b:
mov ecx, REJ
ppp_007c:
mov ebx, CCP
movzx edx, byte [rx_str + 5]
mov esi, rx_str + 7
call MakePacket
jmp ppp_013
ppp_008:
cmp eax, 0
jz ppp_009
jmp ppp_013
ppp_009:
mov eax, [tx_end]
cmp eax, 0
jnz ppp_010
call gettimer
cmp eax, 100
jle ppp_010
mov eax, [state]
cmp eax, 0
je ppp_009a
cmp eax, 2
jne ppp_010
ppp_009a:
; Debugging output to debug board
pusha
mov esi, TX_LCP_REQ
call debug_output
popa
inc [number]
mov eax, 0
call settimer
mov ebx, LCP
mov ecx, REQ
mov edx, [number]
mov esi, LCPREQStr
call MakePacket
jmp ppp_013
ppp_010:
mov eax, [tx_end]
cmp eax, 0
jnz ppp_011
call gettimer
cmp eax, 100
jle ppp_011
mov eax, [state]
cmp eax, 4
jne ppp_011
mov eax, 0
call settimer
inc [number]
; Debugging output to debug board
pusha
mov esi, TX_PAP_REQ
call debug_output
popa
mov ebx, PAP
mov ecx, REQ
mov edx, [number]
mov esi, PAPREQStr
call MakePacket
jmp ppp_013
ppp_011:
mov eax, [tx_end]
cmp eax, 0
jnz ppp_012
call gettimer
cmp eax, 100
jle ppp_012
mov eax, [state]
cmp eax, 6
jne ppp_012
inc [number]
mov eax, 0
call settimer
; Debugging output to debug board
pusha
mov esi, TX_IPCP_REQ
call debug_output
popa
mov ebx, IPCP
mov ecx, REQ
mov edx, [number]
mov esi, IPCPREQStr
call MakePacket
jmp ppp_013
ppp_012:
mov eax, [tx_end]
cmp eax, 0
jnz ppp_013
mov eax, [state]
cmp eax, 7
jne ppp_013
; 10ms Delay suggested by Ville
mov eax,23 ; over here
mov ebx,1
int 0x40
call gettimer
cmp eax, 200
jle ppp_012a
; every 2s, when things are quiet, redraw window
call draw_window_limited
mov eax, 0
call settimer
ppp_012a:
mov eax, 52
mov ebx, 8
mov esi, ip_buff
int 0x40
cmp eax, 0
je ppp_013
call MakeIPPacket
; Debugging output to debug board
pusha
mov esi, TX_IP
call debug_output
popa
ppp_013:
mov eax, [packet]
cmp eax, 0
jz PPPLoop
mov eax, 0
mov [packet], eax
mov edi, rx_str
mov ecx, MaxRx + 1
rep stosb
jmp PPPLoop
;****************************************************************************
; Function
; calc
;
; Description
; Adds a character to the CRC checksum
; byte in lsb of eax
;
;
;****************************************************************************
calc:
and eax, 0xFF
push ecx
mov ecx, 8
calc_001:
test al, 0x01
jz calc_002
shr eax, 1
xor eax, 0x8408
and eax, 0xffff
jmp calc_003
calc_002:
shr eax, 1
calc_003:
loop calc_001
pop ecx
ret
;****************************************************************************
; Function
; add2tx
;
; Description
; Adds a character into the tx buffer
; byte in low byte of eax
;
;
;****************************************************************************
add2tx:
pusha
mov esi, tx_str
add esi, [tx_ptr]
inc [tx_ptr]
mov [esi], al ; Save byte in buffer
mov ecx, [checksum2]
and eax, 0xff
xor eax, ecx
call calc
shr ecx, 8
and ecx, 0xff
xor eax, ecx
mov [checksum2], eax
popa
ret
;****************************************************************************
; Function
; MakeIPPacket
;
; Description
; Creates a PPP packet for transmission to the host from the
; IP packet extracted from the stack
;
; IP data is in ip_buff
;
;****************************************************************************
MakeIPPacket:
mov [tx_ptr], dword 1
mov edi, tx_str
mov [edi], byte ' '
mov eax, 0xffff
mov [checksum2], eax
mov al, 0xff
call add2tx
mov al, 3
call add2tx
mov al, IP / 256
call add2tx
mov al, IP
call add2tx
movzx ecx, byte [ip_buff + 3]
mov ch, byte [ip_buff + 2]
mov esi, ip_buff
mip001:
mov al, byte [esi]
call add2tx
inc esi
loop mip001
mov eax, [checksum2]
not eax
call add2tx
shr eax, 8
call add2tx
mov eax, [tx_ptr]
mov [tx_end], eax
xor eax, eax
mov [tx_ptr], eax
ret
;****************************************************************************
; Function
; MakePacket
;
; Description
; Creates a PPP packet for transmission to the host
;
; Packet type in ebx
; Code is in ecx
; num is in edx
; str is pointed to by esi
;
;****************************************************************************
MakePacket:
mov [tx_ptr], dword 1
mov edi, tx_str
mov [edi], byte ' '
mov eax, 0xffff
mov [checksum2], eax
mov al, 0xff
call add2tx
mov al, 3
call add2tx
mov al, bh ; packet/256
call add2tx
mov al, bl ; packet&255
call add2tx
cmp ebx, IP ; is packet type IP?
jne mp_001 ; No - its a lower layer packet
; Do IP packet assembly
jmp mp_002
mp_001:
; Do PPP layer packet assembly
mov al, cl
call add2tx
mov al, dl
call add2tx
mov al, 0
call add2tx
movzx ecx, byte [esi] ; length = *str - 3
sub ecx, 3
mp_002: ; Now copy the data acros
mov al, byte [esi]
call add2tx
inc esi
loop mp_002
mov eax, [checksum2]
not eax
call add2tx
shr eax, 8
call add2tx
mov eax, [tx_ptr]
mov [tx_end], eax
xor eax, eax
mov [tx_ptr], eax
ret
;****************************************************************************
; Function
; TestOptions
;
; Description
; Test a PPP packets options fields for valid entries
;
; option ebx
;
; Returns result in edx, but may also modify rx_str
;
;****************************************************************************
TestOptions:
mov esi, 8 ; ptr1
mov edi, 8 ; ptr2
mov edx, 3 ; edx is the return value
movzx ecx, byte [rx_str + 7]
add ecx, 4 ; ecx is size
cmp ecx, MaxRx
jle to_001
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -