318 lines
10 KiB
C
318 lines
10 KiB
C
/*++
|
||
|
||
Copyright (c) 1991 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
ip_proto.h
|
||
|
||
Abstract:
|
||
|
||
This module contains definitions for STREAMS IP
|
||
|
||
Author:
|
||
|
||
Eric Chin (ericc) July 18, 1991
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
/******************************************************************
|
||
*
|
||
* SpiderTCP Interface Primitives
|
||
*
|
||
* Copyright (c) 1988 Spider Systems Limited
|
||
*
|
||
* This Source Code is furnished under Licence, and may not be
|
||
* copied or distributed without express written agreement.
|
||
*
|
||
* All rights reserved.
|
||
*
|
||
* Written by Nick Felisiak, Ian Heavens, Peter Reid,
|
||
* Gavin Shearer, Mark Valentine
|
||
*
|
||
* IP_PROTO.H
|
||
*
|
||
* IP Streams proto primitives for TCP/IP on V.3/V.4 Streams
|
||
*
|
||
******************************************************************/
|
||
|
||
#ifndef _SYS_SNET_IP_PROTO_
|
||
#define _SYS_SNET_IP_PROTO_
|
||
|
||
|
||
#ifndef IPOPTS
|
||
#define IPOPTS
|
||
#endif
|
||
|
||
#define IP_TX 6 /* tcp/udp send pkt to ip */
|
||
#define PROT_RX 8 /* tcp/udp get pkt from ip */
|
||
#define IP_PROTQ 9 /* tcp/udp send prot q to ip */
|
||
#define ICMP_RX 12 /* upper layer rcv icmp pkt from ip */
|
||
#define ICMP_TX 13 /* upper layer send icmp pkt to ip */
|
||
#define ENQ_LOCAL 14 /* validate local address enquiry */
|
||
#define ENQ_REMOTE 15 /* validate remote address enquiry */
|
||
#define IP_FLOW 16 /* flow control interface to upper layers */
|
||
#define IP_PROT_REMOVEQ 17 /* tcp/udp deregister prot q to ip */
|
||
|
||
#ifdef TESTOPT
|
||
/*
|
||
* TESTOPT driver field
|
||
*/
|
||
#define TCPTEST 1
|
||
#define UDPTEST TCPTEST
|
||
#define IPTEST 2
|
||
|
||
/*
|
||
* TESTOPT type field
|
||
*/
|
||
|
||
#define NEXT 1 /* carry out for next num packets */
|
||
#define ALL 2 /* carry out for all packets */
|
||
#define OFF 3 /* turn off option */
|
||
#define RANDOM 4 /* carry out for random packets, prob 1/num */
|
||
|
||
/*
|
||
* TESTOPT option field
|
||
*/
|
||
|
||
#define BAD_CKSUM 1
|
||
#define SHORT_HDR 2
|
||
#define DROP 3 /* drop packet or fragment */
|
||
#define CONTROL 4 /* OR ctl field with subopt, TCP only */
|
||
#define BAD_TYPE 5 /* bad multiplexing type: port for TCP,
|
||
protocol for IP */
|
||
|
||
typedef struct testopt {
|
||
char driver; /* option for which driver: TCP/UDP, IP */
|
||
char option; /* option */
|
||
char subopt; /* suboption if applicable */
|
||
char type; /* next, on, off */
|
||
int num; /* number of packets - depends on */
|
||
} TEST_OPT;
|
||
|
||
#endif
|
||
|
||
/*
|
||
* define structure for DARPA internet address
|
||
* usually use "longs" to access but sometimes need to split into
|
||
* components
|
||
*/
|
||
|
||
typedef union {
|
||
char typea[4]; /* 4 x 8 bit version */
|
||
short typeb[2]; /* 2 x 16 bit */
|
||
long typec; /* 1 x 32 bit */
|
||
} IN_ADDRESS;
|
||
|
||
/*
|
||
* IP Option values
|
||
*/
|
||
#define OPT_EOL 0
|
||
#define OPT_NOP 1
|
||
#define OPT_SECURITY 130
|
||
#define OPT_LSRR 131
|
||
#define OPT_SSRR 137
|
||
#define OPT_RR 7
|
||
#define OPT_STRID 136
|
||
#define OPT_TIMESTAMP 68
|
||
|
||
/*
|
||
* structure of pseudo-header used for communication
|
||
* between IP and higher level processes
|
||
*/
|
||
typedef struct {
|
||
short ps_pktid; /* id to be used in inet header */
|
||
short ps_status; /* indicates status of requested action */
|
||
#define OK 0 /* status for non-ICMP packet */
|
||
IN_ADDRESS ps_src; /* source address */
|
||
IN_ADDRESS ps_dst; /* destination address */
|
||
unsigned short ps_txtlen; /* length of text */
|
||
short ps_offset; /* Fragment Offset */
|
||
short ps_if; /* IP Interface number */
|
||
unsigned char ps_prot; /* Internet protocol number */
|
||
char ps_df; /* Don't Fragment flag */
|
||
char ps_ttl; /* Time to Live flag */
|
||
#ifdef TESTOPT
|
||
int test; /* testing on for this packet */
|
||
TEST_OPT testopt; /* options for testing */
|
||
#endif
|
||
#ifdef IPOPTS
|
||
char ps_pkt_type; /* What's this packet doing? */
|
||
char ps_optlen; /* Length of options (in words) */
|
||
char ps_tos; /* Type of service */
|
||
int ps_options[1]; /* Options */
|
||
#endif
|
||
} PSEUDO_HDR;
|
||
|
||
#define SIZ_PSEUDOHDR sizeof(PSEUDO_HDR)
|
||
|
||
|
||
/*
|
||
* Types of pkt_type
|
||
*/
|
||
|
||
#define PS_FROM_ME 1 /* Started here */
|
||
#define PS_FOR_ME 2 /* Dest is this machine */
|
||
#define PS_THRU_ME 3 /* Just passing through */
|
||
#define PS_SS_ROUTING 4 /* Being strict source routed */
|
||
#define PS_LS_ROUTING 5 /* Being loose source routed */
|
||
#define PS_REPLY 6 /* response to another pkt (ie echo reply) */
|
||
|
||
typedef struct ip_protq {
|
||
int prim_type;
|
||
unsigned char prot;
|
||
} S_IP_PROTQ;
|
||
|
||
/*
|
||
* status returned to upper layer in prot
|
||
*/
|
||
#define VALID 0
|
||
#define IN_USE 1
|
||
#define INVALID 2
|
||
|
||
/*
|
||
* received from transport protocol when it sends a packet
|
||
*/
|
||
typedef struct ip_tx {
|
||
int prim_type;
|
||
short hdr_cnt;
|
||
short unused1; /* ensure structure is same size as S_PROT_RX */
|
||
BOOLEAN unused2; /* ensure structure is same size as S_PROT_RX */
|
||
PSEUDO_HDR uph;
|
||
} S_IP_TX;
|
||
|
||
/*
|
||
* sent to transport protocol when we receive a packet
|
||
*/
|
||
typedef struct prot_rx {
|
||
int prim_type;
|
||
IN_ADDRESS if_addr;
|
||
BOOLEAN is_broadcast;
|
||
PSEUDO_HDR uph;
|
||
} S_PROT_RX;
|
||
|
||
|
||
/*
|
||
* The ICMP_RX struct
|
||
*/
|
||
struct icmp_rx {
|
||
int prim_type;
|
||
IN_ADDRESS if_addr;
|
||
BOOLEAN is_broadcast;
|
||
unsigned char type;
|
||
unsigned char code;
|
||
long src;
|
||
long dst;
|
||
unsigned long misc;
|
||
PSEUDO_HDR uph;
|
||
};
|
||
|
||
|
||
/*
|
||
* The ICMP_TX struct
|
||
*/
|
||
struct icmp_tx {
|
||
int prim_type;
|
||
unsigned char type;
|
||
unsigned char code;
|
||
long src;
|
||
long dst;
|
||
unsigned long misc;
|
||
PSEUDO_HDR ph;
|
||
};
|
||
|
||
|
||
|
||
/*
|
||
* The IP_ADDRENQ struct
|
||
*/
|
||
|
||
struct ip_addrenq {
|
||
int prim_type; /* ENQ_LOCAL or ENQ_REMOTE */
|
||
char *handle; /* Place holder for TCP */
|
||
long addr; /* Remote address */
|
||
long local; /* Returned local address */
|
||
int error; /* Zero if OK, else errno */
|
||
int mss; /* Max seg size for this transfer */
|
||
int flags; /* See below */
|
||
int ifno; /* IP's interface number for this addr */
|
||
int broadcast; /* Set if remote address is broadcast */
|
||
unsigned long link_speed; /* adapter link speed in kbits/second */
|
||
unsigned long receive_buffer_size; /* bytes of adapter receive space */
|
||
};
|
||
|
||
|
||
#define ENQ_NO_KEEPALIVE 1 /* No keep-alives for this net */
|
||
|
||
|
||
/*
|
||
* IP Flow control structure
|
||
*/
|
||
|
||
struct ip_flow_info {
|
||
int prim_type; /* IP_FLOW */
|
||
int index; /* IP Interface number */
|
||
int info; /* Blocked or unblocked */
|
||
};
|
||
|
||
/**************************************************************
|
||
* ICMP constants: types & codes
|
||
**************************************************************/
|
||
|
||
#define ECHO_REPLY 0 /* echo reply */
|
||
|
||
#define DEST_UNR 3 /* destination unreachable: */
|
||
|
||
/* codes for DEST_UNR */
|
||
#define NET_UNR 0 /* net unreachable */
|
||
#define HOST_UNR 1 /* host unreachable */
|
||
#define PROT_UNR 2 /* protocol unreachable */
|
||
#define PORT_UNR 3 /* port unreachable */
|
||
#define FRAG_DF 4 /* fragmentation needed + DF */
|
||
#define SR_FAIL 5 /* source route failed */
|
||
#define DST_NET_UNKNOWN 6 /* dest network unknown */
|
||
#define DST_HOST_UNKNOWN 7 /* dest host unknown */
|
||
#define SRC_HOST_ISOLATED 8 /* source host isolated */
|
||
#define NET_PROHIBITED 9 /* communication with dest
|
||
network administratively
|
||
prohibited */
|
||
#define HOST_PROHIBITED 10 /* communication with dest
|
||
host administratively
|
||
prohibited */
|
||
#define NET_UNR_FOR_TOS 11 /* network unreachable
|
||
for type of service */
|
||
#define HOST_UNR_FOR_TOS 12 /* host unreachable
|
||
for type of service */
|
||
|
||
#define SRC_QUENCH 4 /* source quench */
|
||
|
||
#define REDIRECT 5 /* redirect message: */
|
||
#define NET_RE 0 /* redirect for network */
|
||
#define HOST_RE 1 /* redirect for host */
|
||
#define TOSN_RE 2 /* redirect for TOS/network */
|
||
#define TOSH_RE 3 /* redirect for TOS/host */
|
||
|
||
#define ICMP_ECHO 8 /* echo request */
|
||
|
||
#define TIME_EXCEEDED 11 /* time exceeded: */
|
||
#define TTL_X 0 /* time-to-live exceeded */
|
||
#define FRAG_X 1 /* frag reassem time excluded */
|
||
|
||
#define PARAMETER 12 /* parameter problem */
|
||
#define PARAM_POINTER 0 /* pointer indicates error */
|
||
#define PARAM_OPTION 1 /* required option missing */
|
||
|
||
#define TIME_STAMP 13 /* timestamp request */
|
||
#define STAMP_REPLY 14 /* timestamp reply */
|
||
|
||
#define INFO_REQ 15 /* information request */
|
||
#define INFO_REPLY 16 /* information reply */
|
||
|
||
#define MASK_REQ 17 /* address mask request */
|
||
#define MASK_REPLY 18 /* address mask reply */
|
||
|
||
#endif /* _SYS_SNET_IP_PROTO_ */
|
||
|