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

Last change on this file was 1929, checked in by murphpo, 11 years ago

Adding updated WARPxilnet, required for WARPLab 7 ref design

File size: 3.1 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) {
43   
44   struct xilnet_icmp_hdr *icmph = (struct xilnet_icmp_hdr*) (buf+IP_HDR_LEN*4);
45   
46   if ((icmph->type == ICMP_ECHO_REQ_TYPE) && (icmph->code == ICMP_ECHO_CODE)) {
47      xilnet_icmp_echo_reply( buf, len);   
48   }
49   return 0;
50}
51
52
53void xilnet_icmp_echo_reply(unsigned char *buf, unsigned int len) {
54 
55   short w0, w1, w2, w3;
56   struct xilnet_icmp_hdr* icmp_req = (struct xilnet_icmp_hdr*) (buf + IP_HDR_LEN*4);
57   struct xilnet_icmp_hdr* icmp_reply = (struct xilnet_icmp_hdr*)(sendbuf+LINK_HDR_LEN+IP_HDR_LEN*4);
58   unsigned char * icmp_data = sendbuf+LINK_HDR_LEN+IP_HDR_LEN*4+ICMP_HDR_LEN;
59
60   // copy the icmp echo request data
61   memcpy(icmp_data, buf+IP_HDR_LEN*4 + ICMP_HDR_LEN, (len - (IP_HDR_LEN*4 +ICMP_HDR_LEN)));
62
63   icmp_reply->type = ICMP_ECHO_REPLY_TYPE;
64   icmp_reply->code = ICMP_ECHO_CODE;
65   icmp_reply->check_sum = 0;
66   icmp_reply->ident = icmp_req->ident;
67   icmp_reply->seq_no = icmp_req->seq_no;
68   //icmp_reply->check_sum = xilnet_ip_calc_chksum(sendbuf + LINK_HDR_LEN+(IP_HDR_LEN*4), ICMP_HDR_LEN);
69   icmp_reply->check_sum = Xil_Htons(xilnet_ip_calc_chksum(sendbuf + LINK_HDR_LEN+(IP_HDR_LEN*4), len - (IP_HDR_LEN*4)));
70   
71   // call ip
72   //xilnet_ip_header(sendbuf+LINK_HDR_LEN, ICMP_HDR_LEN+(IP_HDR_LEN*4), IP_PROTO_ICMP, (buf+IP_SADDR_BASE) );
73   xilnet_ip_header(sendbuf+LINK_HDR_LEN, len, IP_PROTO_ICMP, (buf+IP_SADDR_BASE) );
74   
75   // call ethernet
76   xilnet_eth_send_frame(sendbuf, len+ETH_HDR_LEN, (buf+IP_SADDR_BASE), NULL, ETH_PROTO_IP);
77   
78}
Note: See TracBrowser for help on using the repository browser.