Trong hàm này, ta có sử dụng 1 giá trị là TTL (Time To Live) để điền vào trường TTL trong Header IP (xem lại cấu trúc Header IP). Giá trị này cần được định nghĩa trước. Ta thêm định Header IP (xem lại cấu trúc Header IP). Giá trị này cần được định nghĩa trước. Ta thêm định nghĩa này vào file “ip.h”:
Code:
#define IP_TIME_TO_LIVE 128 //gia tri Time-To-Live
(TTL) mặc định cho header IP
Có thời gian sẽ giải thích ý nghĩa của trường TTL sau nhé.Và hàm xử lý khi nhận được 1 gói tin IP: Và hàm xử lý khi nhận được 1 gói tin IP:
Code:
//--- ---
//Ham xu ly goi IP, duoc goi boi giao thuc ethernet khi paket type duoc xac dinh la IP
void IPProcess(unsigned int len, struct ntIPHeader* packet) {
// check IP ađressing, stop processing if not for me and not a broadcast
if( (HTONL(packet->desIPAđr) != ipGetConfig()->ip) &&
(HTONL(packet->desIPAđr) != (ipGetConfig()->ip|ipGetConfig()- >netmask)) &&
(HTONL(packet->desIPAđr) != 0xFFFFFFFF) ) return;
// handle ICMP packet
if( packet->Protocol == IP_PROTO_ICMP ) {
#ifdef IP_DEBUG
printf("IP->Rx: ICMP/IP packet\r\n"); //icmpPrintHeader((icmpip_hdr*)packet); #endif
icmpIpIn((struct ntIPHeader*)packet); }
else if( packet->Protocol == IP_PROTO_UDP ) {
#ifdef IP_DEBUG
printf("IP->Rx: UDP/IP packet\r\n");
//debugPrintHexTable(NetBufferLen-14, &NetBuffer[14]); #endif
UDPProcess(len, ((struct ntIPHeader*)packet) ); }
else if( packet->Protocol == IP_PROTO_TCP ) {
#ifdef IP_DEBUG
printf("IP->Rx: TCP/IP packet\r\n"); #endif
TCPProcess((unsigned char *)packet,len-((packet->verHdrLen & 0x0F)<<2)); } else { #ifdef IP_DEBUG printf("IP->Rx: IP packet\r\n"); #endif } } //--- --- Giải thích:
- Khi nhận được 1 gói IP, việc đầu tiên giao thức IP cần làm là kiểm tra lại địa chỉ IP xem có phải là gửi cho mình không: và ta chỉ nhận nếu đúng địa chỉ hoặc địa chỉ là IP broadcast (lưu ý đây là