Các hàm trong Linu

Một phần của tài liệu đề tài phần mềm bảo mật mạng dùng giao thức ip quyển 4a các phần mềm bảo mật gói ip trên hệ điều hành linux (Trang 34 - 37)

5. Nhận thông điệp

5.3 Các hàm trong Linu

Trong mục này chúng tôi chỉ ra danh sách các hàm của Linux kernel đ−ợc coi là quan trọng trong việc nhận thơng điệp, đồng thời phân tích cách làm việc của source code. Các lời gọi hàm thiết lập mạng bắt đầu từ hàm DEVICE_rx(), và các lời gọi hàm ngắt ứng dụng bắt đầu từ hàm sock_read().

Functions/File Descriptions

DEVICE_rx() có trong

tệp

drivers/net/DEVICE.c

-hàm này phụ thuộc vào thiết bị (lấy điều khiển từ ngắt) -thực hiện kiểm tra trạng thái để chắc chắn là nó đang nhận -gọi hàm dev_alloc_skb() để dành ra một không gian nhớ cho gói tin

-lấy gói tin từ bus hệ thống

-gọi hàm dev_alloc_skb() để chỉ ra kiểu giao thức -gọi hàm netif_rx()

-cập nhật trạng thái của card, trả về ngắt. inet_recvmsg() có

trong tệp

net/ipv4/af_inet.c

-trích con trỏ socket sock

-kiểm tra socket để chắc chắn rằng nó đã chấp nhận -kiểm tra con trỏ tới giao thức

-giá trị trả về của hàm là sk->prot[tcp/udp]- >recvmsg().

ip_rcv() có trong tệp

net/ipv4/ip_input.c -thực hiện việc kiểm tra lỗi cho gói tin: +sai về độ dài (quá ngắn hoặc quá dài)

+sai về phiên bản (không phải ipv4) +sai về giá trị tổng kiểm tra

-gọi hàm __skb_trim() để xoá bộ đệm -tách gói tin (defrags packet) nếu cần thiết

-gọi hàm ip_route_input() để định tuyến cho gói tin -kiểm tra và điều khiển các tuỳ chọn IP

-giá trị trả về của hàm là skb->dst->input() [= tcp_rcv,udp_rcv()].

net_bh() có trong tệp

net/core/dev.c -hàm này thực thi bởi trình lập lịch -nếu có nhiều gói tin đang đợi đi ra thì gọi hàm qdisc_run_queues() (xem phần gửi thơng điệp)

-trong khi hàng đợi backlog mà khơng rỗng thì thực hiện: +cho phép nửa d−ới thực thi

+gọi hàm skb_dequeue() để lấy gói tiếp theo

+nếu gói tin cho nhiều ng−ời thì đ−a nó lên hàng đợi gửi (FASTROUTED)

+lặp trong các danh sách giao thức đến khi tìm đ−ợc đúng kiểu của giao thức

+gọi hàm pt_prev->func() [= ip_rcv()] để đ−a gói tin tới giao thức t−ơng ứng

-sau đó gọi hàm qdisc_run_queues() để đ−a tới đầu ra (nếu cần).

netif_rx() có trong tệp

net/core/dev.c -đ−a thời gian vào trong skb->stamp -nếu hàng đợi backlog q đầy thì ngừng gói tin lại

-nếu không:

+ gọi hàm skb_queue_tail() để đ−a gói tin vào trong hàng đợi backlog

+đánh dấu cho lần thực thi sau.

sock_def_readable()

có trong tệp

net/core/sock.c

-gọi hàm wake_up_interruptible() để đ−a các tiến trình đang đợi sử lý lên hàng đợi thực thi

sock_queue_rcv_skb()

có trong tệp

include/net/sock.h

-gọi hàm skb_queue_tail() để đẩy gói tin vào trong hàng đợi nhận socket

-cuối cùng là gọi hàm sk->data_ready() [=

sock_def_readable()]. sock_read() có trong

tệp net/socket.c

-thiết lập các header của thông báo

-giá trị trả về là kết quả đọc đ−ợc là hàm sock_recvmsg().

sock_recvmsg() có

trong tệp net/socket.c

-đọc scm (socket management packet) hoặc gói tin qua lời gọi hàm sock->ops[inet]- >recvmsg().

tcp_data()có trong tệp

net/ipv4/tcp_input.c -rút ngắn hàng đợi nhận (nếu cần) -gọi hàm tcp_data_queue() để đ−a gói ra hàng đợi

-gọi sk->data_ready() để đánh thức socket.

tcp_data_queue()có

trong tệp

net/ipv4/tcp_input.c

-kiểm tra nếu gói tin ở ngồi dãy trong hàng đợi thì: +nếu nó đã cũ thì huỷ bỏ ngay lập tức

+nếu khơng thì l−u nó vào vị trí t−ơng ứng

-sau đó gọi hàm __skb_queue_tail() để đ−a gói tin lên hàng đợi nhận của socket

-cuối cùng nó làm nhiệm vụ cập nhật trạng thái kết nối.

tcp_rcv_established( ) có trong tệp

net/ipv4/tcp_input.c

-hàm này thực hiện việc kiểm tra nếu là fast path thì: +kiểm tra tất cả các cờ và thông tin về header +gửi ACK

+sau đó gọi hàm _skb_queue_tail() để đ−a gói tin vào hàng đợi nhận của socket

-nếu là slow path thì:

+nếu khơng nằm trong dãy hàng đợi thì gửi ACK và bỏ gói đó

+kiểm tra các tín hiệu FIN, SYN, RST, ACK +gọi hàm tcp_data() để đ−a gói tin vào hàng đợi +cuối cùng là gửi ACK

tcp_recvmsg() có trong

tệp net/ipv4/tcp.c

-tiến hành kiểm tra các lỗi

-chờ cho đến khi có tối thiểu một gói tin -sau đó xố socket nếu kết nối đã đóng

-gọi hàm memcpy_toiovec() để copy payload từ bộ đệm socket vào trong không gian ng−ời dùng

-gọi hàm cleanup_rbuf() để giải phóng bộ nhớ và gửi ACK nếu cần thiết

-cuối cùng gọi hàm remove_wait_queue() để đánh thức tiến trình (nếu cần).

udp_queue_rcv_skb()

có trong tệp

net/ipv4/udp.c

-gọi hàm sock_queue_rcv_skb()

-cập nhật trạng thái UDP (xoá skb nếu hàng đợi bị lỗi). udp_rcv()có trong tệp

net/ipv4/udp.c -lấy UDP header, lọc gói tin, kiểm tra checksum (nếu cần) -kiểm tra multicast

-gọi hàm udp_v4_lookup() để tìm đúng gói tin cho socket -nếu khơng tìm thấy socket thì gửi thơng báo ICMP trở lại đồng thời giải phóng skb và ngừng

-cuối cùng nó gọi hàm udp_deliver() [=

udp_recvmsg() có trong

tệp net/ipv4/udp.c -gọi hàm skb_recv_datagram() để lấy gói tin trong hàng đợi -gọi hàm skb_copy_datagram_iovec() để chuyển payload từ trong bộ đệm của socket vào trong không gian ng−ời dùng -cập nhật thời gian của socket

điền thông tin về nguồn tin vào header của thơng điệp -việc cuối cùng là giải phóng bộ nhớ của gói tin.

Một phần của tài liệu đề tài phần mềm bảo mật mạng dùng giao thức ip quyển 4a các phần mềm bảo mật gói ip trên hệ điều hành linux (Trang 34 - 37)