Ethernet MAC

M

Mudugamuwa

Guest
Chào,

Tôi đang thiết kế một MAC Ethernet với VHDL.Vấn đề là tôi có đối với Công ước vào cuối Ethernet frame.

Tôi muốn biết từ đâu tôi đã bắt đầu tính toán CRC.Từ sách nó nói từ các dữ liệu nhất định từ các lớp phía trên (lớp 3) trong ISO phân cấp.Theo đó các byte đầu tiên của lớp 3 là 'IP Phiên bản' là 0x04.Vì vậy, các bit đầu tiên trở thành số không.Đây là một vấn đề với tôi cos tôi nghĩ là bit đầu tiên nên '1 'để tính toán một CRC.Vì vậy, tôi muốn biết tôi nên bắt đầu từ vị trí đầu tiên '1 'để tính toán CRC.

Tôi thực sự biết ơn cho bất cứ ai có thể giúp đỡ.

Lời chúc mừng tốt đẹp nhất,
Sudeera.

 
Lấy một bản sao của chính thức của Ethernet spec "IEEE Std 802,3-2.005" (đó là một download miễn phí), và bắt đầu với phần "3.2.8 Kiểm tra Frame Sequence (FCS) lĩnh vực".
http://standards.ieee.org/getieee802/
http://standards.ieee.org/getieee802/802.3.html

 
Giá trị CRC được tính bằng cách sử dụng các thuật toán sau đây.Các tiêu đề giả được thêm vào trước khi tiêu đề ip.

Mã số:

struct pseudo_IP_header / * IP giả tiêu đề (checksum calc) * /

(unsigned long int nguồn, đích;

char zero_byte, giao thức;

unsigned short TCP_UDP_len;

);/ * Caculate checksum * /

unsigned short in_cksum (unsigned short * addr, int len)

(

đăng ký nleft int = len;

đăng ký unsigned short * w = addr;

đăng ký tổng int = 0;

unsigned short câu trả lời = 0;trong khi (nleft> 1)

(

sum = * w ;

nleft -= 2;

)nếu (nleft == 1)

(

* (u_char *) (& answer) = * (u_char *) w;

sum = câu trả lời;

)sum = (sum>> 16) (tổng hợp & 0xffff);

sum = (sum>> 16);

answer = ~ sum;

trở lại (trả lời);

)/ *

sửa chữa checksum tcp

* /

void fix_tcp_checksum (unsigned char * buf)

(

char sp_pseudo_ip_construct [PKT_BUF_SIZE];

struct tcphdr * sp_help_tcp;

struct pseudo_IP_header * sp_help_pseudo;

struct iphdr * ip_hdr;memset (sp_pseudo_ip_construct, 0, PKT_BUF_SIZE);sp_help_tcp = (struct tcphdr *) (buf IP_HEAD_BASE);

sp_help_pseudo = (struct pseudo_IP_header *) sp_pseudo_ip_construct;

ip_hdr = (struct iphdr *) buf;sp_help_tcp-> kiểm tra = 0;sp_help_pseudo-> source = ip_hdr-> saddr;

sp_help_pseudo-> đích = ip_hdr-> daddr;

sp_help_pseudo-> zero_byte = 0;

sp_help_pseudo-> protocol = 6;

sp_help_pseudo-> TCP_UDP_len =

htons (ntohs (ip_hdr-> tot_len) - ip_hdr-> ihl * 4);memcpy (sp_pseudo_ip_construct 12, sp_help_tcp,

ntohs (ip_hdr-> tot_len) - ip_hdr-> ihl * 4);

sp_help_tcp-> kiểm tra =

in_cksum ((unsigned short *) sp_pseudo_ip_construct,

ntohs (ip_hdr-> tot_len) - ip_hdr-> ihl * 4 12);

)

 
Không, đó là một kiểm tra IP.Nó không liên quan đến khung Ethernet CRC.

 
Tôi đã nói với bạn ....tại sao bạn yêu cầu một lần nữa?

 
CRC thường được tính từ MSB.Vì vậy, tôi nghĩ bạn nên thiết kế theo cách đó."Dữ liệu và máy tính Mạng" Bởi Stallings là một tài liệu tham khảo tốt cho bạn.

 
Ông có thể xin vui lòng gửi cho tôi một liên kết cho cuốn sách đó.Tôi tìm kiếm nơi ebook Edaboard.Nhưng có một giải pháp đã được chỉ dẫn sử dụng.Tôi đoán bạn không phải nói về điều đó.

Cảm ơn!
Mudu ...

 

Welcome to EDABoard.com

Sponsor

Back
Top