⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 icmp.c

📁 motorola 针对coldfire 5275 评估板的Dbug bootloader源程序
💻 C
字号:
/*
 * File:        icmp.c
 * Purpose:     Handle ICMP packets.
 *
 * Notes:       See RFC 792 "Internet Control Message Protocol"
 *              for more details.
 */
#include "src/include/dbug.h"
#include "src/uif/net/net.h"

#ifdef DBUG_NETWORK

/********************************************************************/
void
dump_icmp_frame (icmp_message *msg)
{
    switch (msg->type)
    {
        case ICMP_DEST_UNREACHABLE:
            printf("ICMP : ");
            switch (msg->code)
            {
                case ICMP_NET_UNREACHABLE:
                    printf("Net Unreachable\n");
                    break;
                case ICMP_HOST_UNREACHABLE:
                    printf("Host Unreachable\n");
                    break;
                case ICMP_PROTOCOL_UNREACHABLE:
                    printf("Protocol Unreachable\n");
                    break;
                case ICMP_PORT_UNREACHABLE:
                    printf("Port Unreachable\n");
                    break;
                case ICMP_FRAG_NEEDED:
                    printf("Fragmentation needed and DF set\n");
                    break;
                case ICMP_ROUTE_FAILED:
                    printf("Source route failed\n");
                    break;
                default:
                    printf("Destination Unreachable\n");
                    break;
            }
            break;
        case ICMP_TIME_EXCEEDED:
            printf("ICMP_TIME_EXCEEDED\n");
            break;
        case ICMP_PARAMETER_PROBLEM:
            printf("ICMP_PARAMETER_PROBLEM\n");
            break;
        case ICMP_SOURCE_QUENCH:
            printf("ICMP_SOURCE_QUENCH\n");
            break;
        case ICMP_REDIRECT:
            printf("ICMP_REDIRECT\n");
            break;
        case ICMP_ECHO:
            printf("ICMP_ECHO\n");
            break;
        case ICMP_ECHO_REPLY:
            printf("ICMP_ECHO_REPLY\n");
            break;
        case ICMP_INFORMATION_REQUEST:
            printf("ICMP_INFORMATION_REQUEST\n");
            break;
        case ICMP_INFORMATION_REPLY:
            printf("ICMP_INFORMATION_REPLY\n");
            break;
        case ICMP_TIMESTAMP:
            printf("ICMP_TIMESTAMP\n");
            break;
        case ICMP_TIMESTAMP_REPLY:
            printf("ICMP_TIMESTAMP_REPLY\n");
            break;
        default:
            printf("Unknown ICMP message\n");
            break;
    }
}

/********************************************************************/
void
icmp_handler (NIF *nif, NBUF *pNbuf)
{
    /*
     * This function handles the ICMP packets.
     */
    icmp_message *icmpmsg;
    ip_frame_hdr *ipframe;
    uint8 src[4], dest[4];

    icmpmsg = (icmp_message *)&pNbuf->data[pNbuf->offset];

    switch (icmpmsg->type)
    {
        case ICMP_ECHO:
            /* 
             * Change ICMP echo message into a echo reply message 
             */
            icmpmsg->type = ICMP_ECHO_REPLY;
            
            /* 
             * Recompute checksum 
             */
            icmpmsg->chksum = 0;
            icmpmsg->chksum = ip_chksum((uint16 *)icmpmsg,pNbuf->length);

            /*
             * Send the Echo Reply
             */
            ipframe = (ip_frame_hdr *)&pNbuf->data[IP_HDR_OFFSET];
            memcpy(dest, &ipframe->source_addr[0], 4);
            memcpy(src, &ipframe->dest_addr[0], 4);
            ip_send(nif, dest, src, ipframe->protocol, pNbuf);
            break;
        case ICMP_DEST_UNREACHABLE:
        case ICMP_TIME_EXCEEDED:
        case ICMP_PARAMETER_PROBLEM:
        case ICMP_SOURCE_QUENCH:
        case ICMP_REDIRECT:
        case ICMP_ECHO_REPLY:
        case ICMP_INFORMATION_REQUEST:
        case ICMP_INFORMATION_REPLY:
        case ICMP_TIMESTAMP:
        case ICMP_TIMESTAMP_REPLY:
        default:
            dump_icmp_frame(icmpmsg);
            nbuf_free(pNbuf);
            break;
    }
}

/******************************************************************/

#endif /* #ifdef DBUG_NETWORK */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -