source: edk_user_repository/WARP/sw_services/WARPxilnet_v3_03_a/src/xilnet_icmp.c

Last change on this file was 2229, checked in by welsh, 11 years ago

Added WARPxilnet version 3.03.a

File size: 3.2 KB
Line 
1// ////////////////////////////////////////////////////////////////////////////////
2// Copyright (c) 2004 Xilinx, Inc.  All rights reserved.
3//
4// Xilinx, Inc.
5// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
6// COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
7// ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
8// STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
9// IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
10// FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
11// XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
12// THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
13// ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
14// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
15// AND FITNESS FOR A PARTICULAR PURPOSE.
16//
17// File   : icmp.c
18// Date   : 2002, March 20.
19// Author : Sathya Thammanur
20// Company: Xilinx
21// Group  : Emerging Software Technologies
22//
23// Summary:
24// ICMP layer specific functions
25//
26// $Id: icmp.c,v 1.2.8.6 2005/11/15 23:41:10 salindac Exp $
27//
28////////////////////////////////////////////////////////////////////////////////
29
30////////////////////////////////////////////////////////////////////////////////
31// see copyright.txt for Rice University/Mango Communications modifications
32////////////////////////////////////////////////////////////////////////////////
33
34#include <xilnet_xilsock.h>
35#include <string.h>
36
37/*
38 * icmp packet handler - handles only echo requests (ping program requests)
39 * "buf" is an IP datagram
40 */
41
42int xilnet_icmp(unsigned char* buf, int len, unsigned int eth_dev_num) {
43
44    struct xilnet_icmp_hdr *icmph = (struct xilnet_icmp_hdr*) (buf+IP_HDR_LEN*4);
45
46#ifdef _DEBUG_
47    xil_printf("In xilnet_imcp(): \n");
48#endif
49   
50    if ((icmph->type == ICMP_ECHO_REQ_TYPE) && (icmph->code == ICMP_ECHO_CODE)) {
51        xilnet_icmp_echo_reply(buf, len, eth_dev_num);
52    }
53    return 0;
54}
55
56
57void xilnet_icmp_echo_reply(unsigned char *buf, unsigned int len, unsigned int eth_dev_num) {
58 
59   unsigned char * sendbuf = (unsigned char *)eth_device[eth_dev_num].sendbuf;
60
61   struct xilnet_icmp_hdr* icmp_req   = (struct xilnet_icmp_hdr*)(buf + IP_HDR_LEN*4);
62   struct xilnet_icmp_hdr* icmp_reply = (struct xilnet_icmp_hdr*)(sendbuf+LINK_HDR_LEN+IP_HDR_LEN*4);
63   unsigned char * icmp_data          = sendbuf+LINK_HDR_LEN+IP_HDR_LEN*4+ICMP_HDR_LEN;
64
65#ifdef _DEBUG_
66    xil_printf("In xilnet_imcp_echo_reply(): \n");
67#endif
68
69   // copy the icmp echo request data
70   memcpy(icmp_data, buf+IP_HDR_LEN*4 + ICMP_HDR_LEN, (len - (IP_HDR_LEN*4 +ICMP_HDR_LEN)));
71
72   icmp_reply->type      = ICMP_ECHO_REPLY_TYPE;
73   icmp_reply->code      = ICMP_ECHO_CODE;
74   icmp_reply->check_sum = 0;
75   icmp_reply->ident     = icmp_req->ident;
76   icmp_reply->seq_no    = icmp_req->seq_no;
77   icmp_reply->check_sum = Xil_Htons(xilnet_ip_calc_chksum(sendbuf + LINK_HDR_LEN+(IP_HDR_LEN*4), len - (IP_HDR_LEN*4)));
78   
79   // call ip
80   xilnet_ip_header(sendbuf+LINK_HDR_LEN, len, IP_PROTO_ICMP, (buf+IP_SADDR_BASE), eth_dev_num );
81   
82   // call ethernet
83   xilnet_eth_send_frame(sendbuf, len+ETH_HDR_LEN, (buf+IP_SADDR_BASE), NULL, ETH_PROTO_IP, eth_dev_num);
84   
85}
Note: See TracBrowser for help on using the repository browser.