source: edk_user_repository/WARP/sw_services/WARPxilnet_v3_01_a/src/xilnet_arp.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: 4.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   : arp.c
18// Date   : 2002, March 20.
19// Author : Sathya Thammanur
20// Company: Xilinx
21// Group  : Emerging Software Technologies
22//
23// Summary:
24// ARP layer specific functions
25//
26// $Id: arp.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
36/*
37 * xilnet_arp: handler for arp packets
38 */
39
40int xilnet_arp(unsigned char *buf, int len) {
41
42  struct xilnet_arp_pkt* ar = (struct xilnet_arp_pkt*) (buf+ETH_HDR_LEN);
43 
44  // Analyse if its a arp request and send a reply if needed
45  if (
46    Xil_Ntohs(ar->hdr.hard_type) == ARP_HARD_TYPE_ETH &&
47    Xil_Ntohs(ar->hdr.prot_type) == ETH_PROTO_IP &&
48    ar->hdr.hard_size == ARP_HARD_SIZE &&
49    ar->hdr.prot_size == ARP_PROTO_IP_SIZE &&
50    ar->target_ip[0] == node_ip_addr[0] &&
51    ar->target_ip[1] == node_ip_addr[1] &&
52    ar->target_ip[2] == node_ip_addr[2] &&
53    ar->target_ip[3] == node_ip_addr[3]
54    ) {
55    if (Xil_Ntohs(ar->hdr.op) == ARP_REQ) {
56      // update hw addr table
57      xilnet_eth_update_hw_tbl(buf, ETH_PROTO_ARP);
58      xilnet_arp_reply(buf+ETH_HDR_LEN, len-ETH_HDR_LEN);
59    }
60  }
61  return 0;
62}
63
64
65/*
66 * xilnet_arp_reply:
67 */
68
69void xilnet_arp_reply(unsigned char *buf, int len) {
70
71  int i;
72  struct xilnet_arp_pkt *pkt;
73  struct xilnet_arp_pkt *arp_req = (struct xilnet_arp_pkt*) buf;
74  struct xilnet_arp_pkt *arp_reply;
75#ifdef _DEBUG_ 
76//    print("arp_reply(): \n");
77#endif
78  pkt = (struct xilnet_arp_pkt*)(sendbuf+ETH_HDR_LEN);
79 
80  pkt->hdr.hard_type = Xil_Htons(ARP_HARD_TYPE_ETH);
81  pkt->hdr.prot_type = Xil_Htons(ETH_PROTO_IP);
82  pkt->hdr.hard_size = ARP_HARD_SIZE;
83  pkt->hdr.prot_size = ARP_PROTO_IP_SIZE; 
84  pkt->hdr.op = Xil_Htons(ARP_REPLY);
85 
86  for (i = 0; i < ETH_ADDR_LEN; i++) {
87    pkt->sender_hw[i] = node_hw_addr[i];
88    pkt->target_hw[i] = arp_req->sender_hw[i];
89  }
90 
91  for (i = 0; i < ARP_PROTO_IP_SIZE ; i++) {
92    pkt->sender_ip[i] = node_ip_addr[i];
93    pkt->target_ip[i] = arp_req->sender_ip[i];
94  }
95  memset(pkt->pad, 0, ARP_PAD_SIZE);
96 
97  /* initialize ethernet header */
98  xilnet_eth_send_frame(sendbuf, ETH_MIN_FRAME_LEN, arp_req->sender_ip, pkt->target_hw, ETH_PROTO_ARP);
99 
100}
101
102/*
103 * xilnet_arp_reply:
104 */
105
106void xilnet_arp_announce() {
107
108  unsigned char bcast_addr[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
109
110  int i;
111  struct xilnet_arp_pkt *pkt;
112  struct xilnet_arp_pkt *arp_reply;
113#ifdef _DEBUG_ 
114//    print("announce(): \n");
115#endif
116  pkt = (struct xilnet_arp_pkt*)(sendbuf+ETH_HDR_LEN);
117 
118  pkt->hdr.hard_type = ARP_HARD_TYPE_ETH;
119  pkt->hdr.prot_type = ETH_PROTO_IP;
120  pkt->hdr.hard_size = ARP_HARD_SIZE;
121  pkt->hdr.prot_size = ARP_PROTO_IP_SIZE; 
122  pkt->hdr.op = ARP_REPLY;
123 
124  for (i = 0; i < ETH_ADDR_LEN; i++) {
125    pkt->sender_hw[i] = node_hw_addr[i];
126    pkt->target_hw[i] = 0xFF;
127  }
128 
129  for (i = 0; i < ARP_PROTO_IP_SIZE ; i++) {
130    pkt->sender_ip[i] = node_ip_addr[i];
131    pkt->target_ip[i] = 0xFF;
132  }
133  memset(pkt->pad, 0, ARP_PAD_SIZE);
134 
135        xil_printf("xilnet_arp_announce: Sending arp announce\r\n");
136  /* initialize ethernet header */
137  xilnet_eth_send_frame(sendbuf, ETH_MIN_FRAME_LEN, NULL, (void *)&bcast_addr, ETH_PROTO_ARP);
138 
139}
Note: See TracBrowser for help on using the repository browser.