patch-2.1.48 linux/arch/m68k/boot/atari/bootp.c
Next file: linux/arch/m68k/boot/atari/bootp.h
Previous file: linux/arch/m68k/boot/amiga/linuxboot.h
Back to the patch index
Back to the overall index
- Lines: 815
- Date:
Wed Dec 31 16:00:00 1969
- Orig file:
v2.1.47/linux/arch/m68k/boot/atari/bootp.c
- Orig date:
Wed Apr 23 19:01:15 1997
diff -u --recursive --new-file v2.1.47/linux/arch/m68k/boot/atari/bootp.c linux/arch/m68k/boot/atari/bootp.c
@@ -1,814 +0,0 @@
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "bootp.h"
-
-
-/* --------------------------------------------------------------------- */
-/* Protocol Header Structures */
-
-struct etherhdr {
- HWADDR dst_addr;
- HWADDR src_addr;
- unsigned short type;
-};
-
-struct arphdr {
- unsigned short hrd; /* format of hardware address */
- unsigned short pro; /* format of protocol address */
- unsigned char hln; /* length of hardware address */
- unsigned char pln; /* length of protocol address */
- unsigned short op; /* ARP opcode (command) */
- unsigned char addr[0]; /* addresses (var len) */
-};
-
-struct iphdr {
- unsigned char version : 4;
- unsigned char ihl : 4;
- unsigned char tos;
- unsigned short tot_len;
- unsigned short id;
- unsigned short frag_off;
- unsigned char ttl;
- unsigned char protocol;
- unsigned short chksum;
- IPADDR src_addr;
- IPADDR dst_addr;
-};
-
-struct udphdr {
- unsigned short src_port;
- unsigned short dst_port;
- unsigned short len;
- unsigned short chksum;
-};
-
-struct bootp {
- unsigned char op; /* packet opcode type */
- unsigned char htype; /* hardware addr type */
- unsigned char hlen; /* hardware addr length */
- unsigned char hops; /* gateway hops */
- unsigned long xid; /* transaction ID */
- unsigned short secs; /* seconds since boot began */
- unsigned short unused;
- IPADDR ciaddr; /* client IP address */
- IPADDR yiaddr; /* 'your' IP address */
- IPADDR siaddr; /* server IP address */
- IPADDR giaddr; /* gateway IP address */
- unsigned char chaddr[16]; /* client hardware address */
- unsigned char sname[64]; /* server host name */
- unsigned char file[128]; /* boot file name */
- unsigned char vend[64]; /* vendor-specific area */
-};
-
-struct tftp_req {
- unsigned short opcode;
- char name[512];
-};
-
-struct tftp_data {
- unsigned short opcode;
- unsigned short nr;
- unsigned char data[512];
-};
-
-struct tftp_ack {
- unsigned short opcode;
- unsigned short nr;
-};
-
-struct tftp_error {
- unsigned short opcode;
- unsigned short errcode;
- char str[512];
-};
-
-
-typedef struct {
- struct etherhdr ether;
- struct arphdr arp;
-} ARP;
-
-typedef struct {
- struct etherhdr ether;
- struct iphdr ip;
- struct udphdr udp;
-} UDP;
-
-#define UDP_BOOTPS 67
-#define UDP_BOOTPC 68
-#define UDP_TFTP 69
-
-typedef struct {
- struct etherhdr ether;
- struct iphdr ip;
- struct udphdr udp;
- struct bootp bootp;
-} BOOTP;
-
-#define BOOTREQUEST 1
-#define BOOTREPLY 2
-#define BOOTP_RETRYS 5
-
-typedef struct {
- struct etherhdr ether;
- struct iphdr ip;
- struct udphdr udp;
- union tftp {
- unsigned short opcode;
- struct tftp_req req;
- struct tftp_data data;
- struct tftp_ack ack;
- struct tftp_error error;
- } tftp;
-} TFTP;
-
-#define TFTP_RRQ 1
-#define TFTP_WRQ 2
-#define TFTP_DATA 3
-#define TFTP_ACK 4
-#define TFTP_ERROR 5
-
-
-/* --------------------------------------------------------------------- */
-/* Addresses */
-
-static HWADDR MyHwaddr;
-static HWADDR ServerHwaddr;
-static IPADDR MyIPaddr;
-static IPADDR ServerIPaddr;
-
-static IPADDR IP_Unknown_Addr = 0x00000000;
-static IPADDR IP_Broadcast_Addr = 0xffffffff;
-static HWADDR Eth_Broadcast_Addr = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
-
-
-#define HZ 200
-#define _hz_200 (*(volatile unsigned long *)0x4ba)
-
-
-/* --------------------------------------------------------------------- */
-/* Error Strings */
-
-static char *ErrStr[] = {
- "timeout",
- "general Ethernet transmit error",
- "general Ethernet receive error",
- "Ethernet framing error",
- "Ethernet overflow error",
- "Ethernet CRC error"
-};
-
-
-/* --------------------------------------------------------------------- */
-/* Kfile Emulation Definitions */
-
-#define KFILE_CHUNK_BITS 16 /* chunk is 64 KB */
-#define KFILE_CHUNK_SIZE (1 << KFILE_CHUNK_BITS)
-#define KFILE_CHUNK_MASK (KFILE_CHUNK_SIZE-1)
-#define KFILE_N_CHUNKS (2*1024*1024/KFILE_CHUNK_SIZE)
-
-char *KFile[KFILE_N_CHUNKS];
-int KFileSize = 0;
-int KFpos = 0;
-
-
-
-
-/***************************** Prototypes *****************************/
-
-static void free_kfile( void );
-static int bootp( char *image_name );
-static int tftp( char *image_name );
-static int udp_send( UDP *pkt, int len, int fromport, int toport );
-static unsigned short ip_checksum( struct iphdr *buf );
-static int udp_rcv( UDP *pkt, int *len, int fromport, int atport );
-static void print_ip( IPADDR addr );
-static void print_hw( HWADDR addr );
-static int check_ethif( void );
-static int eth_send( Packet *pkt, int len );
-static int eth_rcv( Packet *pkt, int *len );
-
-/************************* End of Prototypes **************************/
-
-
-
-
-/* --------------------------------------------------------------------- */
-/* Interface to bootstrap.c */
-
-/* get_remote_kernel():
- * Perform all necessary steps to get the kernel image
- * from the boot server. If successfull (retval == 0), subsequent calls to
- * kread() can access the data. Fatal errors (i.e., retrying is useless)
- * return -2, others -1.
- */
-
-int get_remote_kernel( const char *kname /* optional */ )
-
-{ char image_name[256];
- int rv;
-
- /* Check if a Ethernet interface is present and determine the Ethernet
- * address */
- if (check_ethif() < 0) {
- printf( "No Ethernet interface found -- no remote boot possible.\n" );
- return( -2 );
- }
-
- /* Do a BOOTP request to find out our IP address and the kernel image's
- * name; we also learn the IP and Ethernet address of our server */
- if (kname)
- strcpy( image_name, kname );
- else
- *image_name = 0;
- if ((rv = bootp( image_name )) < 0)
- return( rv );
-
- /* Now start a TFTP connection to receive the kernel image */
- if ((rv = tftp( image_name )) < 0)
- return( rv );
-
- return( 0 );
-}
-
-
-/* ll_read(), ll_lseek(), ll_close():
- * Functions for accessing the received kernel image like with read(),
- * lseek(), close().
- */
-
-int ll_read( int fd, void *buf, unsigned cnt )
-
-{ unsigned done = 0;
-
- if (!KFileSize)
- return( read( fd, buf, cnt ) );
-
- if (KFpos + cnt > KFileSize)
- cnt = KFileSize - KFpos;
-
- while( cnt > 0 ) {
- unsigned chunk = KFpos >> KFILE_CHUNK_BITS;
- unsigned endchunk = (chunk+1) << KFILE_CHUNK_BITS;
- unsigned n = cnt;
-
- if (KFpos + n > endchunk)
- n = endchunk - KFpos;
- memcpy( buf, KFile[chunk] + (KFpos & KFILE_CHUNK_MASK), n );
- cnt -= n;
- buf += n;
- done += n;
- KFpos += n;
-
- if (KFpos == endchunk) {
- free( KFile[chunk] );
- KFile[chunk] = NULL;
- }
- }
-
- return( done );
-}
-
-
-int ll_lseek( int fd, int where, int whence )
-
-{
- unsigned oldpos, oldchunk, newchunk;
-
- if (!KFileSize)
- return( lseek( fd, where, whence ) );
-
- oldpos = KFpos;
- switch( whence ) {
- case SEEK_SET:
- KFpos = where;
- break;
- case SEEK_CUR:
- KFpos += where;
- break;
- case SEEK_END:
- KFpos = KFileSize + where;
- break;
- default:
- return( -1 );
- }
- if (KFpos < 0) {
- KFpos = 0;
- return( -1 );
- }
- else if (KFpos > KFileSize) {
- KFpos = KFileSize;
- return( -1 );
- }
-
- /* free memory of skipped-over data */
- oldchunk = oldpos >> KFILE_CHUNK_BITS;
- newchunk = KFpos >> KFILE_CHUNK_BITS;
- while( oldchunk < newchunk ) {
- if (KFile[oldchunk]) {
- free( KFile[oldchunk] );
- KFile[oldchunk] = NULL;
- }
- ++oldchunk;
- }
-
- return( KFpos );
-}
-
-
-int ll_close( int fd )
-
-{
- if (!KFileSize)
- return( close( fd ) );
-
- free_kfile();
- return( 0 );
-}
-
-
-static void free_kfile( void )
-
-{ int i;
-
- for( i = 0; i < KFILE_N_CHUNKS; ++i )
- if (KFile[i]) free( KFile[i] );
-}
-
-
-
-/* --------------------------------------------------------------------- */
-/* BOOTP Procedure */
-
-
-static int bootp( char *image_name )
-
-{ BOOTP req;
- Packet _reply;
- BOOTP *reply = (BOOTP *)_reply;
- static unsigned char mincookie[] = { 99, 130, 83, 99, 255 };
- unsigned long starttime, rancopy;
- int err, len, retry;
-
- memset( (char *)&req, 0, sizeof(req) );
- /* Now fill in the packet... */
- req.bootp.op = BOOTREQUEST;
- req.bootp.htype = 1; /* 10Mb/s Ethernet */
- req.bootp.hlen = 6;
- memcpy( req.bootp.chaddr, &MyHwaddr, ETHADDRLEN );
-
- /* Put in the minimal RFC1497 Magic cookie */
- memcpy( req.bootp.vend, mincookie, sizeof(mincookie) );
- /* Put the user precified bootfile name in place */
- memcpy( req.bootp.file, image_name, strlen(image_name)+1);
-
- starttime = _hz_200;
- for( retry = 0; retry < BOOTP_RETRYS; ++retry ) {
-
- /* Initialize server addresses and own IP to defaults */
- ServerIPaddr = IP_Broadcast_Addr; /* 255.255.255.255 */
- MyIPaddr = IP_Unknown_Addr; /* 0.0.0.0 */
- memcpy( ServerHwaddr, Eth_Broadcast_Addr, ETHADDRLEN );
-
- if (retry)
- sleep( 3 );
-
- req.bootp.xid = rancopy = _hz_200;
- req.bootp.secs = (_hz_200 - starttime) / HZ;
-
- if ((err = udp_send( (UDP *)&req, sizeof(req.bootp),
- UDP_BOOTPC, UDP_BOOTPS )) < 0) {
- printf( "bootp send: %s\n", ErrStr[-err-1] );
- continue;
- }
-
- if ((err = udp_rcv( (UDP *)reply, &len,
- UDP_BOOTPS, UDP_BOOTPC )) < 0) {
- printf( "bootp rcv: %s\n", ErrStr[-err-1] );
- continue;
- }
- if (len < sizeof(struct bootp)) {
- printf( "received short BOOTP packet (%d bytes)\n", len );
- continue;
- }
-
- if (reply->bootp.xid == rancopy)
- /* Ok, got the answer */
- break;
- printf( "bootp: xid mismatch\n" );
- }
- if (retry >= BOOTP_RETRYS) {
- printf( "No response from a bootp server\n" );
- return( -2 );
- }
-
- ServerIPaddr = reply->bootp.siaddr;
- memcpy( ServerHwaddr, reply->ether.src_addr, ETHADDRLEN );
- printf( "\nBoot server is " );
- if (strlen(reply->bootp.sname) > 0)
- printf( "%s, IP ", reply->bootp.sname );
- print_ip( ServerIPaddr );
- printf( ", HW address " );
- print_hw( ServerHwaddr );
- printf( "\n" );
-
- MyIPaddr = reply->bootp.yiaddr;
- printf( "My IP address is " );
- print_ip( MyIPaddr );
- printf( "\n" );
-
- strcpy( image_name, reply->bootp.file );
- return( 0 );
-}
-
-
-/* --------------------------------------------------------------------- */
-/* TFTP Procedure */
-
-
-static int tftp( char *image_name )
-
-{ TFTP spkt;
- Packet _rpkt;
- TFTP *rpkt = (TFTP *)&_rpkt;
- unsigned short mytid, rtid = 0;
- int blk, retries, i, wpos, err, len, datalen;
- static char rotchar[4] = { '|', '/', '-', '\\' };
-
- retries = 5;
- /* Construct and send a read request */
- repeat_req:
- spkt.tftp.req.opcode = TFTP_RRQ;
- strcpy( spkt.tftp.req.name, image_name );
- strcpy( spkt.tftp.req.name + strlen(spkt.tftp.req.name) + 1, "octet" );
- mytid = _hz_200 & 0xffff;
-
- if ((err = udp_send( (UDP *)&spkt, sizeof(spkt.tftp.req.opcode) +
- strlen(image_name) + 1 +
- strlen( "octect" ) +1,
- mytid, UDP_TFTP )) < 0) {
- printf( "TFTP RREQ: %s\n", ErrStr[-err-1] );
- if (--retries > 0)
- goto repeat_req;
- return( err == ETIMEO ? -2 : -1 );
- }
-
- retries = 5;
- for( i = 0; i < KFILE_N_CHUNKS; ++i )
- KFile[i] = NULL;
- wpos = 0;
- printf( "Receiving kernel image %s:\n", image_name );
-
- for( blk = 1; ; ++blk ) {
-
- repeat_data:
- if ((err = udp_rcv( (UDP *)rpkt, &len, rtid, mytid )) < 0) {
- printf( "TFTP rcv: %s\n", ErrStr[-err-1] );
- if (--retries > 0)
- goto repeat_data;
- goto err;
- }
- if (rtid == 0)
- /* Store the remote port at the first packet received */
- rtid = rpkt->udp.src_port;
-
- if (rpkt->tftp.opcode == TFTP_ERROR) {
- if (strlen(rpkt->tftp.error.str) > 0)
- printf( "TFTP error: %s\n", rpkt->tftp.error.str );
- else
- printf( "TFTP error #%d (no description)\n",
- rpkt->tftp.error.errcode );
- goto err;
- }
- else if (rpkt->tftp.opcode != TFTP_DATA) {
- printf( "Bad TFTP packet type: %d\n", rpkt->tftp.opcode );
- if (--retries > 0)
- goto repeat_data;
- goto err;
- }
-
- if (rpkt->tftp.data.nr != blk) {
- /* doubled data packet; ignore it */
- goto repeat_data;
- }
- datalen = len - sizeof(rpkt->tftp.data.opcode) -
- sizeof(rpkt->tftp.data.nr);
-
- /* store data */
- if (datalen > 0) {
- int chunk = wpos >> KFILE_CHUNK_BITS;
- if (chunk >= KFILE_N_CHUNKS) {
- printf( "TFTP: file too large! Aborting.\n" );
- out_of_mem:
- spkt.tftp.error.opcode = TFTP_ERROR;
- spkt.tftp.error.errcode = 3;
- strcpy( spkt.tftp.error.str, "Out of memory" );
- udp_send( (UDP *)&spkt, sizeof(spkt.tftp.ack), mytid, rtid );
- goto err;
- }
- if (!KFile[chunk]) {
- if (!(KFile[chunk] = malloc( KFILE_CHUNK_SIZE ))) {
- printf( "TFTP: Out of memory for kernel image\n" );
- goto out_of_mem;
- }
- }
- memcpy( KFile[chunk] + (wpos & KFILE_CHUNK_MASK),
- rpkt->tftp.data.data, datalen );
- wpos += datalen;
-
-#define DISPLAY_BITS 13
- if ((wpos & ((1 << DISPLAY_BITS)-1)) == 0) {
- printf( "\r %c %7d Bytes ",
- rotchar[(wpos>>DISPLAY_BITS)&3], wpos );
- fflush( stdout );
- }
- }
-
- /* Send ACK packet */
- repeat_ack:
- spkt.tftp.ack.opcode = TFTP_ACK;
- spkt.tftp.ack.nr = blk;
- if ((err = udp_send( (UDP *)&spkt, sizeof(spkt.tftp.ack),
- mytid, rtid )) < 0) {
- printf( "TFTP ACK: %s\n", ErrStr[-err-1] );
- if (--retries > 0)
- goto repeat_ack;
- goto err;
- }
-
- if (datalen < 512) {
- /* This was the last packet */
- printf( "\r %7d Bytes done\n\n", wpos );
- break;
- }
-
- retries = 5;
- }
-
- KFileSize = wpos;
- return( 0 );
-
- err:
- free_kfile();
- return( -1 );
-}
-
-
-
-/* --------------------------------------------------------------------- */
-/* UDP/IP Protocol Quick Hack Implementation */
-
-
-static int udp_send( UDP *pkt, int len, int fromport, int toport )
-
-{
- /* UDP layer */
- pkt->udp.src_port = fromport;
- pkt->udp.dst_port = toport;
- pkt->udp.len = (len += sizeof(struct udphdr));
- pkt->udp.chksum = 0; /* Too lazy to calculate :-) */
-
- /* IP layer */
- pkt->ip.version = 4;
- pkt->ip.ihl = 5;
- pkt->ip.tos = 0;
- pkt->ip.tot_len = (len += sizeof(struct iphdr));
- pkt->ip.id = 0;
- pkt->ip.frag_off = 0;
- pkt->ip.ttl = 255;
- pkt->ip.protocol = 17; /* UDP */
- pkt->ip.src_addr = MyIPaddr;
- pkt->ip.dst_addr = ServerIPaddr;
- pkt->ip.chksum = 0;
- pkt->ip.chksum = ip_checksum( &pkt->ip );
-
- /* Ethernet layer */
- memcpy( &pkt->ether.dst_addr, ServerHwaddr, ETHADDRLEN );
- memcpy( &pkt->ether.src_addr, MyHwaddr, ETHADDRLEN );
- pkt->ether.type = 0x0800;
- len += sizeof(struct etherhdr);
-
- return( eth_send( (Packet *)pkt, len ) );
-}
-
-
-static unsigned short ip_checksum( struct iphdr *buf )
-
-{ unsigned long sum = 0, wlen = 5;
-
- __asm__ ("subqw #1,%2\n"
- "1:\t"
- "movel %1@+,%/d0\n\t"
- "addxl %/d0,%0\n\t"
- "dbra %2,1b\n\t"
- "movel %0,%/d0\n\t"
- "swap %/d0\n\t"
- "addxw %/d0,%0\n\t"
- "clrw %/d0\n\t"
- "addxw %/d0,%0"
- : "=d" (sum), "=a" (buf), "=d" (wlen)
- : "0" (sum), "1" (buf), "2" (wlen)
- : "d0");
- return( (~sum) & 0xffff );
-}
-
-
-static int udp_rcv( UDP *pkt, int *len, int fromport, int atport )
-
-{ int err;
-
- repeat:
- if ((err = eth_rcv( (Packet *)pkt, len )))
- return( err );
-
- /* Ethernet layer */
- if (pkt->ether.type == 0x0806) {
- /* ARP */
- ARP *pk = (ARP *)pkt;
- unsigned char *shw, *sip, *thw, *tip;
-
- if (pk->arp.hrd != 1 || pk->arp.pro != 0x0800 ||
- pk->arp.op != 1 || MyIPaddr == IP_Unknown_Addr)
- /* Wrong hardware type or protocol; or reply -> ignore */
- goto repeat;
- shw = pk->arp.addr;
- sip = shw + pk->arp.hln;
- thw = sip + pk->arp.pln;
- tip = thw + pk->arp.hln;
-
- if (memcmp( tip, &MyIPaddr, pk->arp.pln ) == 0) {
- memcpy( thw, shw, pk->arp.hln );
- memcpy( tip, sip, pk->arp.pln );
- memcpy( shw, &MyHwaddr, pk->arp.hln );
- memcpy( sip, &MyIPaddr, pk->arp.pln );
-
- memcpy( &pk->ether.dst_addr, thw, ETHADDRLEN );
- memcpy( &pk->ether.src_addr, &MyHwaddr, ETHADDRLEN );
- eth_send( (Packet *)pk, *len );
- }
- goto repeat;
- }
- else if (pkt->ether.type != 0x0800) {
- printf( "Unknown Ethernet packet type %04x received\n",
- pkt->ether.type );
- goto repeat;
- }
-
- /* IP layer */
- if (MyIPaddr != IP_Unknown_Addr && pkt->ip.dst_addr != MyIPaddr) {
- printf( "Received packet for wrong IP address\n" );
- goto repeat;
- }
- if (ServerIPaddr != IP_Unknown_Addr &&
- ServerIPaddr != IP_Broadcast_Addr &&
- pkt->ip.src_addr != ServerIPaddr) {
- printf( "Received packet from wrong server\n" );
- goto repeat;
- }
- /* If IP header is longer than 5 longs, delete the options */
- if (pkt->ip.ihl > 5) {
- char *udpstart = (char *)((long *)&pkt->ip + pkt->ip.ihl);
- memmove( &pkt->udp, udpstart, *len - (udpstart-(char *)pkt) );
- }
-
- /* UDP layer */
- if (fromport != 0 && pkt->udp.src_port != fromport) {
- printf( "Received packet from wrong port %d\n", pkt->udp.src_port );
- goto repeat;
- }
- if (pkt->udp.dst_port != atport) {
- printf( "Received packet at wrong port %d\n", pkt->udp.dst_port );
- goto repeat;
- }
-
- *len = pkt->udp.len - sizeof(struct udphdr);
- return( 0 );
-}
-
-
-/* --------------------------------------------------------------------- */
-/* Address Printing */
-
-
-static void print_ip( IPADDR addr )
-
-{
- printf( "%ld.%ld.%ld.%ld",
- (addr >> 24) & 0xff,
- (addr >> 16) & 0xff,
- (addr >> 8) & 0xff,
- addr & 0xff );
-}
-
-
-static void print_hw( HWADDR addr )
-
-{
- printf( "%02x:%02x:%02x:%02x:%02x:%02x",
- addr[0], addr[1], addr[2], addr[3], addr[4], addr[5] );
-}
-
-
-/* --------------------------------------------------------------------- */
-/* Ethernet Interface Abstraction Layer */
-
-
-#ifdef ETHLL_LANCE
-#include "ethlance.h"
-#endif
-
-static ETHIF_SWITCH *PossibleInterfaces[] = {
-#ifdef ETHLL_LANCE
- &LanceSwitch,
-#endif
-};
-
-#define N_PossibleInterfaces (sizeof(PossibleInterfaces)/sizeof(*PossibleInterfaces))
-
-/* Detected interface */
-static ETHIF_SWITCH *Ethif = NULL;
-
-
-static int check_ethif( void )
-
-{ int i;
-
- /* Check for configured interfaces */
- Ethif = NULL;
- for( i = 0; i < N_PossibleInterfaces; ++i ) {
- if (PossibleInterfaces[i]->probe() >= 0) {
- Ethif = PossibleInterfaces[i];
- break;
- }
- }
- if (!Ethif)
- return( -1 );
-
- if (Ethif->init() < 0) {
- printf( "Ethernet interface initialization failed\n" );
- return( -1 );
- }
- Ethif->get_hwaddr( &MyHwaddr );
- return( 0 );
-}
-
-
-static int eth_send( Packet *pkt, int len )
-
-{
- return( Ethif->snd( pkt, len ));
-}
-
-
-static int eth_rcv( Packet *pkt, int *len )
-
-{
- return( Ethif->rcv( pkt, len ));
-}
-
-
-#if 0
-static void dump_packet( UDP *pkt )
-
-{ int i, l;
- unsigned char *p;
-
- printf( "Packet dump:\n" );
-
- printf( "Ethernet header:\n" );
- printf( " dst addr: " ); print_hw( pkt->ether.dst_addr ); printf( "\n" );
- printf( " src addr: " ); print_hw( pkt->ether.src_addr ); printf( "\n" );
- printf( " type: %04x\n", pkt->ether.type );
-
- printf( "IP header:\n" );
- printf( " version: %d\n", pkt->ip.version );
- printf( " hdr len: %d\n", pkt->ip.ihl );
- printf( " tos: %d\n", pkt->ip.tos );
- printf( " tot_len: %d\n", pkt->ip.tot_len );
- printf( " id: %d\n", pkt->ip.id );
- printf( " frag_off: %d\n", pkt->ip.frag_off );
- printf( " ttl: %d\n", pkt->ip.ttl );
- printf( " prot: %d\n", pkt->ip.protocol );
- printf( " src addr: " ); print_ip( pkt->ip.src_addr ); printf( "\n" );
- printf( " dst addr: " ); print_ip( pkt->ip.dst_addr ); printf( "\n" );
-
- printf( "UDP header:\n" );
- printf( " src port: %d\n", pkt->udp.src_port );
- printf( " dst port: %d\n", pkt->udp.dst_port );
- printf( " len: %d\n", pkt->udp.len );
-
- printf( "Data:" );
- l = pkt->udp.len - sizeof(pkt->udp);
- p = (unsigned char *)&pkt->udp + sizeof(pkt->udp);
- for( i = 0; i < l; ++i ) {
- if ((i % 32) == 0)
- printf( "\n %04x ", i );
- printf( "%02x ", *p );
- }
- printf( "\n" );
-}
-#endif
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov