完成函数 void eth_dispatch(unsigned char eth); 输入为帧的第一个字节的指针,要求返回源MAC的首地址。要求解析帧中的类型字段,根据类型编码确定该帧封装是IP,ARP或其他协议包。注意网络字节顺序可能与本地字节训练不同。已经IP协议对应的帧类型代码是0x0800,ARP协议对应的帧类型是0x0806。
时间: 2023-05-28 08:06:38 浏览: 54
void eth_dispatch(unsigned char* eth) {
unsigned char* src_mac = eth + 6; // 源MAC地址在帧的第7个字节开始
unsigned short type = (eth[12] << 8) | eth[13]; // 类型字段在帧的第13和14个字节
if (type == 0x0800) {
// IP协议
// TODO: 解析IP协议头
} else if (type == 0x0806) {
// ARP协议
// TODO: 解析ARP协议头
} else {
// 其他协议
// TODO: 解析其他协议头
}
return src_mac;
}
相关问题
任务1:完成函数 unsigned char* get_eth_dst_addr(unsigned char eth); 输入为帧的第一个字节的指针,要求返回目的MAC的首地址。
由于目的MAC地址在帧中的偏移量为0,因此可以直接返回输入指针,即:
```c++
unsigned char* get_eth_dst_addr(unsigned char* eth) {
return eth;
}
```
根据给定的参数创建以太网帧。不需要计算帧的校验码。 实现函数: int generate_eth_frame(unsigned char *input_eth, unsigned char *output_eth, unsigned short type, char *data, int d ata_len); 参数: input_eth,输入的帧,从中获取该帧的源/目的地址 output_eth,创建的帧,其源地址为input_eth的目的地址;其目的地址为input_eth的源地址。注意输入和输出帧的地址位置互换。 type,为创建帧指定的帧类型,注意字节顺序。 data,为创建帧封装的数据 data_len,为输入字符串的长度,注意如果封装的数据长度太短,还需要填充,以满足以太网冲突检测的需要。 返回: 创建的帧长度,即以太网协议的首部及数据,不包括帧校验码
。#include <string.h>
int generate_eth_frame(unsigned char *input_eth,
unsigned char *output_eth,
unsigned short type,
char *data,
int data_len)
{
// 交换源/目的地址
memcpy(output_eth, input_eth + 6, 6);
memcpy(output_eth + 6, input_eth, 6);
// 设置帧类型
output_eth[12] = type >> 8;
output_eth[13] = type & 0xff;
// 封装数据
memcpy(output_eth + 14, data, data_len);
int frame_len = 14 + data_len;
// 如果数据长度不足46字节,填充0
if (frame_len < 46) {
memset(output_eth + frame_len, 0, 46 - frame_len);
frame_len = 46;
}
return frame_len;
}