199,6 → 199,7 |
last_socket_num dd ? |
last_UDP_port dw ? ; These values give the number of the last used ephemeral port |
last_TCP_port dw ? ; |
socket_mutex MUTEX |
endg |
|
|
232,6 → 233,9 |
xchg al, ah |
mov [last_TCP_port], ax |
|
mov ecx, socket_mutex |
call mutex_init |
|
} |
|
;----------------------------------------------------------------- |
1343,6 → 1347,11 |
|
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_check_port: " |
|
pusha |
mov ecx, socket_mutex |
call mutex_lock |
popa |
|
mov ecx, [eax + SOCKET.Protocol] |
mov edx, [eax + IP_SOCKET.LocalIP] |
mov esi, net_sockets |
1361,10 → 1370,20 |
cmp [esi + UDP_SOCKET.LocalPort], bx |
jne .next_socket |
|
pusha |
mov ecx, socket_mutex |
call mutex_unlock |
popa |
|
DEBUGF DEBUG_NETWORK_VERBOSE, "local port %x already in use\n", bx ; FIXME: find a way to print big endian values with debugf |
ret |
|
.port_ok: |
pusha |
mov ecx, socket_mutex |
call mutex_unlock |
popa |
|
DEBUGF DEBUG_NETWORK_VERBOSE, "local port %x is free\n", bx ; FIXME: find a way to print big endian values with debugf |
mov [eax + UDP_SOCKET.LocalPort], bx |
or bx, bx ; clear the zero-flag |
1815,6 → 1834,11 |
mov [eax + SOCKET.snd_proc], s_error |
mov [eax + SOCKET.rcv_proc], s_error |
|
pusha |
mov ecx, socket_mutex |
call mutex_lock |
popa |
|
; find first free socket number and use it |
mov edi, [last_socket_num] |
.next_socket_number: |
1873,6 → 1897,12 |
|
mov [net_sockets + SOCKET.NextPtr], eax |
or eax, eax ; used to clear zero flag |
|
pusha |
mov ecx, socket_mutex |
call mutex_unlock |
popa |
|
.exit: |
pop ebx |
|
1900,6 → 1930,11 |
push ebx |
|
pusha |
mov ecx, socket_mutex |
call mutex_lock |
popa |
|
pusha |
lea ecx, [eax + SOCKET.mutex] |
call mutex_lock |
popa |
1935,6 → 1970,11 |
call kernel_free |
pop ebx |
|
pusha |
mov ecx, socket_mutex |
call mutex_unlock |
popa |
|
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_free: success!\n" |
|
.error: |
2006,6 → 2046,11 |
|
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_num_to_ptr: num=%u ", ecx |
|
pusha |
mov ecx, socket_mutex |
call mutex_lock |
popa |
|
mov eax, net_sockets |
|
.next_socket: |
2017,10 → 2062,20 |
|
test eax, eax |
|
pusha |
mov ecx, socket_mutex |
call mutex_unlock |
popa |
|
DEBUGF DEBUG_NETWORK_VERBOSE, "ptr=%x\n", eax |
ret |
|
.error: |
pusha |
mov ecx, socket_mutex |
call mutex_unlock |
popa |
|
DEBUGF DEBUG_NETWORK_ERROR, "SOCKET_num_to_ptr: not found\n", eax |
ret |
|
2070,6 → 2125,11 |
|
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_check: %x\n", eax |
|
pusha |
mov ecx, socket_mutex |
call mutex_lock |
popa |
|
push ebx |
mov ebx, net_sockets |
|
2085,6 → 2145,11 |
test eax, eax |
pop ebx |
|
pusha |
mov ecx, socket_mutex |
call mutex_unlock |
popa |
|
ret |
|
|
2132,6 → 2197,11 |
|
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_process_end: %x\n", edx |
|
pusha |
mov ecx, socket_mutex |
call mutex_lock |
popa |
|
push ebx |
mov ebx, net_sockets |
|
2157,6 → 2227,11 |
.done: |
pop ebx |
|
pusha |
mov ecx, socket_mutex |
call mutex_unlock |
popa |
|
ret |
|
|