Tôi đang cố gửi một khung ethernet OAM bằng cách sử dụng ổ cắm thô. Tôi đã thành công khi làm như vậy.chức năng sendto không sử dụng địa chỉ MAC được cung cấp trong struct sockaddr_ll khi gửi các gói dữ liệu thô
Các gửi chức năng tôi đã viết là:
int send_frame(sock_info *info,char *buf,int length)
{
struct sockaddr_ll dest_addr;
memset(&dest_addr,0,sizeof(struct sockaddr_ll));
dest_addr.sll_family = PF_PACKET;
dest_addr.sll_protocol = htons(8902);
dest_addr.sll_ifindex = info->if_index;
dest_addr.sll_halen = ETH_MAC_ADDR_LEN;
dest_addr.sll_pkttype = PACKET_OTHERHOST;
dest_addr.sll_hatype = ARPHRD_ETHER;
memset(dest_addr.sll_addr,0,8);
dest_addr.sll_addr[0] = 0x00;
dest_addr.sll_addr[1] = 0xE0;
dest_addr.sll_addr[2] = 0x0C;
dest_addr.sll_addr[3] = 0x00;
dest_addr.sll_addr[4] = 0x95;
dest_addr.sll_addr[5] = 0x02;
return sendto(info->sock_fd, buf, length, 0, (struct sockaddr*) &dest_addr, sizeof(struct sockaddr_ll));
}
tôi đã không thể nắm bắt được gói tin sử dụng Wireshark. Sau khi tryiing quá nhiều thứ, tôi phát hiện ra rằng bộ đệm được sử dụng để gửi nên có tất cả các lĩnh vực khung ethernet (bắt đầu từ địa chỉ đích). Khi tôi thêm địa chỉ đích và nguồn và các trường ethernet khác vào bộ đệm, tôi đã có thể nắm bắt gói tin bằng cách sử dụng wireshark. Vì vậy, chức năng gửi không sử dụng địa chỉ MAC được lưu trữ trong dest_addr.sll_addr
.
Câu hỏi của tôi là, Sau đó, nhu cầu của trường sll_addr
trong số struct sockaddr_ll
là gì? Hướng dẫn sử dụng nói rằng đó là địa chỉ MAC đích.