TheNetNode-CB/include/ip.h

355 lines
13 KiB
C
Executable File

/************************************************************************/
/* */
/* ***** ***** */
/* ***** ***** */
/* ***** ***** */
/* ***** ***** */
/* *************** *************** */
/* ***************** ***************** */
/* *************** *************** */
/* ***** ***** TheNetNode */
/* ***** ***** Portable */
/* ***** ***** Network */
/* ***** ***** Software */
/* */
/* File include/ip.h (maintained by: DG1KWA) */
/* */
/* This file is part of "TheNetNode" - Software Package */
/* */
/* Copyright (C) 1998 - 2008 NORD><LINK e.V. Braunschweig */
/* */
/* This program is free software; you can redistribute it and/or modify */
/* it under the terms of the NORD><LINK ALAS (Allgemeine Lizenz fuer */
/* Amateurfunk Software) as published by Hans Georg Giese (DF2AU) */
/* on 13/Oct/1992; either version 1, or (at your option) any later */
/* version. */
/* */
/* This program is distributed WITHOUT ANY WARRANTY only for further */
/* development and learning purposes. See the ALAS (Allgemeine Lizenz */
/* fuer Amateurfunk Software). */
/* */
/* You should have received a copy of the NORD><LINK ALAS (Allgemeine */
/* Lizenz fuer Amateurfunk Software) along with this program; if not, */
/* write to NORD><LINK e.V., Hinter dem Berge 5, D-38108 Braunschweig */
/* */
/* Dieses Programm ist PUBLIC DOMAIN, mit den Einschraenkungen durch */
/* die ALAS (Allgemeine Lizenz fuer Amateurfunk Software), entweder */
/* Version 1, veroeffentlicht von Hans Georg Giese (DF2AU), */
/* am 13.Oct.1992, oder (wenn gewuenscht) jede spaetere Version. */
/* */
/* Dieses Programm wird unter Haftungsausschluss vertrieben, aus- */
/* schliesslich fuer Weiterentwicklungs- und Lehrzwecke. Naeheres */
/* koennen Sie der ALAS (Allgemeine Lizenz fuer Amateurfunk Software) */
/* entnehmen. */
/* */
/* Sollte dieser Software keine ALAS (Allgemeine Lizenz fuer Amateur- */
/* funk Software) beigelegen haben, wenden Sie sich bitte an */
/* NORD><LINK e.V., Hinter dem Berge 5, D-38108 Braunschweig */
/* */
/************************************************************************/
/* IP protocol field values */
#define ICMP_PTCL 1 /* Internet Control Message Protocol */
#define TCP_PTCL 6 /* Transmission Control Protocol */
#define UDP_PTCL 17 /* User Datagram Protocol */
#define RSPF_PTCL 73 /* Radio Shortest Path First Protocol */
#define MAXTTL 255 /* Maximum possible IP time-to-live value */
/* DoD-style precedences */
#define ROUTINE 0x00
#define PRIORITY 0x20
#define IMMEDIATE 0x40
#define FLASH 0x60
#define FLASH_OVER 0x80
#define CRITIC 0xa0
#define INET_CTL 0xc0
#define NET_CTL 0xe0
/* Amateur-style precedences */
#define AM_ROUTINE 0x00
#define AM_WELFARE 0x20
#define AM_PRIORITY 0x40
#define AM_EMERGENCY 0x60
/* Class-of-service bits */
#define LOW_DELAY 0x10
#define THROUGHPUT 0x08
#define RELIABILITY 0x04
/* IP TOS fields */
#define PREC(x) ((x)>>5 & 7)
#define DELAY 0x10
#define THRUPUT 0x8
#define RELIABLITY 0x4
/* structure for an ip address (long) */
typedef unsigned long ipaddr;
/* Format of a MIB entry for statistics gathering */
typedef struct mib_entry {
const char *name;
struct {
unsigned int integer;
} value;
} MIB_ENTRY;
#define TLB 30 /* Default reassembly timeout, sec */
#define IPVERSION 4 /* IP-Version 4.0 */
#define IP_MAXOPT 40 /* Largest option field, bytes */
/* SNMP MIB variables, used for statistics and control. See RFC 1066 */
#define ipForwarding Ip_mib[1].value.integer
#define ipDefaultTTL Ip_mib[2].value.integer
#define ipInReceives Ip_mib[3].value.integer
#define ipInHdrErrors Ip_mib[4].value.integer
#define ipInAddrErrors Ip_mib[5].value.integer
#define ipForwDatagrams Ip_mib[6].value.integer
#define ipInUnknownProtos Ip_mib[7].value.integer
#define ipInDiscards Ip_mib[8].value.integer
#define ipInDelivers Ip_mib[9].value.integer
#define ipOutRequests Ip_mib[10].value.integer
#define ipOutDiscards Ip_mib[11].value.integer
#define ipOutNoRoutes Ip_mib[12].value.integer
#define ipReasmTimeout Ip_mib[13].value.integer
#define ipReasmReqds Ip_mib[14].value.integer
#define ipReasmOKs Ip_mib[15].value.integer
#define ipReasmFails Ip_mib[16].value.integer
#define ipFragOKs Ip_mib[17].value.integer
#define ipFragFails Ip_mib[18].value.integer
#define ipFragCreates Ip_mib[19].value.integer
#define NUMIPMIB 19
/* IP header, INTERNAL representation */
typedef struct ip_struct {
unsigned char version; /* IP version number */
unsigned char ihl; /* Internet Header Length */
unsigned char tos; /* Type of service */
unsigned length; /* Total length */
unsigned id; /* Identification */
unsigned offset; /* Fragment offset in bytes */
struct {
unsigned char df; /* Don't fragment flag */
unsigned char mf; /* More Fragments flag */
} flags;
unsigned char ttl; /* Time to live */
unsigned char protocol; /* Protocol */
unsigned checksum; /* Header checksum */
ipaddr source; /* Source address */
ipaddr dest; /* Destination address */
unsigned char options[IP_MAXOPT];/* Options field */
unsigned optlen; /* Length of options field, bytes */
} IP;
#define TCP_MAXOPT 4 /* max Anzahl als Option-Bytes */
typedef unsigned long SEQ;
typedef unsigned long ACK;
/* TCP header */
typedef struct tcp_struct {
unsigned srcPort; /* Source-Port */
unsigned dstPort; /* Destination-POrt */
SEQ seqnum; /* Sequence Number */
ACK acknum; /* Acknowledgement Number */
unsigned char data_offset; /* Data Offset 4 Bits */
unsigned char res; /* reserviert */
unsigned flags; /* Flags */
unsigned window; /* Window */
unsigned checksum; /* Checksum */
unsigned urgentPointer; /* Urgent Pointer */
unsigned char options[TCP_MAXOPT]; /* Options and Padding */
} TCP;
/* UDP header */
typedef struct udp_struct {
unsigned srcPort;
unsigned dstPort;
unsigned length;
unsigned checksum;
} UDP;
#define NULLIP (IP *)NULL
#define IPLEN 20 /* Length of standard IP header */
/* Fields in option type byte */
#define OPT_COPIED 0x80 /* Copied-on-fragmentation flag */
#define OPT_CLASS 0x60 /* Option class */
#define OPT_NUMBER 0x1f /* Option number */
/* IP option numbers */
#define IP_EOL 0 /* End of options list */
#define IP_NOOP 1 /* No Operation */
#define IP_SECURITY 2 /* Security parameters */
#define IP_LSROUTE 3 /* Loose Source Routing */
#define IP_TIMESTAMP 4 /* Internet Timestamp */
#define IP_RROUTE 7 /* Record Route */
#define IP_STREAMID 8 /* Stream ID */
#define IP_SSROUTE 9 /* Strict Source Routing */
/* Timestamp option flags */
#define TS_ONLY 0 /* Time stamps only */
#define TS_ADDRESS 1 /* Addresses + Time stamps */
#define TS_PRESPEC 3 /* Prespecified addresses only */
/* structure for routing tables */
typedef struct iproute
{
struct iproute *nextip;
struct iproute *previp;
#ifdef BUFFER_DEBUG
UBYTE owner; /* Muss an 9. Bytestelle stehen */
#endif
ipaddr dest;
ipaddr gateway;
unsigned metric;
unsigned timer;
unsigned char bits;
#ifdef __WIN32__
unsigned char Interface;
#else
unsigned char interface;
#endif
unsigned char flags;
#define RTDYNAMIC 0x01 /* dynamic ip-address */
unsigned char spare_byte;
UBYTE port;
BOOLEAN automatic_flag;
} IP_ROUTE;
#define NULLROUTE (IP_ROUTE *)NULL
/* Cache for the last-used routing entry, speeds up the common case where
* we handle a burst of packets to the same destination
*/
/*typedef struct rt_cache {
ipaddr target;
IP_ROUTE *route;
} RT_CACHE;
*/
typedef struct arp_tab
{
struct arp_tab *nextar;
struct arp_tab *prevar;
#ifdef BUFFER_DEBUG
UBYTE owner; /* Muss an 9. Bytestelle stehen */
#endif
ipaddr dest;
unsigned timer;
char dgmode;
UBYTE hwtype;
char publish_flag;
char state;
char callsign[7];
char digi[15];
WORD port;
BOOLEAN automatic_flag;
} ARP_TAB;
#define NULLARP (ARP_TAB *)NULL
#define ARP_NETROM 0
#define ARP_AX25 3
#define MAXHWALEN 10
#define IPTYPE 42
#define ARP_REQUEST 1
#define ARP_REPLY 2
#define REVARP_REQUEST 3
#define REVARP_REPLY 4
typedef struct arp
{
unsigned hardware;
unsigned protocol;
unsigned char hwalen;
unsigned char pralen;
unsigned opcode;
unsigned char shwaddr[MAXHWALEN];
ipaddr sprotaddr;
unsigned char thwaddr[MAXHWALEN];
ipaddr tprotaddr;
} ARP;
#define NULLBUF ( void * )NULL
/* Pseudo-header for TCP and UDP checksumming */
typedef struct pseudo_header {
ipaddr source; /* IP source */
ipaddr dest; /* IP destination */
unsigned char protocol; /* Protocol */
unsigned length; /* Data field length */
} PSEUDO_HEADER;
#define NULLHEADER (struct pseudo_header *)NULL
#ifdef IPROUTE
/* src/l7ip.c */
void ccpipr(void);
void showroute(IP_ROUTE *,MBHEAD *);
void show_ip_addr(ipaddr,MBHEAD *);
BOOLEAN get_ip_addr(ipaddr *,WORD *,char **);
void ccparp(void);
void showarp(ARP_TAB *,MBHEAD *);
void ccpipa(void);
void ccpipb(void);
void ccpips(void);
BOOLEAN rt_add(ipaddr,unsigned int ,ipaddr,int ,unsigned int ,unsigned int ,int, BOOLEAN);
BOOLEAN route_find(IP_ROUTE **,ipaddr *,ipaddr,unsigned int );
BOOLEAN rt_drop(ipaddr,unsigned int, BOOLEAN);
BOOLEAN arp_add(ipaddr, WORD, char *, const char *, unsigned int,
unsigned int, BOOLEAN, BOOLEAN);
BOOLEAN find_arp(ARP_TAB * *,ipaddr, WORD );
BOOLEAN arp_drop(ipaddr, WORD, BOOLEAN);
void arpsrv(void);
void ccpping(void);
BOOLEAN l2toip(WORD);
/* src/iproute.c */
void ipinit(void );
void ipserv(void );
void ip_route(MBHEAD * );
void arp_service(MBHEAD *);
IP_ROUTE *rt_find(ipaddr);
void nr_iface(MBHEAD *,ipaddr );
void l2_iface(MBHEAD *,unsigned int ,ipaddr,unsigned int );
ARP_TAB *res_arp(ipaddr, unsigned int );
MBHEAD *htonip(IP *,MBHEAD *, BOOLEAN );
int ip_send(ipaddr,ipaddr,unsigned ,unsigned ,unsigned ,MBHEAD *,unsigned short ,unsigned short ,unsigned );
unsigned short eac(long );
unsigned short cksum(PSEUDO_HEADER *,MBHEAD *,unsigned short );
void arp_request(ipaddr,unsigned,unsigned);
void arp_send( unsigned, char *);
void ccp_ip_help(ipaddr *, const char *);
BOOLEAN pingem(ipaddr target,int seq,int id, int len, char *opt);
#define NR4_OP_PID 0
#define NR_PROTO_IP 0x0c
typedef struct ipportpar {
WORD ipMode; /* Mode-Flags fuer diesen Port */
#define ARP_OK 0x0001 /* ARP erlaubt */
#define IP_FORWARDING 0x0002 /* das Weiterleiten von IP-Frames */
WORD mtu; /* Maximale Blockgroesse */
} IPPORTPAR;
extern LHEAD arprxfl; /* Empfangene ARP-Frames */
extern IPPORTPAR IPpar[]; /* fuer jeden L2-Port + NETROM */
#define NETROM_PORT L2PNUM
#ifdef KERNELIF
#define KERNEL_PORT L2PNUM + 1
#endif
#define is_my_ip_addr( address ) ( address == my_ip_addr )
#define is_broadcast_address( address ) ( bcast_ip_addr != 0 && bcast_ip_addr == address )
#else
#define l2toip(x) FALSE
#endif /* IPROUTE */
/* End of $RCSfile$ */