model to an instance-based model. Each ethernet driver instance is now responsible for exactly one network interface card. The port field in /etc/inet.conf now acts as an instance field instead. This patch also updates the data link protocol. This update: - eliminates the concept of ports entirely; - eliminates DL_GETNAME entirely; - standardizes on using m_source for IPC and DL_ENDPT for safecopies; - removes error codes from TASK/STAT replies, as they were unused; - removes a number of other old or unused fields; - names and renames a few other fields. All ethernet drivers have been changed to: - conform to the new protocol, and exactly that; - take on an instance number based on a given "instance" argument; - skip that number of PCI devices in probe iterations; - use config tables and environment variables based on that number; - no longer be limited to a predefined maximum of cards in any way; - get rid of any leftover non-safecopy support and other ancient junk; - have a correct banner protocol figure, or none at all. Other changes: * Inet.conf is now taken to be line-based, and supports #-comments. No existing installations are expected to be affected by this. * A new, select-based asynchio library replaces the old one. Kindly contributed by Kees J. Bot. * Inet now supports use of select() on IP devices. Combined, the last two changes together speed up dhcpd considerably in the presence of multiple interfaces. * A small bug has been fixed in nonamed.
192 lines
4.7 KiB
C
192 lines
4.7 KiB
C
/*
|
|
ip_int.h
|
|
|
|
Copyright 1995 Philip Homburg
|
|
*/
|
|
|
|
#ifndef INET_IP_INT_H
|
|
#define INET_IP_INT_H
|
|
|
|
#define IP_FD_NR (8*IP_PORT_MAX)
|
|
#define IP_ASS_NR 3
|
|
|
|
#define IP_42BSD_BCAST 1 /* hostnumber 0 is also network
|
|
broadcast */
|
|
|
|
#define IP_LT_NORMAL 0 /* Normal */
|
|
#define IP_LT_BROADCAST 1 /* Broadcast */
|
|
#define IP_LT_MULTICAST 2 /* Multicast */
|
|
|
|
struct ip_port;
|
|
struct ip_fd;
|
|
typedef void (*ip_dev_t) ARGS(( struct ip_port *ip_port ));
|
|
typedef int (*ip_dev_send_t) ARGS(( struct ip_port *ip_port, ipaddr_t dest,
|
|
acc_t *pack, int type ));
|
|
|
|
#define IP_PROTO_HASH_NR 32
|
|
|
|
typedef struct ip_port
|
|
{
|
|
int ip_flags, ip_dl_type;
|
|
int ip_port;
|
|
union
|
|
{
|
|
struct
|
|
{
|
|
int de_state;
|
|
int de_flags;
|
|
int de_port;
|
|
int de_fd;
|
|
acc_t *de_frame;
|
|
acc_t *de_q_head;
|
|
acc_t *de_q_tail;
|
|
acc_t *de_arp_head;
|
|
acc_t *de_arp_tail;
|
|
} dl_eth;
|
|
struct
|
|
{
|
|
int ps_port;
|
|
acc_t *ps_send_head;
|
|
acc_t *ps_send_tail;
|
|
} dl_ps;
|
|
} ip_dl;
|
|
ipaddr_t ip_ipaddr;
|
|
ipaddr_t ip_subnetmask;
|
|
ipaddr_t ip_classfulmask;
|
|
u16_t ip_frame_id;
|
|
u16_t ip_mtu;
|
|
u16_t ip_mtu_max; /* Max MTU for this kind of network */
|
|
ip_dev_t ip_dev_main;
|
|
ip_dev_t ip_dev_set_ipaddr;
|
|
ip_dev_send_t ip_dev_send;
|
|
acc_t *ip_loopb_head;
|
|
acc_t *ip_loopb_tail;
|
|
event_t ip_loopb_event;
|
|
acc_t *ip_routeq_head;
|
|
acc_t *ip_routeq_tail;
|
|
event_t ip_routeq_event;
|
|
struct ip_fd *ip_proto_any;
|
|
struct ip_fd *ip_proto[IP_PROTO_HASH_NR];
|
|
} ip_port_t;
|
|
|
|
#define IES_EMPTY 0x0
|
|
#define IES_SETPROTO 0x1
|
|
#define IES_GETIPADDR 0x2
|
|
#define IES_MAIN 0x3
|
|
#define IES_ERROR 0x4
|
|
|
|
#define IEF_EMPTY 0x1
|
|
#define IEF_SUSPEND 0x8
|
|
#define IEF_READ_IP 0x10
|
|
#define IEF_READ_SP 0x20
|
|
#define IEF_WRITE_SP 0x80
|
|
|
|
#define IPF_EMPTY 0x0
|
|
#define IPF_CONFIGURED 0x1
|
|
#define IPF_IPADDRSET 0x2
|
|
#define IPF_NETMASKSET 0x4
|
|
#define IPF_SUBNET_BCAST 0x8 /* Subset support subnet broadcasts */
|
|
|
|
#define IPDL_ETH NETTYPE_ETH
|
|
#define IPDL_PSIP NETTYPE_PSIP
|
|
|
|
typedef struct ip_ass
|
|
{
|
|
acc_t *ia_frags;
|
|
int ia_min_ttl;
|
|
ip_port_t *ia_port;
|
|
time_t ia_first_time;
|
|
ipaddr_t ia_srcaddr, ia_dstaddr;
|
|
int ia_proto, ia_id;
|
|
} ip_ass_t;
|
|
|
|
typedef struct ip_fd
|
|
{
|
|
int if_flags;
|
|
struct nwio_ipopt if_ipopt;
|
|
ip_port_t *if_port;
|
|
struct ip_fd *if_proto_next;
|
|
int if_srfd;
|
|
acc_t *if_rdbuf_head;
|
|
acc_t *if_rdbuf_tail;
|
|
get_userdata_t if_get_userdata;
|
|
put_userdata_t if_put_userdata;
|
|
put_pkt_t if_put_pkt;
|
|
select_res_t if_select_res;
|
|
time_t if_exp_time;
|
|
size_t if_rd_count;
|
|
ioreq_t if_ioctl;
|
|
} ip_fd_t;
|
|
|
|
#define IFF_EMPTY 0x00
|
|
#define IFF_INUSE 0x01
|
|
#define IFF_OPTSET 0x02
|
|
#define IFF_BUSY 0x0C
|
|
# define IFF_READ_IP 0x04
|
|
# define IFF_IOCTL_IP 0x08
|
|
#define IFF_SEL_READ 0x10
|
|
|
|
typedef enum nettype
|
|
{
|
|
IPNT_ZERO, /* 0.xx.xx.xx */
|
|
IPNT_CLASS_A, /* 1.xx.xx.xx .. 126.xx.xx.xx */
|
|
IPNT_LOCAL, /* 127.xx.xx.xx */
|
|
IPNT_CLASS_B, /* 128.xx.xx.xx .. 191.xx.xx.xx */
|
|
IPNT_CLASS_C, /* 192.xx.xx.xx .. 223.xx.xx.xx */
|
|
IPNT_CLASS_D, /* 224.xx.xx.xx .. 239.xx.xx.xx */
|
|
IPNT_CLASS_E, /* 240.xx.xx.xx .. 247.xx.xx.xx */
|
|
IPNT_MARTIAN, /* 248.xx.xx.xx .. 254.xx.xx.xx + others */
|
|
IPNT_BROADCAST /* 255.255.255.255 */
|
|
} nettype_t;
|
|
|
|
struct nwio_ipconf;
|
|
|
|
/* ip_eth.c */
|
|
int ipeth_init ARGS(( ip_port_t *ip_port ));
|
|
|
|
/* ip_ioctl.c */
|
|
void ip_hash_proto ARGS(( ip_fd_t *ip_fd ));
|
|
void ip_unhash_proto ARGS(( ip_fd_t *ip_fd ));
|
|
int ip_setconf ARGS(( int ip_port, struct nwio_ipconf *ipconfp ));
|
|
|
|
/* ip_lib.c */
|
|
ipaddr_t ip_get_netmask ARGS(( ipaddr_t hostaddr ));
|
|
ipaddr_t ip_get_ifaddr ARGS(( int ip_port_nr ));
|
|
int ip_chk_hdropt ARGS(( u8_t *opt, int optlen ));
|
|
void ip_print_frags ARGS(( acc_t *acc ));
|
|
nettype_t ip_nettype ARGS(( ipaddr_t ipaddr ));
|
|
ipaddr_t ip_netmask ARGS(( nettype_t nettype ));
|
|
char *ip_nettoa ARGS(( nettype_t nettype ));
|
|
|
|
/* ip_ps.c */
|
|
int ipps_init ARGS(( ip_port_t *ip_port ));
|
|
void ipps_get ARGS(( int ip_port_nr ));
|
|
void ipps_put ARGS(( int ip_port_nr, ipaddr_t nexthop, acc_t *pack ));
|
|
|
|
/* ip_read.c */
|
|
void ip_port_arrive ARGS(( ip_port_t *port, acc_t *pack, ip_hdr_t *ip_hdr ));
|
|
void ip_arrived ARGS(( ip_port_t *port, acc_t *pack ));
|
|
void ip_arrived_broadcast ARGS(( ip_port_t *port, acc_t *pack ));
|
|
void ip_process_loopb ARGS(( event_t *ev, ev_arg_t arg ));
|
|
int ip_sel_read ARGS(( ip_fd_t *ip_fd ));
|
|
void ip_packet2user ARGS(( ip_fd_t *ip_fd, acc_t *pack, time_t exp_time,
|
|
size_t data_len ));
|
|
|
|
/* ip_write.c */
|
|
void dll_eth_write_frame ARGS(( ip_port_t *port ));
|
|
acc_t *ip_split_pack ARGS(( ip_port_t *ip_port, acc_t **ref_last, int mtu ));
|
|
void ip_hdr_chksum ARGS(( ip_hdr_t *ip_hdr, int ip_hdr_len ));
|
|
|
|
|
|
extern ip_fd_t ip_fd_table[IP_FD_NR];
|
|
extern ip_port_t *ip_port_table;
|
|
extern ip_ass_t ip_ass_table[IP_ASS_NR];
|
|
|
|
#define NWIO_DEFAULT (NWIO_EN_LOC | NWIO_EN_BROAD | NWIO_REMANY | \
|
|
NWIO_RWDATALL | NWIO_HDR_O_SPEC)
|
|
|
|
#endif /* INET_IP_INT_H */
|
|
|
|
/*
|
|
* $PchId: ip_int.h,v 1.19 2004/08/03 16:24:23 philip Exp $
|
|
*/
|