void *icmp_Format (DWORD host) { mac_address dest; /* We use ARP rather than supplied hardware address. * After first ping this will still be in cache. */ if (!_arp_resolve(host,&dest,0)) /* unable to find address */ return (NULL); return _eth_formatpacket (&dest, IP_TYPE); }
/* * Raw IP transmitter */ static int ip_transmit (Socket *socket, const void *tx, int len) { eth_address eth; u_long dest; unsigned tx_len, tx_room; sock_type *sk = (sock_type*)socket->udp_sock; struct ip *ip = (struct ip*) tx; const BYTE *buf = (const BYTE*) tx; WORD flags = 0; DWORD offset; UINT h_len, o_len; tcp_tick (NULL); /* process other TCBs too */ tcp_Retransmitter (1); /* This should never happen */ if (ip && (socket->so_state & SS_NBIO) && sock_tbleft(sk) < (len + socket->send_lowat)) { SOCK_DEBUGF ((socket, ", EWOULDBLOCK")); SOCK_ERR (EWOULDBLOCK); return (-1); } if (ip) { offset = ntohs (ip->ip_off); flags = offset & ~IP_OFFMASK; offset = (offset & IP_OFFMASK) << 3; /* 0 <= ip_ofs <= 65536-8 */ } SOCK_DEBUGF ((socket, ", %s / Raw", inet_ntoa(socket->remote_addr->sin_addr))); if (ip && (socket->inp_flags & INP_HDRINCL)) { dest = ip->ip_dst.s_addr; tx_len = len; tx_room = mtu; } else { dest = socket->remote_addr->sin_addr.s_addr; tx_len = len + sizeof (*ip); tx_room = mtu + sizeof (*ip); } if (!dest || !_arp_resolve(ntohl(dest),ð,0)) { SOCK_DEBUGF ((socket, ", no route")); SOCK_ERR (EHOSTUNREACH); STAT (ipstats.ips_noroute++); return (-1); } #if defined(USE_FRAGMENTS) if (!(socket->inp_flags & INP_HDRINCL) && tx_len + socket->ip_opt_len > tx_room) { sk = (sock_type*)socket->raw_sock; if (flags & IP_DF) { SOCK_DEBUGF ((socket, ", EMSGSIZE")); SOCK_ERR (EMSGSIZE); STAT (ipstats.ips_toolong++); return (-1); } return SEND_IP_FRAGMENTS (sk, sk->raw.ip_type, dest, buf, len); } #else if (!(socket->inp_flags & INP_HDRINCL) && tx_len + socket->ip_opt_len > tx_room) { SOCK_DEBUGF ((socket, ", EMSGSIZE")); SOCK_ERR (EMSGSIZE); STAT (ipstats.ips_toolong++); return (-1); } #endif ip = (struct ip*) _eth_formatpacket (ð, IP_TYPE); if (socket->inp_flags & INP_HDRINCL) { memcpy (ip, buf, len); if (ip->ip_src.s_addr == 0) { ip->ip_src.s_addr = gethostid(); ip->ip_sum = 0; ip->ip_sum = ~checksum ((void*)ip, ip->ip_hl << 2); } if (ip->ip_sum == 0) ip->ip_sum = ~checksum ((void*)ip, ip->ip_hl << 2); } else { if (socket->ip_opt && socket->ip_opt_len > 0) { BYTE *data; o_len = min (socket->ip_opt_len, sizeof(socket->ip_opt->ip_opts)); h_len = sizeof(*ip) + o_len; data = (BYTE*)ip + h_len; memcpy (ip+1, &socket->ip_opt->ip_opts, o_len); memcpy (data, buf, len); tx_len += o_len; if (socket->ip_opt->ip_dst.s_addr) /* using source routing */ dest = socket->ip_opt->ip_dst.s_addr; } else { if (buf) memcpy (ip+1, buf, len); h_len = sizeof (*ip); } ip->ip_v = IPVERSION; ip->ip_hl = h_len >> 2; ip->ip_tos = socket->ip_tos; ip->ip_len = htons (tx_len); ip->ip_id = _get_ip_id(); ip->ip_off = 0; ip->ip_ttl = socket->ip_ttl; ip->ip_p = socket->so_proto; ip->ip_src.s_addr = gethostid(); ip->ip_dst.s_addr = dest; ip->ip_sum = 0; ip->ip_sum = ~checksum (ip, h_len); } DEBUG_TX (NULL, ip); if (!_eth_send(tx_len)) { SOCK_DEBUGF ((socket, ", ENETDOWN")); SOCK_ERR (ENETDOWN); return (-1); } if (buf) buf += tx_len; return (len); }
debug void main() { longword host, timer, new_rcvd; longword tot_timeout, itts, send_timeout; word i; word sequence_mode, is_new_line; word debug_on; static unsigned char tempbuffer[255]; word arping; auto char ip[16], netmask[16]; auto int status; sent=received=tot_delays=last_rcvd=0L; tot_timeout=itts=send_timeout=0L; debug_on=0; is_new_line=1; arping = 1; // Start network and wait for interface to come up (or error exit). printf("Starting/joining ad-hoc network...\n"); sock_init_or_exit(1); name=PINGWHO; itts=0; // 0 == continuous if (!(host = resolve( name ))) { printf("Unable to resolve '%s'\n", name ); exit( 3 ); } if ( isaddr( name )) printf("Pinging [%s]",inet_ntoa(tempbuffer, host)); else printf("Pinging '%s' [%s]",name, inet_ntoa(tempbuffer, host)); if (!itts) itts = 1000000L; printf(" %lu times\n", itts); tot_timeout = _SET_TIMEOUT((itts + 2)*1000L); send_timeout = _SET_TIMEOUT(0); do { /* once per second - do all this */ if ( chk_timeout( send_timeout )) { send_timeout = _SET_TIMEOUT(1000L); if (chk_timeout( tot_timeout )) { stats(); break; } if (arping) { if (!_arp_resolve( host, (eth_address *)tempbuffer, 0 )) printf("Could not resolve hardware address (maybe other host not up yet)\n"); else { arping = 0; printf("Hardware address resolved to %02x:%02x:%02x:%02x:%02x:%02x\n", (int)tempbuffer[0],(int)tempbuffer[1],(int)tempbuffer[2],(int)tempbuffer[3], (int)tempbuffer[4],(int)tempbuffer[5]); } } if (!arping && sent < itts) { sent++; if (_ping( host , sent )) stats(); if (!is_new_line) printf("\n"); printf("sent PING # %lu ", sent ); is_new_line = 0; } } if ( kbhit() ) { getchar(); /* trash the character */ stats(); } tcp_tick(NULL); if (arping) continue; if ((timer = _chk_ping( host , &new_rcvd)) != 0xffffffffL) { tot_delays += timer; ++received; if ( new_rcvd != last_rcvd + 1 ) { if (!is_new_line) printf("\n"); printf("PING receipt received out of order!\n"); is_new_line = 1; } last_rcvd = new_rcvd; if (!is_new_line) printf(", "); printf("PING receipt # %lu : response time %lu ms\n", received, timer); is_new_line = 1; if ( received == itts ) stats(); } } while (1); }
debug void main() { longword host, timer, new_rcvd; longword tot_timeout, itts, send_timeout; word i; word sequence_mode, is_new_line; word debug_on; static unsigned char tempbuffer[255]; sent=received=tot_delays=last_rcvd=0L; tot_timeout=itts=send_timeout=0L; sequence_mode=debug_on=0; is_new_line=1; // Start network and wait for interface to come up (or error exit). sock_init_or_exit(1); name=PINGWHO; itts=10; if (!(host = resolve( name ))) { printf("Unable to resolve '%s'\n", name ); exit( 3 ); } if ( isaddr( name )) printf("Pinging [%s]",inet_ntoa(tempbuffer, host)); else printf("Pinging '%s' [%s]",name, inet_ntoa(tempbuffer, host)); if (itts) printf(" %u times", itts); else itts = sequence_mode ? 0xffffffffL : 1; if (sequence_mode) printf(" once per_second"); printf("\n"); if (!_arp_resolve( host, (eth_address *)tempbuffer, 0 )) { /* resolve it before timer starts */ printf("Could not resolve hardware address\n"); exit(2); } tot_timeout = _SET_TIMEOUT((itts + 2)*1000L); if ( debug_on ) printf("ETH -> %02x:%02x:%02x:%02x:%02x:%02x\n", (int)tempbuffer[0],(int)tempbuffer[1],(int)tempbuffer[2],(int)tempbuffer[3], (int)tempbuffer[4],(int)tempbuffer[5]); send_timeout = _SET_TIMEOUT(0); do { /* once per second - do all this */ if ( chk_timeout( send_timeout )) { send_timeout = _SET_TIMEOUT(1000L); if (chk_timeout( tot_timeout )) { stats(); break; } if ( sent < itts ) { sent++; if (_ping( host , sent )) stats(); if (!is_new_line) printf("\n"); printf("sent PING # %lu ", sent ); is_new_line = 0; } } if ( kbhit() ) { getchar(); /* trash the character */ stats(); } tcp_tick(NULL); if ((timer = _chk_ping( host , &new_rcvd)) != 0xffffffffL) { tot_delays += timer; ++received; if ( new_rcvd != last_rcvd + 1 ) { if (!is_new_line) printf("\n"); printf("PING receipt received out of order!\n"); is_new_line = 1; } last_rcvd = new_rcvd; if (!is_new_line) printf(", "); printf("PING receipt # %lu : response time %lu ms\n", received, timer); is_new_line = 1; if ( received == itts ) stats(); } } while (1); }