babyos2(39) network(5) -- icmp echo request, reply, receive

前面为babyos2 实现了发送IP数据报,但只测试了同一个局域网内发送,而当目的IP跟发送发自己的IP不在同一局域网内时,babyos2会把IP数据报发往网关。而如何测试是否发送成功,首先想到的是ping。ping使用ICMP(Internet控制报文协议)。

ICMP经常被认为是 IP层的一个组成部分。它传递差错报文以及其他需要注意的信息。ICMP报文通常被 IP层或更高层协议( TCP或UDP)使用。一些 ICMP报文把差错报文返回给用户进程。

ICMP报文有多种类型,如请求回显,回显应答,目的不可达,源端被关闭,重定向,超时,地址掩码请求等。我们这里只关注请求回显和回显应答。


目前从用户态发起ping请求时机还不成熟(需要socket),暂时让babyos2从内核态发送ICMP报文,当收到请求时发送reply,及接收reply等。

1. ICMP 回显请求和回显应答报文格式


class icmp_echo_hdr_t {
public:
    void init(uint8 type, uint8 code, uint16 check_sum, uint16 id, uint16 seq);

public:
    uint8  m_type;
    uint8  m_code;
    uint16 m_check_sum;
    uint16 m_id;
    uint16 m_seq_no;
};
void icmp_echo_hdr_t::init(uint8 type, uint8 code, uint16 check_sum, uint16 id, uint16 seq)
{
    m_type      = type;
    m_code      = code;
    m_check_sum = check_sum;
    m_id        = id;
    m_seq_no    = seq;
}

2. ICMP echo request

bool icmp_t::echo_request(uint32 ip, uint16 id, uint16 seq, uint8* data, uint32 len)
{
    uint32 total = len + sizeof(icmp_echo_hdr_t);
    net_buf_t* buffer = os()->get_net()->alloc_net_buffer(total);
    if (buffer == NULL) {
        console()->kprintf(RED, "ICMP echo_request, alloc net buffer failed, total: %u\n", total);
        return false;
    }

    console()->kprintf(GREEN, &#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值