4 byte còn lại chứa thông tin riêng của từng loại bản tin Trong trường hợp bản tin “Echo Request” và “Echo Reply” thì đây là số nhận dạng (ID) và số tuần tự của bản tin.

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

Request” và “Echo Reply” thì đây là số nhận dạng (ID) và số tuần tự của bản tin.

Vậy ta cần khai báo cấu trúc của bản tin ICMP vào trong file “packet.h”:Code: Code:

//--- ---

//Cau truc ICMP header struct ntICMPHeader {

unsigned char Type; unsigned char Code; unsigned int Checksum; unsigned int ID;

unsigned int seqNumber; };

#define ICMP_HEADER_LEN 8

#define ICMP_TYPE_ECHOREPLY 0 #define ICMP_TYPE_ECHOREQUEST 8

Tiếp theo ta tạo file source và file header cho module giao thức ICMP.Nội dung ban đầu của file “icmp.c” Nội dung ban đầu của file “icmp.c”

Code:

//--- // Writen by NTTam - PTITHCM

//--- #include "packet.h" #include "ethernet.h" #include "arp.h" #include "ip.h" #include "icmp.h" Và file “icmp.h” Code: //--- // Writen by NTTam - PTITHCM

//---

//======================================================================================

// icmp.h

//======================================================================================// This is header file for icmp.c // This is header file for icmp.c

// Writen by NTTam // PTITHCM // Ver 1.0 //====================================================================================== #ifndef ICMP_H #define ICMP_H //--- #include "packet.h" //--- #endif //ICMP_H

Bây giờ ta bắt tay vào viết code:

Đầu tiên là hàm xử lý khi nhận được bản tin “Echo Request” (tức là có máy tính “ping” đến board mạch. board mạch.

Code:

//Ham xu ly goi ICMP nhan duoc

void icmpIpIn(struct ntIPHeader* ipHeader) {

struct ntICMPHeader* icmpHeader;

icmpHeader = (struct ntICMPHeader*)((unsigned char*)ipHeader + IP_HEADER_LEN); // check ICMP type

switch(icmpHeader->Type) { case ICMP_TYPE_ECHOREQUEST: // echo request icmpEchoReply(ipHeader); break; default: break; } }

Chức năng hàm này khá đơn giản: ta kiểm tra trường “Type” để xem đây có đúng là bản tin “Echo Request” hay không. Nếu đúng ta gọi hàm icmpEchoReply (sẽ viết kế tiếp) để trả lờị “Echo Request” hay không. Nếu đúng ta gọi hàm icmpEchoReply (sẽ viết kế tiếp) để trả lờị Tiếp theo là hàm icmpEchoReply để gửi bản tin “Echo Reply” để trả lời cho bản tin “Echo Request”

Code:

//---//Ham gui di ban tin tra loi cho Echo Request (Echo Reply) //Ham gui di ban tin tra loi cho Echo Request (Echo Reply)

void icmpEchoReply(struct ntIPHeader* ipHeader) {

unsigned long tempIp; unsigned char* ethFrame;

struct ntICMPHeader* icmpHeader;

icmpHeader = (struct ntICMPHeader*)((unsigned char*)ipHeader + IP_HEADER_LEN); icmpHeader->Type = ICMP_TYPE_ECHOREPLY;

icmpHeader->Checksum = 0;

icmpHeader->Checksum = ipChecksum((unsigned char*)icmpHeader, HTONS(ipHeader->Len)- IP_HEADER_LEN);

tempIp = ipHeader->desIPAđr;

ipHeader->desIPAđr = ipHeader->srcIPAđr; ipHeader->srcIPAđr = tempIp;

ethFrame = ((unsigned char*)ipHeader); ethFrame -= ETH_HEADER_LEN; arpIpOut(ethFrame, 0); #ifdef ICMP_DEBUG icmpPrintHeader(ipHeader); #endif ethSendFrame(HTONS(ipHeader->Len)+ETH_HEADER_LEN, ethFrame); }

Nội dung thực hiện trong hàm này khá đơn giản:

- Ta điền các nội dung cần thiết cho bản tin Echo Replỵ- Gọi giao thức ARP để phân giải địa chỉ - Gọi giao thức ARP để phân giải địa chỉ

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