Gán tạm thời 1 số giá trị cần thiết cho IPHeader để tính checksum: Code:

Một phần của tài liệu ATMEGA32 GIAO TIẾP VỚI ENC28J60 QUA SPI – AVR WEBSERVER (Trang 91)

- Source port và Des port lấy từ thông tin về session tương ứng: Code:

Gán tạm thời 1 số giá trị cần thiết cho IPHeader để tính checksum: Code:

pSession->seqNumber = pSession->seqNumber + len;

Lưu ý (chỗ này lúc viết code mình bị sai, debug mất cả buổi tối): tuy các bản tin SYN và FIN không chứa dữ liệu, nó vẫn được xem là có chiều dài dữ liệu 1 byte, phải tăng số tuần tự lên 1 không chứa dữ liệu, nó vẫn được xem là có chiều dài dữ liệu 1 byte, phải tăng số tuần tự lên 1 đối với các bản tin này:

Code:

if(Flags & (TCP_FIN_FLAG|TCP_SYN_FLAG)) (pSession->seqNumber)++;

Số ACK:Code: Code:

tcpHeader->ackNumber = HTONL(pSession->ackNumber);

Nếu có cờ SYN, như đã nói trên Header TCP sẽ có trường Option chiều dài 8 byte, do đó ta phải ghi giá trị tương ứng cho trường Offset, và tăng biến len lên tương ứng: ghi giá trị tương ứng cho trường Offset, và tăng biến len lên tương ứng:

Code:

if(Flags & TCP_SYN_FLAG){

tcpHeader->Offset = (0x07<<4); len += (TCP_HEADER_LEN + 8);

Nếu không, chiều dài TCP Header là mặc định (đã định nghĩa TCP_HEADER_LEN)Code: Code: }else{ tcpHeader->Offset = (0x05<<4); len += TCP_HEADER_LEN; } Ghi giá trị các cờ Code: tcpHeader->Flags = Flags;

Giá trị trường WindowCode: Code:

tcpHeader->Window = HTONS(pSession->srcWin);//((NETSTACK_BUFFERSIZE- 20-14));

Tạm thời gán checksum = 0 (ta sẽ tính TCP checksum sau)Code: Code:

tcpHeader->Checksum = 0;

Con trỏ khẩn không sử dụng:Code: Code:

tcpHeader->UrgentPtr = 0x0000;

Trỏ đến biến con trỏ ipHeader đến vùng IP Header trên buffer:Code: Code:

ipHeader = (struct ntIPHeader*)(dataBuffer-IP_HEADER_LEN);

Gán tạm thời 1 số giá trị cần thiết cho IP Header để tính checksum:Code: Code: ipHeader->srcIPAđr = HTONL(ipGetConfig()->ip); ipHeader->desIPAđr = HTONL(pSession->desIP); ipHeader->Checksum = HTONS(len); ipHeader->TTL = 0x00; ipHeader->Protocol = IP_PROTO_TCP;

Ở đây các bạn cần tìm hiểu thêm cách tính checksum TCP, nó không chỉ tính checksum phần TCP Header và dữ liệu mà còn tính thêm 1 số trường của IP trong 1 header IP giả, do đó ta phải

Một phần của tài liệu ATMEGA32 GIAO TIẾP VỚI ENC28J60 QUA SPI – AVR WEBSERVER (Trang 91)

Tải bản đầy đủ (DOCX)

(150 trang)
w