[ENC28J60] Bài 7: Giao thức ARP ( phần 2)

arp

Trong bài trước, chúng ta đã tìm hiểu về giao thức ARP và đã có thể bắt được cái gói tin ARP request được gửi tới. Và ở bài này, chúng ta sẽ viết chương trình để trả lời các ARP reques đó ( ARP reponse)

Các gói tin ARP sẽ được xử lí ở thư viện ARP, nên mình sẽ tạo thêm 2 file arp.carp.h và add vào project như đã nói ở các bài trước ( vào Project -> Configure để add file arp.c )

Ở file arp.h các bạn copy khối code cơ bản

Tương tự với file arp.c

Trong file net.h các bạn add thêm thư viện arp.h

Đồng thời trong file net.c , bỏ comment cho hàm ARP_read_packet vì chúng ta sẽ viết hàm này ngay bây giờ

Giờ mình mới để ý lời gọi hàm ARP_read_packet trong file net.c mình viết sai. Các bạn sửa lại cho đúng nhé ! ARP_read_packet(net_buffer,len);

Tạo hàm ARP_read_packet trong file arp.c và khai báo nguyên mẫu hàm cho nó vào file arp.h

Chúng ta đã nhận được 1 gói tin ARP, công việc bây giờ là :

  • Kiểm tra xem gói tin ARP này thuộc loại gì: ARP request hay ARP reponse bằng cách check trường Opcode tại vị trí byte thứ 20 21
  • Nếu đó là ARP request thì phải chuẩn bị gói tin trả lời lại
  • Nếu đó là ARP reponse, kiểm tra địa chỉ MAC đích xem có đúng là nó reponse chi mình không, nếu không trùng MAC của mình thì bỏ qua. Nếu đúng là nó gửi cho mình thì tiến hành lưu MAC của thằng đã reponse vào bảng để sử dụng

Chà ! Khối lượng công việc khá nhiều đây, chúng ta sẽ làm dần từng ý một

Bây giờ mình sẽ gán cho chip của chúng ta 1 địa chỉ IP, do IP này là IP cố định dễ có khả năng trùng IP với thiết bị trong mạng, nên mình sẽ lấy 1 IP có giá trị cao 1 chút 192.168.1.197 đi

Các bạn click chuột vào con chip ENC28J60 trong mô phỏng, điền IP mà mình gán cho nó vào

Tương tự, trong file enc28j60.c, cạnh chỗ khai báo MAC, mình cũng khai báo IP 192.168.1.197 vô

Và khái báo lại ip với mac ở các file thư viện .c khác bằng cú pháp extern

Tiếp tục với nội dung hàm ARP_read_packet

Giải thích: Sau khi lấy được các thông tin trong gói arp, chúng ta kiểm tra Opcode xem nó có phải là arp request không, nếu đúng tiếp tục kiểm tra xem ARP request này có ip đích trùng với ip của mình không ! nếu không trùng thì bỏ qua ! Nếu đúng thì sẽ in ra đong debug là đã nhận được 1 arp request

Chúng ta sẽ test thử xem code đã hoạt động chưa nhé. Mình sẽ dùng máy tính để gửi 1 arp request tới ip của enc28j60

Trước đó mình sẽ commnet mấy dòng debug (UART_putString) ở các file enc28j60.cnet.c đi vì chúng ta đã test các hàm đó hoạt động rồi, in ra lắm cũng ngứa mắt

Bây giờ mình sẽ dùng phần mềm herculer, chức năng UDP để cho nó gửi thử 1 arp request xem chíp có bắt được không nhé !

Chỗ module IP mình sẽ điền IP của ENC28j60 (ip đích)

Các bạn gửi thử 1 nội dung bất kì, phần mềm herculer sẽ tự động gửi request tới ip đã điền

OK, chúng ta đã bắt được arp request

Bây giờ mình sẽ viết thêm code để phản hồi lại nhé

Giải thích:

Mình tạo 1 Struct theo cấu trúc của 1 gói tin trong giao thức ARP, sau đó điền các thông tin như địa chỉ MAC đích, Mac nguồn, IP đích, IP nguồn và gọi hàm NET_SendFrame để gửi tra lại gói tin ARP reponse

Và giờ, WireShark đã bắt được bản tin ARP reponse của ENC28J60

Thật tuyệt, tới thời điểm bây giờ chúng ta đã bắt được 1 gói tin ARP request và phản hồi lại cho thằng request 1 bản tin ARP reponse

Trong bài tiếp theo, chúng ta sẽ tự gửi đi 1 ARP request và bắt lại gói tin ARP reponse và thiết kế bảng lưu địa chỉ MAC cho giao thức ARP

Các bạn có thể tải source cho bài này ở đây

 

Từ tác giả:

Nếu có bất kì thắc mắc nào trong bài viết, vui lòng để lại comment dưới mỗi bài ! Mình sẽ không trả lời thắc mắc của các bạn ở facebook hay email !

Nếu trong phần code bạn nhìn thấy nhưng thứ kiểu như &amp; thì đó là lỗi hiển thị, cụ thể 3 kí tự < > & bị biến đổi thành như thế
&amp; là &
&lt;  là <
&gt; là >

Giới thiệu Đào Nguyện 80 bài viết
DIY,chế cháo, viết blog chia sẽ kiến thức về lập trình,điện tử - IoT. Rất mong được giao lưu, kết bạn với các bạn cùng đam mê. Địa chỉ Facebook: https://www.facebook.com/nguyendao207

1 bình luận

Đã đóng bình luận.