【发布时间】:2013-04-20 14:00:37
【问题描述】:
我正在尝试使用原始套接字发送 OAM 以太网帧。我成功地这样做了。
我写的发送函数是:
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));
}
我无法使用wireshark 捕获数据包。在尝试了太多东西之后,我发现用于发送的缓冲区应该具有所有以太网帧字段(从目标地址开始)。当我将目标地址和源地址以及其他以太网字段添加到缓冲区中时,我能够使用wireshark 捕获数据包。所以发送函数不使用dest_addr.sll_addr中存储的MAC地址。
我的问题是,那么struct sockaddr_ll 中的sll_addr 字段需要什么?手册上说是目的MAC地址。
【问题讨论】:
标签: c linux sockets network-programming