Blame view
net/ping.c
2.62 KB
a36b12f95 net: Move PING ou... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/* * Copied from Linux Monitor (LiMon) - Networking. * * Copyright 1994 - 2000 Neil Russell. * (See License) * Copyright 2000 Roland Borde * Copyright 2000 Paolo Scaffardi * Copyright 2000-2002 Wolfgang Denk, wd@denx.de */ #include "ping.h" #include "arp.h" static ushort PingSeqNo; /* The ip address to ping */ IPaddr_t NetPingIP; |
4b11c9166 net: Refactor IP,... |
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
static void set_icmp_header(uchar *pkt, IPaddr_t dest) { /* * Construct an IP and ICMP header. */ struct ip_hdr *ip = (struct ip_hdr *)pkt; struct icmp_hdr *icmp = (struct icmp_hdr *)(pkt + IP_HDR_SIZE); net_set_ip_header(pkt, dest, NetOurIP); ip->ip_len = htons(IP_ICMP_HDR_SIZE); ip->ip_p = IPPROTO_ICMP; ip->ip_sum = ~NetCksum((uchar *)ip, IP_HDR_SIZE >> 1); icmp->type = ICMP_ECHO_REQUEST; icmp->code = 0; icmp->checksum = 0; icmp->un.echo.id = 0; icmp->un.echo.sequence = htons(PingSeqNo++); icmp->checksum = ~NetCksum((uchar *)icmp, ICMP_HDR_SIZE >> 1); } |
a36b12f95 net: Move PING ou... |
39 40 |
static int ping_send(void) { |
a36b12f95 net: Move PING ou... |
41 |
uchar *pkt; |
00f33268a net: Refactor pac... |
42 |
int eth_hdr_size; |
a36b12f95 net: Move PING ou... |
43 44 |
/* XXX always send arp request */ |
4ef8d53ca net: Allow filter... |
45 46 |
debug_cond(DEBUG_DEV_PKT, "sending ARP for %pI4 ", &NetPingIP); |
a36b12f95 net: Move PING ou... |
47 48 |
NetArpWaitPacketIP = NetPingIP; |
a36b12f95 net: Move PING ou... |
49 |
|
e94070c44 net: Don't copy e... |
50 51 |
eth_hdr_size = NetSetEther(NetTxPacket, NetEtherNullAddr, PROT_IP); pkt = (uchar *)NetTxPacket + eth_hdr_size; |
a36b12f95 net: Move PING ou... |
52 |
|
4b11c9166 net: Refactor IP,... |
53 |
set_icmp_header(pkt, NetPingIP); |
a36b12f95 net: Move PING ou... |
54 55 |
/* size of the waiting packet */ |
00f33268a net: Refactor pac... |
56 |
NetArpWaitTxPacketSize = eth_hdr_size + IP_ICMP_HDR_SIZE; |
a36b12f95 net: Move PING ou... |
57 58 59 60 61 62 63 64 65 66 67 |
/* and do the ARP request */ NetArpWaitTry = 1; NetArpWaitTimerStart = get_timer(0); ArpRequest(); return 1; /* waiting */ } static void ping_timeout(void) { eth_halt(); |
22f6e99d5 net: Refactor to ... |
68 |
net_set_state(NETLOOP_FAIL); /* we did not get the reply */ |
a36b12f95 net: Move PING ou... |
69 |
} |
a36b12f95 net: Move PING ou... |
70 71 72 73 74 |
void ping_start(void) { printf("Using %s device ", eth_get_name()); NetSetTimeout(10000UL, ping_timeout); |
a36b12f95 net: Move PING ou... |
75 76 77 |
ping_send(); } |
cb487f566 net: cosmetic: Un... |
78 |
void ping_receive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len) |
a36b12f95 net: Move PING ou... |
79 |
{ |
e0a630795 net: cosmetic: Un... |
80 |
struct icmp_hdr *icmph = (struct icmp_hdr *)&ip->udp_src; |
a36b12f95 net: Move PING ou... |
81 |
IPaddr_t src_ip; |
e71110158 net: Add net_upda... |
82 |
int eth_hdr_size; |
a36b12f95 net: Move PING ou... |
83 84 85 |
switch (icmph->type) { case ICMP_ECHO_REPLY: |
a36b12f95 net: Move PING ou... |
86 |
src_ip = NetReadIP((void *)&ip->ip_src); |
61da3c2af net: Refactor pin... |
87 |
if (src_ip == NetPingIP) |
22f6e99d5 net: Refactor to ... |
88 |
net_set_state(NETLOOP_SUCCESS); |
a36b12f95 net: Move PING ou... |
89 90 |
return; case ICMP_ECHO_REQUEST: |
e71110158 net: Add net_upda... |
91 |
eth_hdr_size = net_update_ether(et, et->et_src, PROT_IP); |
a36b12f95 net: Move PING ou... |
92 |
|
4ef8d53ca net: Allow filter... |
93 |
debug_cond(DEBUG_DEV_PKT, "Got ICMP ECHO REQUEST, return " |
e71110158 net: Add net_upda... |
94 95 |
"%d bytes ", eth_hdr_size + len); |
a36b12f95 net: Move PING ou... |
96 97 98 99 100 101 |
ip->ip_sum = 0; ip->ip_off = 0; NetCopyIP((void *)&ip->ip_dst, &ip->ip_src); NetCopyIP((void *)&ip->ip_src, &NetOurIP); ip->ip_sum = ~NetCksum((uchar *)ip, |
c5c59df04 net: cosmetic: Sp... |
102 |
IP_HDR_SIZE >> 1); |
a36b12f95 net: Move PING ou... |
103 104 105 106 |
icmph->type = ICMP_ECHO_REPLY; icmph->checksum = 0; icmph->checksum = ~NetCksum((uchar *)icmph, |
c5c59df04 net: cosmetic: Sp... |
107 |
(len - IP_HDR_SIZE) >> 1); |
e71110158 net: Add net_upda... |
108 |
NetSendPacket((uchar *)et, eth_hdr_size + len); |
a36b12f95 net: Move PING ou... |
109 110 111 112 113 |
return; /* default: return;*/ } } |