It is accomplished ...

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@10 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
ejakowatz
2002-07-09 12:24:59 +00:00
commit 52a3801208
2025 changed files with 472889 additions and 0 deletions
+275
View File
@@ -0,0 +1,275 @@
/* if.h
* Interface definitions for beos
*/
#ifndef OBOS_IF_H
#define OBOS_IF_H
#include <kernel/OS.h>
#include <Drivers.h>
#include "sys/socketvar.h"
#include "net/if_types.h"
#include "netinet/in.h"
#include "net/route.h"
enum {
IF_GETADDR = B_DEVICE_OP_CODES_END,
IF_INIT,
IF_NONBLOCK,
IF_ADDMULTI,
IF_REMMULTI,
IF_SETPROMISC,
IF_GETFRAMESIZE
};
/* Media types are now listed in net/if_types.h */
/* Interface flags */
enum {
IFF_UP = 0x0001,
IFF_DOWN = 0x0002,
IFF_PROMISC = 0x0004,
IFF_RUNNING = 0x0008,
IFF_MULTICAST = 0x0010,
IFF_BROADCAST = 0x0020,
IFF_POINTOPOINT = 0x0040,
IFF_NOARP = 0x0080,
IFF_LOOPBACK = 0x0100,
IFF_DEBUG = 0x0200,
IFF_LINK0 = 0x0400,
IFF_LINK1 = 0x0800,
IFF_LINK2 = 0x1000,
IFF_SIMPLEX = 0x2000
};
struct ifq {
struct mbuf *head;
struct mbuf *tail;
int maxlen;
int len;
sem_id lock;
sem_id pop;
};
#define IFQ_FULL(ifq) (ifq->len >= ifq->maxlen)
#define IFQ_ENQUEUE(ifq, m) { \
acquire_sem((ifq)->lock); \
(m)->m_nextpkt = 0; \
if ((ifq)->tail == 0) \
(ifq)->head = m; \
else \
(ifq)->tail->m_nextpkt = m; \
(ifq)->tail = m; \
(ifq)->len++; \
release_sem((ifq)->lock); \
release_sem((ifq)->pop); \
}
#define IFQ_DEQUEUE(ifq, m) { \
acquire_sem((ifq)->lock); \
(m) = (ifq)->head; \
if (m) { \
if (((ifq)->head = (m)->m_nextpkt) == 0) \
(ifq)->tail = 0; \
(m)->m_nextpkt = 0; \
(ifq)->len--; \
} \
release_sem((ifq)->lock); \
}
struct ifaddr {
struct ifaddr *ifa_next; /* the next address for the interface */
struct ifnet *ifa_ifp; /* pointer to the interface structure */
struct sockaddr *ifa_addr; /* the address - cast to be a suitable type, so we
* use this structure to store any type of address that
* we have a struct sockaddr_? for. e.g.
* link level address via sockaddr_dl and
* ipv4 via sockeddr_in
* same for next 2 pointers as well
*/
struct sockaddr *ifa_dstaddr; /* if we're on a point-to-point link this
* is the other end */
struct sockaddr *ifa_netmask; /* The netmask we're using */
/* check or clean routes... */
void (*ifa_rtrequest)(int, struct rtentry *, struct sockaddr *);
uint8 ifa_flags; /* flags (mainly routing */
uint16 ifa_refcnt; /* how many references are there to
* this structure? */
int ifa_metric; /* the metirc for this interface/address */
};
#define ifa_broadaddr ifa_dstaddr
struct if_data {
uint8 ifi_type; /* type of media */
uint8 ifi_addrlen; /* length of media address length */
uint8 ifi_hdrlen; /* size of media header */
uint32 ifi_mtu; /* mtu */
uint32 ifi_metric; /* routing metric */
uint32 ifi_baudrate; /* baudrate of line */
/* statistics!! */
int32 ifi_ipackets; /* packets received on interface */
int32 ifi_ierrors; /* input errors on interface */
int32 ifi_opackets; /* packets sent on interface */
int32 ifi_oerrors; /* output errors on interface */
int32 ifi_collisions; /* collisions on csma interfaces */
int32 ifi_ibytes; /* total number of octets received */
int32 ifi_obytes; /* total number of octets sent */
int32 ifi_imcasts; /* packets received via multicast */
int32 ifi_omcasts; /* packets sent via multicast */
int32 ifi_iqdrops; /* dropped on input, this interface */
int32 ifi_noproto; /* destined for unsupported protocol */
};
struct ifnet {
struct ifnet *if_next; /* next device */
struct ifaddr *if_addrlist; /* linked list of addresses */
int devid; /* our device id if we have one... */
int id; /* id within the stack's device list */
char *name; /* name of driver e.g. tulip */
int if_unit; /* number of unit e.g 0 */
char *if_name; /* full name, e.g. tulip0 */
struct if_data ifd; /* if_data structure, shortcuts below */
int if_flags; /* if flags */
int if_index; /* our index in ifnet_addrs and interfaces */
struct ifq *rxq;
thread_id rx_thread;
struct ifq *txq;
thread_id tx_thread;
struct ifq *devq;
int (*start) (struct ifnet *);
int (*stop) (struct ifnet *);
void (*input) (struct mbuf*);
int (*output)(struct ifnet *, struct mbuf*,
struct sockaddr*, struct rtentry *);
int (*ioctl) (struct ifnet *, int, caddr_t);
};
#define if_mtu ifd.ifi_mtu
#define if_type ifd.ifi_type
#define if_addrlen ifd.ifi_addrlen
#define if_hdrlen ifd.ifi_hdrlen
#define if_metric ifd.ifi_metric
#define if_baudrate ifd.ifi_baurdate
#define if_ipackets ifd.ifi_ipackets
#define if_ierrors ifd.ifi_ierrors
#define if_opackets ifd.ifi_opackets
#define if_oerrors ifd.ifi_oerrors
#define if_collisions ifd.ifi_collisions
#define if_ibytes ifd.ifi_ibytes
#define if_obytes ifd.ifi_obytes
#define if_imcasts ifd.ifi_imcasts
#define if_omcasts ifd.ifi_omcasts
#define if_iqdrops ifd.ifi_iqdrops
#define if_noproto ifd.ifi_noproto
#define IFNAMSIZ 16
/* This structure is used for passing interface requests via ioctl */
struct ifreq {
char ifr_name[IFNAMSIZ]; /* name of interface */
union {
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
uint16 ifru_flags;
int ifru_metric;
caddr_t ifru_data;
} ifr_ifru;
};
#define ifr_addr ifr_ifru.ifru_addr
#define ifr_dstaddr ifr_ifru.ifru_dstaddr
#define ifr_broadaddr ifr_ifru.ifru_broadaddr
#define ifr_flags ifr_ifru.ifru_flags
#define ifr_metric ifr_ifru.ifru_metric
#define ifr_mtu ifr_ifru.ifru_metric /* sneaky overload :) */
#define ifr_data ifr_ifru.ifru_data
struct ifconf {
int ifc_len; /* length of associated buffer */
union {
caddr_t ifcu_buf;
struct ifreq *ifcu_req;
} ifc_ifcu;
};
#define ifc_buf ifc_ifcu.ifcu_buf
#define ifc_req ifc_ifcu.ifcu_req
#define IFAFREE(ifa) \
do { \
if ((ifa)->ifa_refcnt <= 0) \
ifafree(ifa); \
else \
(ifa)->ifa_refcnt--; \
} while (0)
/* used to pass in additional information, such as aliases */
struct ifaliasreq {
char ifa_name[IFNAMSIZ];
struct sockaddr ifra_addr;
struct sockaddr ifra_broadaddr;
#define ifra_dstaddr ifra_broadaddr
struct sockaddr ifra_mask;
};
#define IFA_ROUTE RTF_UP
/*
* Message format for use in obtaining information about interfaces
* from sysctl and the routing socket.
*/
struct if_msghdr {
u_short ifm_msglen; /* to skip over non-understood messages */
u_char ifm_version; /* future binary compatability */
u_char ifm_type; /* message type */
int ifm_addrs; /* like rtm_addrs */
int ifm_flags; /* value of if_flags */
u_short ifm_index; /* index for associated ifp */
struct if_data ifm_data;/* statistics and other data about if */
};
/*
* Message format for use in obtaining information about interface addresses
* from sysctl and the routing socket.
*/
struct ifa_msghdr {
u_short ifam_msglen; /* to skip over non-understood messages */
u_char ifam_version; /* future binary compatability */
u_char ifam_type; /* message type */
int ifam_addrs; /* like rtm_addrs */
int ifam_flags; /* value of ifa_flags */
u_short ifam_index; /* index for associated ifp */
int ifam_metric; /* value of ifa_metric */
};
#ifdef _NETWORK_STACK
/* function declaration */
struct ifq *start_ifq(void);
void stop_ifq(struct ifq *);
struct ifnet *get_interfaces(void);
struct ifnet *ifunit(char *name);
struct ifaddr *ifa_ifwithaddr(struct sockaddr *);
struct ifaddr *ifa_ifwithaf(int);
struct ifaddr *ifa_ifwithdstaddr(struct sockaddr *);
struct ifaddr *ifa_ifwithnet(struct sockaddr *);
struct ifaddr *ifa_ifwithroute(int, struct sockaddr *,
struct sockaddr *);
struct ifaddr *ifaof_ifpforaddr(struct sockaddr *, struct ifnet *);
void ifafree(struct ifaddr *);
void if_attach(struct ifnet *ifp);
void if_detach(struct ifnet *ifp);
int ifioctl(struct socket *so, int cmd, caddr_t data);
int ifconf(int cmd, caddr_t data);
void if_init(void);
#endif
#endif /* OBOS_IF_H */
+92
View File
@@ -0,0 +1,92 @@
/*
* Copyright (c) 1986, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)if_arp.h 8.1 (Berkeley) 6/10/93
*/
#ifndef NET_IF_ARP_H
#define NET_IF_ARP_H
/*
* Address Resolution Protocol.
*
* See RFC 826 for protocol description. ARP packets are variable
* in size; the arphdr structure defines the fixed-length portion.
* Protocol type values are the same as those for 10 Mb/s Ethernet.
* It is followed by the variable-sized fields ar_sha, arp_spa,
* arp_tha and arp_tpa in that order, according to the lengths
* specified. Field names used correspond to RFC 826.
*/
struct arphdr {
uint16 ar_hrd; /* format of hardware address */
uint16 ar_pro; /* format of protocol address */
uint8 ar_hln; /* length of hardware address */
uint8 ar_pln; /* length of protocol address */
uint16 ar_op; /* one of: */
/*
* The remaining fields are variable in size,
* according to the sizes above.
*/
#ifdef COMMENT_ONLY
uint8 ar_sha[]; /* sender hardware address */
uint8 ar_spa[]; /* sender protocol address */
uint8 ar_tha[]; /* target hardware address */
uint8 ar_tpa[]; /* target protocol address */
#endif
};
#define ARPHRD_ETHER 1 /* ethernet hardware format */
#define ARPHRD_IEEE802 6 /* IEEE 802 hardware format */
#define ARPHRD_FRELAY 15 /* frame relay hardware format */
#define ARPOP_REQUEST 1 /* request to resolve address */
#define ARPOP_REPLY 2 /* response to previous request */
#define ARPOP_REVREQUEST 3 /* request protocol address given hardware */
#define ARPOP_REVREPLY 4 /* response giving protocol address */
#define ARPOP_INVREQUEST 8 /* request to identify peer */
#define ARPOP_INVREPLY 9 /* response identifying peer */
/*
* ARP ioctl request
*/
struct arpreq {
struct sockaddr arp_pa; /* protocol address */
struct sockaddr arp_ha; /* hardware address */
int arp_flags; /* flags */
};
/* arp_flags and at_flags field values */
#define ATF_INUSE 0x01 /* entry in use */
#define ATF_COM 0x02 /* completed entry (enaddr valid) */
#define ATF_PERM 0x04 /* permanent entry */
#define ATF_PUBL 0x08 /* publish entry (respond for other host) */
#define ATF_USETRAILERS 0x10 /* has requested trailers */
#endif /* NET_IF_ARP_H */
+30
View File
@@ -0,0 +1,30 @@
/* if.h
* Interface definitions for beos
*/
#ifndef OBOS_IF_DL_H
#define OBOS_IF_DL_H
#include "net/if.h"
/* link level sockaddr structure */
struct sockaddr_dl {
uint8 sdl_len; /* Total length of sockaddr */
uint8 sdl_family; /* AF_LINK */
uint16 sdl_index; /* if != 0, system given index for interface */
uint8 sdl_type; /* interface type */
uint8 sdl_nlen; /* interface name length, no trailing 0 reqd. */
uint8 sdl_alen; /* link level address length */
uint8 sdl_slen; /* link layer selector length */
char sdl_data[12]; /* minimum work area, can be larger;
contains both if name and ll address */
};
/* Macro to get a pointer to the link level address */
#define LLADDR(s) ((caddr_t)((s)->sdl_data + (s)->sdl_nlen))
void link_addr (const char *, struct sockaddr_dl *);
char *link_ntoa (const struct sockaddr_dl *);
#endif /* OBOS_IF_DL_H */
+129
View File
@@ -0,0 +1,129 @@
/* $OpenBSD: if_ppp.h,v 1.6 2001/06/09 06:16:38 angelos Exp $ */
/* $NetBSD: if_ppp.h,v 1.11 1996/03/15 02:28:05 paulus Exp $ */
/*
* if_ppp.h - Point-to-Point Protocol definitions.
*
* Copyright (c) 1989 Carnegie Mellon University.
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by Carnegie Mellon University. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#ifndef _NET_IF_PPP_H_
#define _NET_IF_PPP_H_
/*
* Bit definitions for flags.
*/
#define SC_COMP_PROT 0x00000001 /* protocol compression (output) */
#define SC_COMP_AC 0x00000002 /* header compression (output) */
#define SC_COMP_TCP 0x00000004 /* TCP (VJ) compression (output) */
#define SC_NO_TCP_CCID 0x00000008 /* disable VJ connection-id comp. */
#define SC_REJ_COMP_AC 0x00000010 /* reject adrs/ctrl comp. on input */
#define SC_REJ_COMP_TCP 0x00000020 /* reject TCP (VJ) comp. on input */
#define SC_CCP_OPEN 0x00000040 /* Look at CCP packets */
#define SC_CCP_UP 0x00000080 /* May send/recv compressed packets */
#define SC_DEBUG 0x00010000 /* enable debug messages */
#define SC_LOG_INPKT 0x00020000 /* log contents of good pkts recvd */
#define SC_LOG_OUTPKT 0x00040000 /* log contents of pkts sent */
#define SC_LOG_RAWIN 0x00080000 /* log all chars received */
#define SC_LOG_FLUSH 0x00100000 /* log all chars flushed */
#define SC_RCV_B7_0 0x01000000 /* have rcvd char with bit 7 = 0 */
#define SC_RCV_B7_1 0x02000000 /* have rcvd char with bit 7 = 1 */
#define SC_RCV_EVNP 0x04000000 /* have rcvd char with even parity */
#define SC_RCV_ODDP 0x08000000 /* have rcvd char with odd parity */
#define SC_MASK 0x0fff00ff /* bits that user can change */
/*
* State bits in sc_flags, not changeable by user.
*/
#define SC_TIMEOUT 0x00000400 /* timeout is currently pending */
#define SC_VJ_RESET 0x00000800 /* need to reset VJ decomp */
#define SC_COMP_RUN 0x00001000 /* compressor has been inited */
#define SC_DECOMP_RUN 0x00002000 /* decompressor has been inited */
#define SC_DC_ERROR 0x00004000 /* non-fatal decomp error detected */
#define SC_DC_FERROR 0x00008000 /* fatal decomp error detected */
#define SC_TBUSY 0x10000000 /* xmitter doesn't need a packet yet */
#define SC_PKTLOST 0x20000000 /* have lost or dropped a packet */
#define SC_FLUSH 0x40000000 /* flush input until next PPP_FLAG */
#define SC_ESCAPED 0x80000000 /* saw a PPP_ESCAPE */
/*
* Ioctl definitions.
*/
struct npioctl {
int protocol; /* PPP procotol, e.g. PPP_IP */
int on;
};
/* Structure describing a CCP configuration option, for PPPIOCSCOMPRESS */
struct ppp_option_data {
u_char *ptr;
u_int length;
int transmit;
};
struct ifpppstatsreq {
char ifr_name[IFNAMSIZ];
struct ppp_stats stats;
};
struct ifpppcstatsreq {
char ifr_name[IFNAMSIZ];
struct ppp_comp_stats stats;
};
/*
* Ioctl definitions.
*/
#define PPPIOCGFLAGS _IOR('t', 90, int) /* get configuration flags */
#define PPPIOCSFLAGS _IOW('t', 89, int) /* set configuration flags */
#define PPPIOCGASYNCMAP _IOR('t', 88, int) /* get async map */
#define PPPIOCSASYNCMAP _IOW('t', 87, int) /* set async map */
#define PPPIOCGUNIT _IOR('t', 86, int) /* get ppp unit number */
#define PPPIOCGRASYNCMAP _IOR('t', 85, int) /* get receive async map */
#define PPPIOCSRASYNCMAP _IOW('t', 84, int) /* set receive async map */
#define PPPIOCGMRU _IOR('t', 83, int) /* get max receive unit */
#define PPPIOCSMRU _IOW('t', 82, int) /* set max receive unit */
#define PPPIOCSMAXCID _IOW('t', 81, int) /* set VJ max slot ID */
#define PPPIOCGXASYNCMAP _IOR('t', 80, ext_accm) /* get extended ACCM */
#define PPPIOCSXASYNCMAP _IOW('t', 79, ext_accm) /* set extended ACCM */
#define PPPIOCXFERUNIT _IO('t', 78) /* transfer PPP unit */
#define PPPIOCSCOMPRESS _IOW('t', 77, struct ppp_option_data)
#define PPPIOCGNPMODE _IOWR('t', 76, struct npioctl) /* get NP mode */
#define PPPIOCSNPMODE _IOW('t', 75, struct npioctl) /* set NP mode */
#define PPPIOCGIDLE _IOR('t', 74, struct ppp_idle) /* get idle time */
#define PPPIOCSPASS _IOW('t', 71, struct bpf_program) /* set pass filter */
#define PPPIOCSACTIVE _IOW('t', 70, struct bpf_program) /* set active filt */
/* PPPIOC[GS]MTU are alternatives to SIOC[GS]IFMTU, used under Ultrix */
#define PPPIOCGMTU _IOR('t', 73, int) /* get interface MTU */
#define PPPIOCSMTU _IOW('t', 72, int) /* set interface MTU */
/*
* These two are interface ioctls so that pppstats can do them on
* a socket without having to open the serial device.
*/
#define SIOCGPPPSTATS _IOWR('i', 123, struct ifpppstatsreq)
#define SIOCGPPPCSTATS _IOWR('i', 122, struct ifpppcstatsreq)
#ifdef _KERNEL_
int pppoutput (struct ifnet *, struct mbuf *, struct sockaddr *,
struct rtentry *);
void pppinput (struct mbuf *);
#endif
#endif /* _NET_IF_PPP_H_ */
+23
View File
@@ -0,0 +1,23 @@
/* if_types.h
*
* <URL:http://www.iana.org/assignments/ianaiftype-mib>
*/
#ifndef NET_IF_TYPES_H
#define NET_IF_TYPES_H
/* We just list the ones here we actually use... */
#define IFT_ETHER 0x06
#define IFT_PPP 0x17
#define IFT_LOOP 0x18
#define IFT_SLIP 0x1c
#define IFT_RS232 0x21
#define IFT_PARA 0x22 /* Parallel port! ?? */
#define IFT_ATM 0x25
#define IFT_MODEM 0x31 /* Just a simple generic modem */
#define IFT_FASTETHER 0x32 /* 100BaseT ethernet */
#define IFT_ISDN 0x3f /* ISDN / X.25 */
#endif /* NET_IF_TYPES_H */
+24
View File
@@ -0,0 +1,24 @@
/*
* ppp_ctrl.h
*
* Definitions required to control PPP from userland
*/
#ifndef _NET_PPP_CTRL_H_
#define _NET_PPP_CTRL_H_
#define PPPCTRL_THREADNAME "PPP_Control_Thread"
#define PPPCTRL_MAXSIZE 100 /* biggest lump of data we accept */
enum {
PPPCTRL_OK = 0, /* Operation completed OK */
PPPCTRL_FAIL, /* Operation failed */
PPPCTRL_CREATE, /* create a new PPP device */
PPPCTRL_DELETE, /* delete a PPP device */
PPPCTRL_UP, /* start a ppp connection */
PPPCTRL_OPEN, /* Open a device */
PPPCTRL_DOWN, /* stop a ppp connection */
};
#endif /* _NET_PPP_CTRL_H_ */
+158
View File
@@ -0,0 +1,158 @@
/*
* ppp_defs.h - PPP definitions.
*
* Copyright (c) 1994 The Australian National University.
* All rights reserved.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation is hereby granted, provided that the above copyright
* notice appears in all copies. This software is provided without any
* warranty, express or implied. The Australian National University
* makes no representations about the suitability of this software for
* any purpose.
*
* IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY
* PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
* THE AUSTRALIAN NATIONAL UNIVERSITY HAVE BEEN ADVISED OF THE POSSIBILITY
* OF SUCH DAMAGE.
*
* THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
* ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO
* OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
* OR MODIFICATIONS.
*/
#ifndef _PPP_DEFS_H_
#define _PPP_DEFS_H_
/*
* The basic PPP frame.
*/
/* pppoe header = 6 bytes
* hdlc frame header is 3 bytes
* PPP protocol is 2 bytes,
* so PPP_HDRLEN set to 8 to try and get us enough storage
* for any of these. If we have to allocate a new mbuf then so be it.
*/
#define PPP_HDRLEN 8 /* octets for standard ppp header */
#define PPP_PROTHDRLEN 2
#define PPP_PROTOFF PPP_HDRLEN - PPP_PROTHDRLEN
#define PPP_FCSLEN 2 /* octets for FCS */
#define PPP_MRU 1500 /* default MRU = max length of info field */
#define PPP_PROTOCOL(p) ((((u_char *)(p))[0] << 8) + ((u_char *)(p))[1])
/*
* Significant octet values.
*/
#define PPP_ALLSTATIONS 0xff /* All-Stations broadcast address */
#define PPP_UI 0x03 /* Unnumbered Information */
#define PPP_FLAG 0x7e /* Flag Sequence */
#define PPP_ESCAPE 0x7d /* Asynchronous Control Escape */
#define PPP_TRANS 0x20 /* Asynchronous transparency modifier */
/*
* Protocol field values.
*/
#define PPP_IP 0x21 /* Internet Protocol */
#define PPP_XNS 0x25 /* Xerox NS */
#define PPP_AT 0x29 /* AppleTalk Protocol */
#define PPP_IPX 0x2b /* Internetwork Packet Exchange */
#define PPP_VJC_COMP 0x2d /* VJ compressed TCP */
#define PPP_VJC_UNCOMP 0x2f /* VJ uncompressed TCP */
#define PPP_IPV6 0x57 /* Internet Protocol Version 6 */
#define PPP_COMP 0xfd /* compressed packet */
#define PPP_IPCP 0x8021 /* IP Control Protocol */
#define PPP_ATCP 0x8029 /* AppleTalk Control Protocol */
#define PPP_IPXCP 0x802b /* IPX Control Protocol */
#define PPP_IPV6CP 0x8057 /* IPv6 Control Protocol */
#define PPP_CCP 0x80fd /* Compression Control Protocol */
#define PPP_LCP 0xc021 /* Link Control Protocol */
#define PPP_PAP 0xc023 /* Password Authentication Protocol */
#define PPP_LQR 0xc025 /* Link Quality Report protocol */
#define PPP_CHAP 0xc223 /* Cryptographic Handshake Auth. Protocol */
#define PPP_CBCP 0xc029 /* Callback Control Protocol */
/*
* Values for FCS calculations.
*/
#define PPP_INITFCS 0xffff /* Initial FCS value */
#define PPP_GOODFCS 0xf0b8 /* Good final FCS value */
/*
* Extended asyncmap - allows any character to be escaped.
*/
typedef uint32 ext_accm[8];
/*
* What to do with network protocol (NP) packets.
*/
enum NPmode {
NPMODE_PASS, /* pass the packet through */
NPMODE_DROP, /* silently drop the packet */
NPMODE_ERROR, /* return an error */
NPMODE_QUEUE /* save it up for later. */
};
/*
* Statistics.
*/
struct pppstat {
uint ppp_ibytes; /* bytes received */
uint ppp_ipackets; /* packets received */
uint ppp_ierrors; /* receive errors */
uint ppp_obytes; /* bytes sent */
uint ppp_opackets; /* packets sent */
uint ppp_oerrors; /* transmit errors */
};
struct vjstat {
uint vjs_packets; /* outbound packets */
uint vjs_compressed; /* outbound compressed packets */
uint vjs_searches; /* searches for connection state */
uint vjs_misses; /* times couldn't find conn. state */
uint vjs_uncompressedin; /* inbound uncompressed packets */
uint vjs_compressedin; /* inbound compressed packets */
uint vjs_errorin; /* inbound unknown type packets */
uint vjs_tossed; /* inbound packets tossed because of error */
};
struct ppp_stats {
struct pppstat p; /* basic PPP statistics */
struct vjstat vj; /* VJ header compression statistics */
};
struct compstat {
uint unc_bytes; /* total uncompressed bytes */
uint unc_packets; /* total uncompressed packets */
uint comp_bytes; /* compressed bytes */
uint comp_packets; /* compressed packets */
uint inc_bytes; /* incompressible bytes */
uint inc_packets; /* incompressible packets */
uint ratio; /* recent compression ratio << 8 */
};
struct ppp_comp_stats {
struct compstat c; /* packet compression statistics */
struct compstat d; /* packet decompression statistics */
};
/*
* The following structure records the time in seconds since
* the last NP packet was sent or received.
*/
struct ppp_idle {
time_t xmit_idle; /* time since last NP packet sent */
time_t recv_idle; /* time since last NP packet received */
};
#ifdef _NETWORK_STACK
uint16 pppfcs16(uint16 fcs, u_char *cp, int len);
#endif
#endif /* _PPP_DEFS_H_ */
+47
View File
@@ -0,0 +1,47 @@
#ifndef _PPP_STATS_H_
#define _PPP_STATS_H_
/*
* Statistics.
*/
struct pppstat {
uint ppp_ibytes; /* bytes received */
uint ppp_ipackets; /* packets received */
uint ppp_ierrors; /* receive errors */
uint ppp_obytes; /* bytes sent */
uint ppp_opackets; /* packets sent */
uint ppp_oerrors; /* transmit errors */
};
struct vjstat {
uint vjs_packets; /* outbound packets */
uint vjs_compressed; /* outbound compressed packets */
uint vjs_searches; /* searches for connection state */
uint vjs_misses; /* times couldn't find conn. state */
uint vjs_uncompressedin; /* inbound uncompressed packets */
uint vjs_compressedin; /* inbound compressed packets */
uint vjs_errorin; /* inbound unknown type packets */
uint vjs_tossed; /* inbound packets tossed because of error */
};
struct ppp_stats {
struct pppstat p; /* basic PPP statistics */
struct vjstat vj; /* VJ header compression statistics */
};
struct compstat {
uint unc_bytes; /* total uncompressed bytes */
uint unc_packets; /* total uncompressed packets */
uint comp_bytes; /* compressed bytes */
uint comp_packets; /* compressed packets */
uint inc_bytes; /* incompressible bytes */
uint inc_packets; /* incompressible packets */
uint ratio; /* recent compression ratio << 8 */
};
struct ppp_comp_stats {
struct compstat c; /* packet compression statistics */
struct compstat d; /* packet decompression statistics */
};
#endif /* _PPP_STATS_H_ */
+165
View File
@@ -0,0 +1,165 @@
/*
* Copyright (c) 1988, 1989, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)radix.h 8.2 (Berkeley) 10/31/94
* $FreeBSD: src/sys/net/radix.h,v 1.16.2.1 2000/05/03 19:17:11 wollman Exp $
*/
#ifndef _RADIX_H_
#define _RADIX_H_
#include <malloc.h>
/*
* Radix search tree node layout.
*/
struct radix_node {
struct radix_mask *rn_mklist; /* list of masks contained in subtree */
struct radix_node *rn_parent; /* parent */
short rn_bit; /* bit offset; -1-index(netmask) */
char rn_bmask; /* node: mask for bit test*/
u_char rn_flags; /* enumerated next */
#define RNF_NORMAL 1 /* leaf contains normal route */
#define RNF_ROOT 2 /* leaf is root leaf for tree */
#define RNF_ACTIVE 4 /* This node is alive (for rtfree) */
union {
struct { /* leaf only data: */
caddr_t rn_Key; /* object of search */
caddr_t rn_Mask; /* netmask, if present */
struct radix_node *rn_Dupedkey;
} rn_leaf;
struct { /* node only data: */
int rn_Off; /* where to start compare */
struct radix_node *rn_L;/* progeny */
struct radix_node *rn_R;/* progeny */
} rn_node;
} rn_u;
#ifdef RN_DEBUG
int rn_info;
struct radix_node *rn_twin;
struct radix_node *rn_ybro;
#endif
};
#define rn_dupedkey rn_u.rn_leaf.rn_Dupedkey
#define rn_key rn_u.rn_leaf.rn_Key
#define rn_mask rn_u.rn_leaf.rn_Mask
#define rn_offset rn_u.rn_node.rn_Off
#define rn_left rn_u.rn_node.rn_L
#define rn_right rn_u.rn_node.rn_R
/*
* Annotations to tree concerning potential routes applying to subtrees.
*/
struct radix_mask {
short rm_bit; /* bit offset; -1-index(netmask) */
char rm_unused; /* cf. rn_bmask */
u_char rm_flags; /* cf. rn_flags */
struct radix_mask *rm_mklist; /* more masks to try */
union {
caddr_t rmu_mask; /* the mask */
struct radix_node *rmu_leaf; /* for normal routes */
} rm_rmu;
int rm_refs; /* # of references to this struct */
};
#define rm_mask rm_rmu.rmu_mask
#define rm_leaf rm_rmu.rmu_leaf /* extra field would make 32 bytes */
#define MKGet(m) {\
if (rn_mkfreelist) {\
m = rn_mkfreelist; \
rn_mkfreelist = (m)->rm_mklist; \
} else \
R_Malloc(m, struct radix_mask *, sizeof (*(m))); }\
#define MKFree(m) { (m)->rm_mklist = rn_mkfreelist; rn_mkfreelist = (m);}
typedef int walktree_f_t (struct radix_node *, void *);
struct radix_node_head {
struct radix_node *rnh_treetop;
int rnh_addrsize; /* permit, but not require fixed keys */
int rnh_pktsize; /* permit, but not require fixed keys */
struct radix_node *(*rnh_addaddr) /* add based on sockaddr */
(void *v, void *mask,
struct radix_node_head *head, struct radix_node nodes[]);
struct radix_node *(*rnh_addpkt) /* add based on packet hdr */
(void *v, void *mask,
struct radix_node_head *head, struct radix_node nodes[]);
struct radix_node *(*rnh_deladdr) /* remove based on sockaddr */
(void *v, void *mask, struct radix_node_head *head);
struct radix_node *(*rnh_delpkt) /* remove based on packet hdr */
(void *v, void *mask, struct radix_node_head *head);
struct radix_node *(*rnh_matchaddr) /* locate based on sockaddr */
(void *v, struct radix_node_head *head);
struct radix_node *(*rnh_lookup) /* locate based on sockaddr */
(void *v, void *mask, struct radix_node_head *head);
struct radix_node *(*rnh_matchpkt) /* locate based on packet hdr */
(void *v, struct radix_node_head *head);
int (*rnh_walktree) /* traverse tree */
(struct radix_node_head *head, walktree_f_t *f, void *w);
int (*rnh_walktree_from) /* traverse tree below a */
(struct radix_node_head *head, void *a, void *m,
walktree_f_t *f, void *w);
void (*rnh_close) /* do something when the last ref drops */
(struct radix_node *rn, struct radix_node_head *head);
struct radix_node rnh_nodes[3]; /* empty tree for common case */
};
#define Bcmp(a, b, n) memcmp(((char *)(a)), ((char *)(b)), (n))
#define Bcopy(a, b, n) memcpy(((char *)(b)), ((char *)(a)), (unsigned)(n))
#define Bzero(p, n) memset((char *)(p),0, (int)(n));
#define R_Malloc(p, t, n) do { \
(p = (t) malloc((unsigned int)(n))); \
memset(p, 0, sizeof(*p)); \
} while (0)
#define Free(p) free((char *)p);
void rn_init (void);
int rn_inithead (void **, int);
int rn_refines (void *, void *);
struct radix_node
*rn_addmask (void *, int, int),
*rn_addroute (void *, void *, struct radix_node_head *,
struct radix_node [2]),
*rn_delete (void *, void *, struct radix_node_head *),
*rn_lookup (void *v_arg, void *m_arg,
struct radix_node_head *head),
*rn_match (void *, struct radix_node_head *);
/* extra fucntion so we don't have to export the mask_rnhead */
struct radix_node *rn_head_search(void *argv_v);
#endif /* _RADIX_H_ */
+17
View File
@@ -0,0 +1,17 @@
/* raw_cb.h */
#ifndef NET_RAW_CB_H
#define NET_RAW_CB_H
struct rawcb {
struct rawcb *rcb_next;
struct rawcb *rcb_prev;
struct socket *rcb_socket;
struct sockaddr *rcb_faddr;
struct sockaddr *rcb_laddr;
struct sockproto rcb_proto;
};
#define sotorawcb(so) ((struct rawcb*)(so)->so_pcb)
#endif /* NET_RAW_CB_H */
+208
View File
@@ -0,0 +1,208 @@
/* route.h */
#ifndef NET_ROUTE_H
#define NET_ROUTE_H
#include "net/radix.h"
#include "sys/socket.h" /* for AF_MAX */
/*
* A route consists of a destination address and a reference
* to a routing entry. These are often held by protocols
* in their control blocks, e.g. inpcb.
*/
struct route {
struct rtentry *ro_rt;
struct sockaddr ro_dst;
};
/*
* These numbers are used by reliable protocols for determining
* retransmission behavior and are included in the routing structure.
*/
struct rt_metrics {
uint32 rmx_locks; /* Kernel must leave these values alone */
uint32 rmx_mtu; /* MTU for this path */
uint32 rmx_hopcount; /* max hops expected */
uint32 rmx_expire; /* lifetime for route, e.g. redirect */
u_long rmx_recvpipe; /* inbound delay-bandwith product */
u_long rmx_sendpipe; /* outbound delay-bandwith product */
u_long rmx_ssthresh; /* outbound gateway buffer limit */
u_long rmx_rtt; /* estimated round trip time */
u_long rmx_rttvar; /* estimated rtt variance */
u_long rmx_pksent; /* packets sent using this route */
};
/*
* rmx_rtt and rmx_rttvar are stored as microseconds;
* RTTTOPRHZ(rtt) converts to a value suitable for use
* by a protocol slowtimo counter.
*/
#define RTM_RTTUNIT 1000000 /* units for rtt, rttvar, as units per sec */
#define RTTTOPRHZ(r) ((r) / (RTM_RTTUNIT / PR_SLOWHZ))
struct rtentry {
struct radix_node rt_nodes[2]; /* tree glue, and other values */
struct sockaddr *rt_gateway; /* value */
uint rt_flags; /* up/down?, host/net */
int rt_refcnt; /* # held references */
uint32 rt_use; /* raw # packets forwarded */
struct ifnet *rt_ifp; /* the answer: interface to use */
struct ifaddr *rt_ifa; /* the answer: interface to use */
struct sockaddr *rt_genmask; /* for generation of cloned routes */
caddr_t rt_llinfo; /* pointer to link level info cache */
struct rt_metrics rt_rmx; /* metrics used by rx'ing protocols */
struct rtentry *rt_gwroute; /* implied entry for gatewayed routes */
struct rtentry *rt_parent; /* If cloned, parent of this route. */
/* XXX - add this! */
// rt_timer; * queue of timeouts for misc funcs *
};
#define rt_use rt_rmx.rmx_pksent
#define rt_key(r) ((struct sockaddr *)((r)->rt_nodes->rn_key))
#define rt_mask(r) ((struct sockaddr *)((r)->rt_nodes->rn_mask))
#define RTF_UP 0x1 /* route usable */
#define RTF_GATEWAY 0x2 /* destination is a gateway */
#define RTF_HOST 0x4 /* host entry (net otherwise) */
#define RTF_REJECT 0x8 /* host or net unreachable */
#define RTF_DYNAMIC 0x10 /* created dynamically (by redirect) */
#define RTF_MODIFIED 0x20 /* modified dynamically (by redirect) */
#define RTF_DONE 0x40 /* message confirmed */
#define RTF_MASK 0x80 /* subnet mask present */
#define RTF_CLONING 0x100 /* generate new routes on use */
#define RTF_XRESOLVE 0x200 /* external daemon resolves name */
#define RTF_LLINFO 0x400 /* generated by ARP or ESIS */
#define RTF_STATIC 0x800 /* manually added */
#define RTF_BLACKHOLE 0x1000 /* just discard pkts (during updates) */
#define RTF_PROTO3 0x2000 /* protocol specific routing flag */
#define RTF_PROTO2 0x4000 /* protocol specific routing flag */
#define RTF_PROTO1 0x8000 /* protocol specific routing flag */
#define RTM_VERSION 3 /* Up the ante and ignore older versions */
#define RTM_ADD 0x1 /* Add Route */
#define RTM_DELETE 0x2 /* Delete Route */
#define RTM_CHANGE 0x3 /* Change Metrics or flags */
#define RTM_GET 0x4 /* Report Metrics */
#define RTM_LOSING 0x5 /* Kernel Suspects Partitioning */
#define RTM_REDIRECT 0x6 /* Told to use different route */
#define RTM_MISS 0x7 /* Lookup failed on this address */
#define RTM_LOCK 0x8 /* fix specified metrics */
#define RTM_OLDADD 0x9 /* caused by SIOCADDRT */
#define RTM_OLDDEL 0xa /* caused by SIOCDELRT */
#define RTM_RESOLVE 0xb /* req to resolve dst to LL addr */
#define RTM_NEWADDR 0xc /* address being added to iface */
#define RTM_DELADDR 0xd /* address being removed from iface */
#define RTM_IFINFO 0xe /* iface going up/down etc. */
#define RTV_MTU 0x1 /* init or lock _mtu */
#define RTV_HOPCOUNT 0x2 /* init or lock _hopcount */
#define RTV_EXPIRE 0x4 /* init or lock _hopcount */
#define RTV_RPIPE 0x8 /* init or lock _recvpipe */
#define RTV_SPIPE 0x10 /* init or lock _sendpipe */
#define RTV_SSTHRESH 0x20 /* init or lock _ssthresh */
#define RTV_RTT 0x40 /* init or lock _rtt */
#define RTV_RTTVAR 0x80 /* init or lock _rttvar */
/*
* Bitmask values for rtm_addr.
*/
#define RTA_DST 0x1 /* destination sockaddr present */
#define RTA_GATEWAY 0x2 /* gateway sockaddr present */
#define RTA_NETMASK 0x4 /* netmask sockaddr present */
#define RTA_GENMASK 0x8 /* cloning mask sockaddr present */
#define RTA_IFP 0x10 /* interface name sockaddr present */
#define RTA_IFA 0x20 /* interface addr sockaddr present */
#define RTA_AUTHOR 0x40 /* sockaddr for author of redirect */
#define RTA_BRD 0x80 /* for NEWADDR, broadcast or p-p dest addr */
/*
* Index offsets for sockaddr array for alternate internal encoding.
*/
#define RTAX_DST 0 /* destination sockaddr present */
#define RTAX_GATEWAY 1 /* gateway sockaddr present */
#define RTAX_NETMASK 2 /* netmask sockaddr present */
#define RTAX_GENMASK 3 /* cloning mask sockaddr present */
#define RTAX_IFP 4 /* interface name sockaddr present */
#define RTAX_IFA 5 /* interface addr sockaddr present */
#define RTAX_AUTHOR 6 /* sockaddr for author of redirect */
#define RTAX_BRD 7 /* for NEWADDR, broadcast or p-p dest addr */
#define RTAX_MAX 8 /* size of array to allocate */
struct rt_msghdr {
uint16 rtm_msglen;
uint8 rtm_version;
uint8 rtm_type;
uint16 rtm_index;
int rtm_flags;
int rtm_addrs;
int rtm_seq;
int rtm_errno;
int rtm_use;
uint32 rtm_inits;
struct rt_metrics rtm_rmx;
};
struct rt_addrinfo {
int rti_addrs;
struct sockaddr *rti_info[RTAX_MAX];
int rti_flags;
struct ifaddr *rti_ifa;
struct ifnet *rti_ifp;
struct rt_msghdr *rti_rtm;
};
struct route_cb {
int32 ip_count; /* how many AF_INET structures we have */
int32 any_count; /* total of all above... */
};
struct walkarg {
int w_op;
int w_arg;
int w_given;
int w_needed;
int w_tmemsize;
caddr_t w_where;
caddr_t w_tmem;
};
/*
* Routing statistics.
*/
struct rtstat {
int32 rts_badredirect; /* bogus redirect calls */
int32 rts_dynamic; /* routes created by redirects */
int32 rts_newgateway; /* routes modified by redirects */
int32 rts_unreach; /* lookups which failed */
int32 rts_wildcard; /* lookups satisfied by a wildcard */
};
#define RTFREE(rt) do { \
if ((rt)->rt_refcnt <= 1) \
rtfree(rt); \
else \
(rt)->rt_refcnt--; \
} while (0)
struct rtstat rtstat;
struct radix_node_head *rt_tables[AF_MAX+1];
void route_init(void);
int rtinit (struct ifaddr *, int, int);
void rtalloc (struct route *);
struct rtentry *rtalloc1 (struct sockaddr *, int);
void rtfree (struct rtentry *);
int rtrequest (int, struct sockaddr *,
struct sockaddr *, struct sockaddr *, int,
struct rtentry **);
void rt_maskedcopy(struct sockaddr *src,
struct sockaddr *dst,
struct sockaddr *netmask);
int rt_setgate (struct rtentry *, struct sockaddr *,
struct sockaddr *);
struct radix_node_head ** get_rt_tables(void);
#endif /* NET_ROUTE_H */