source: edk_user_repository/WARP/sw_services/WARPxilnet_v3_00_a/src/xilnet_arp.c

Last change on this file was 1749, checked in by chunter, 12 years ago

Updated copyright information and improved handling of broadcast IP address

File size: 4.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   : 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 (ar->hdr.hard_type == ARP_HARD_TYPE_ETH && ar->hdr.prot_type == ETH_PROTO_IP && 
46      ar->hdr.hard_size == ARP_HARD_SIZE && ar->hdr.prot_size == ARP_PROTO_IP_SIZE &&
47      (ar->target_ip[0] == mb_ip_addr[0] && ar->target_ip[1] == mb_ip_addr[1] &&
48       ar->target_ip[2] == mb_ip_addr[2] && ar->target_ip[3] == mb_ip_addr[3]) ) {
49    if (ar->hdr.op == ARP_REQ) {
50      // update hw addr table
51      xilnet_eth_update_hw_tbl(buf, ETH_PROTO_ARP);
52      xilnet_arp_reply(buf+ETH_HDR_LEN, len-ETH_HDR_LEN);
53    }
54  }
55  return 0;
56}
57
58
59/*
60 * xilnet_arp_reply:
61 */
62
63void xilnet_arp_reply(unsigned char *buf, int len) {
64
65  int i;
66  struct xilnet_arp_pkt *pkt;
67  struct xilnet_arp_pkt *arp_req = (struct xilnet_arp_pkt*) buf;
68  struct xilnet_arp_pkt *arp_reply;
69#ifdef _DEBUG_ 
70//    print("arp_reply(): \n");
71#endif
72  pkt = (struct xilnet_arp_pkt*)(sendbuf+ETH_HDR_LEN);
73 
74  pkt->hdr.hard_type = ARP_HARD_TYPE_ETH;
75  pkt->hdr.prot_type = ETH_PROTO_IP;
76  pkt->hdr.hard_size = ARP_HARD_SIZE;
77  pkt->hdr.prot_size = ARP_PROTO_IP_SIZE; 
78  pkt->hdr.op = ARP_REPLY;
79 
80  for (i = 0; i < ETH_ADDR_LEN; i++) {
81    pkt->sender_hw[i] = mb_hw_addr[i];
82    pkt->target_hw[i] = arp_req->sender_hw[i];
83  }
84 
85  for (i = 0; i < ARP_PROTO_IP_SIZE ; i++) {
86    pkt->sender_ip[i] = mb_ip_addr[i];
87    pkt->target_ip[i] = arp_req->sender_ip[i];
88  }
89  memset(pkt->pad, 0, ARP_PAD_SIZE);
90 
91  /* initialize ethernet header */
92  xilnet_eth_send_frame(sendbuf, ETH_MIN_FRAME_LEN, arp_req->sender_ip, pkt->target_hw, ETH_PROTO_ARP);
93 
94}
95
96/*
97 * xilnet_arp_reply:
98 */
99
100void xilnet_arp_announce() {
101
102  unsigned char bcast_addr[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
103
104  int i;
105  struct xilnet_arp_pkt *pkt;
106  struct xilnet_arp_pkt *arp_reply;
107#ifdef _DEBUG_ 
108//    print("announce(): \n");
109#endif
110  pkt = (struct xilnet_arp_pkt*)(sendbuf+ETH_HDR_LEN);
111 
112  pkt->hdr.hard_type = ARP_HARD_TYPE_ETH;
113  pkt->hdr.prot_type = ETH_PROTO_IP;
114  pkt->hdr.hard_size = ARP_HARD_SIZE;
115  pkt->hdr.prot_size = ARP_PROTO_IP_SIZE; 
116  pkt->hdr.op = ARP_REPLY;
117 
118  for (i = 0; i < ETH_ADDR_LEN; i++) {
119    pkt->sender_hw[i] = mb_hw_addr[i];
120    pkt->target_hw[i] = 0xFF;
121  }
122 
123  for (i = 0; i < ARP_PROTO_IP_SIZE ; i++) {
124    pkt->sender_ip[i] = mb_ip_addr[i];
125    pkt->target_ip[i] = 0xFF;
126  }
127  memset(pkt->pad, 0, ARP_PAD_SIZE);
128 
129        xil_printf("xilnet_arp_announce: Sending arp announce\r\n");
130  /* initialize ethernet header */
131  xilnet_eth_send_frame(sendbuf, ETH_MIN_FRAME_LEN, NULL, (void *)&bcast_addr, ETH_PROTO_ARP);
132 
133}
Note: See TracBrowser for help on using the repository browser.