qemu/slirp/slirp.h
<<
>>
Prefs
   1#ifndef __COMMON_H__
   2#define __COMMON_H__
   3
   4#include "config-host.h"
   5#include "slirp_config.h"
   6
   7#ifdef _WIN32
   8# include <inttypes.h>
   9
  10typedef char *caddr_t;
  11
  12# include <windows.h>
  13# include <winsock2.h>
  14# include <ws2tcpip.h>
  15# include <sys/timeb.h>
  16# include <iphlpapi.h>
  17
  18#else
  19# define ioctlsocket ioctl
  20# define closesocket(s) close(s)
  21# if !defined(__HAIKU__)
  22#  define O_BINARY 0
  23# endif
  24#endif
  25
  26#include <sys/types.h>
  27#ifdef HAVE_SYS_BITYPES_H
  28# include <sys/bitypes.h>
  29#endif
  30
  31#include <sys/time.h>
  32
  33#ifdef HAVE_UNISTD_H
  34# include <unistd.h>
  35#endif
  36
  37#ifdef HAVE_STDLIB_H
  38# include <stdlib.h>
  39#endif
  40
  41#include <stdio.h>
  42#include <errno.h>
  43
  44#ifndef HAVE_MEMMOVE
  45#define memmove(x, y, z) bcopy(y, x, z)
  46#endif
  47
  48#if TIME_WITH_SYS_TIME
  49# include <sys/time.h>
  50# include <time.h>
  51#else
  52# ifdef HAVE_SYS_TIME_H
  53#  include <sys/time.h>
  54# else
  55#  include <time.h>
  56# endif
  57#endif
  58
  59#ifdef HAVE_STRING_H
  60# include <string.h>
  61#else
  62# include <strings.h>
  63#endif
  64
  65#ifndef _WIN32
  66#include <sys/uio.h>
  67#endif
  68
  69#ifndef _WIN32
  70#include <netinet/in.h>
  71#include <arpa/inet.h>
  72#endif
  73
  74/* Systems lacking strdup() definition in <string.h>. */
  75#if defined(ultrix)
  76char *strdup(const char *);
  77#endif
  78
  79/* Systems lacking malloc() definition in <stdlib.h>. */
  80#if defined(ultrix) || defined(hcx)
  81void *malloc(size_t arg);
  82void free(void *ptr);
  83#endif
  84
  85#include <fcntl.h>
  86#ifndef NO_UNIX_SOCKETS
  87#include <sys/un.h>
  88#endif
  89#include <signal.h>
  90#ifdef HAVE_SYS_SIGNAL_H
  91# include <sys/signal.h>
  92#endif
  93#ifndef _WIN32
  94#include <sys/socket.h>
  95#endif
  96
  97#if defined(HAVE_SYS_IOCTL_H)
  98# include <sys/ioctl.h>
  99#endif
 100
 101#ifdef HAVE_SYS_SELECT_H
 102# include <sys/select.h>
 103#endif
 104
 105#ifdef HAVE_SYS_WAIT_H
 106# include <sys/wait.h>
 107#endif
 108
 109#ifdef HAVE_SYS_FILIO_H
 110# include <sys/filio.h>
 111#endif
 112
 113#ifdef USE_PPP
 114#include <ppp/slirppp.h>
 115#endif
 116
 117#ifdef __STDC__
 118#include <stdarg.h>
 119#else
 120#include <varargs.h>
 121#endif
 122
 123#include <sys/stat.h>
 124
 125/* Avoid conflicting with the libc insque() and remque(), which
 126   have different prototypes. */
 127#define insque slirp_insque
 128#define remque slirp_remque
 129
 130#ifdef HAVE_SYS_STROPTS_H
 131#include <sys/stropts.h>
 132#endif
 133
 134#include "debug.h"
 135
 136#include "qemu/queue.h"
 137#include "qemu/sockets.h"
 138
 139#include "libslirp.h"
 140#include "ip.h"
 141#include "tcp.h"
 142#include "tcp_timer.h"
 143#include "tcp_var.h"
 144#include "tcpip.h"
 145#include "udp.h"
 146#include "ip_icmp.h"
 147#include "mbuf.h"
 148#include "sbuf.h"
 149#include "socket.h"
 150#include "if.h"
 151#include "main.h"
 152#include "misc.h"
 153#ifdef USE_PPP
 154#include "ppp/pppd.h"
 155#include "ppp/ppp.h"
 156#endif
 157
 158#include "bootp.h"
 159#include "tftp.h"
 160
 161#define ETH_ALEN 6
 162#define ETH_HLEN 14
 163
 164#define ETH_P_IP  0x0800        /* Internet Protocol packet  */
 165#define ETH_P_ARP 0x0806        /* Address Resolution packet */
 166
 167#define ARPOP_REQUEST 1         /* ARP request */
 168#define ARPOP_REPLY   2         /* ARP reply   */
 169
 170struct ethhdr {
 171    unsigned char  h_dest[ETH_ALEN];   /* destination eth addr */
 172    unsigned char  h_source[ETH_ALEN]; /* source ether addr    */
 173    unsigned short h_proto;            /* packet type ID field */
 174};
 175
 176struct arphdr {
 177    unsigned short ar_hrd;      /* format of hardware address */
 178    unsigned short ar_pro;      /* format of protocol address */
 179    unsigned char  ar_hln;      /* length of hardware address */
 180    unsigned char  ar_pln;      /* length of protocol address */
 181    unsigned short ar_op;       /* ARP opcode (command)       */
 182
 183    /*
 184     *  Ethernet looks like this : This bit is variable sized however...
 185     */
 186    unsigned char ar_sha[ETH_ALEN]; /* sender hardware address */
 187    uint32_t      ar_sip;           /* sender IP address       */
 188    unsigned char ar_tha[ETH_ALEN]; /* target hardware address */
 189    uint32_t      ar_tip;           /* target IP address       */
 190} QEMU_PACKED;
 191
 192#define ARP_TABLE_SIZE 16
 193
 194typedef struct ArpTable {
 195    struct arphdr table[ARP_TABLE_SIZE];
 196    int next_victim;
 197} ArpTable;
 198
 199void arp_table_add(Slirp *slirp, uint32_t ip_addr, uint8_t ethaddr[ETH_ALEN]);
 200
 201bool arp_table_search(Slirp *slirp, uint32_t ip_addr,
 202                      uint8_t out_ethaddr[ETH_ALEN]);
 203
 204struct Slirp {
 205    QTAILQ_ENTRY(Slirp) entry;
 206    u_int time_fasttimo;
 207    u_int last_slowtimo;
 208    bool do_slowtimo;
 209
 210    /* virtual network configuration */
 211    struct in_addr vnetwork_addr;
 212    struct in_addr vnetwork_mask;
 213    struct in_addr vhost_addr;
 214    struct in_addr vdhcp_startaddr;
 215    struct in_addr vnameserver_addr;
 216
 217    struct in_addr client_ipaddr;
 218    char client_hostname[33];
 219
 220    int restricted;
 221    struct ex_list *exec_list;
 222
 223    /* mbuf states */
 224    struct mbuf m_freelist, m_usedlist;
 225    int mbuf_alloced;
 226
 227    /* if states */
 228    struct mbuf if_fastq;   /* fast queue (for interactive data) */
 229    struct mbuf if_batchq;  /* queue for non-interactive data */
 230    struct mbuf *next_m;    /* pointer to next mbuf to output */
 231    bool if_start_busy;     /* avoid if_start recursion */
 232
 233    /* ip states */
 234    struct ipq ipq;         /* ip reass. queue */
 235    uint16_t ip_id;         /* ip packet ctr, for ids */
 236
 237    /* bootp/dhcp states */
 238    BOOTPClient bootp_clients[NB_BOOTP_CLIENTS];
 239    char *bootp_filename;
 240    size_t vdnssearch_len;
 241    uint8_t *vdnssearch;
 242
 243    /* tcp states */
 244    struct socket tcb;
 245    struct socket *tcp_last_so;
 246    tcp_seq tcp_iss;        /* tcp initial send seq # */
 247    uint32_t tcp_now;       /* for RFC 1323 timestamps */
 248
 249    /* udp states */
 250    struct socket udb;
 251    struct socket *udp_last_so;
 252
 253    /* icmp states */
 254    struct socket icmp;
 255    struct socket *icmp_last_so;
 256
 257    /* tftp states */
 258    char *tftp_prefix;
 259    struct tftp_session tftp_sessions[TFTP_SESSIONS_MAX];
 260
 261    ArpTable arp_table;
 262
 263    void *opaque;
 264};
 265
 266extern Slirp *slirp_instance;
 267
 268#ifndef NULL
 269#define NULL (void *)0
 270#endif
 271
 272#ifndef FULL_BOLT
 273void if_start(Slirp *);
 274#else
 275void if_start(struct ttys *);
 276#endif
 277
 278#ifndef HAVE_STRERROR
 279 char *strerror(int error);
 280#endif
 281
 282#ifndef HAVE_INDEX
 283 char *index(const char *, int);
 284#endif
 285
 286#ifndef HAVE_GETHOSTID
 287 long gethostid(void);
 288#endif
 289
 290#ifndef _WIN32
 291#include <netdb.h>
 292#endif
 293
 294#define DEFAULT_BAUD 115200
 295
 296#define SO_OPTIONS DO_KEEPALIVE
 297#define TCP_MAXIDLE (TCPTV_KEEPCNT * TCPTV_KEEPINTVL)
 298
 299/* dnssearch.c */
 300int translate_dnssearch(Slirp *s, const char ** names);
 301
 302/* cksum.c */
 303int cksum(struct mbuf *m, int len);
 304
 305/* if.c */
 306void if_init(Slirp *);
 307void if_output(struct socket *, struct mbuf *);
 308
 309/* ip_input.c */
 310void ip_init(Slirp *);
 311void ip_cleanup(Slirp *);
 312void ip_input(struct mbuf *);
 313void ip_slowtimo(Slirp *);
 314void ip_stripoptions(register struct mbuf *, struct mbuf *);
 315
 316/* ip_output.c */
 317int ip_output(struct socket *, struct mbuf *);
 318
 319/* tcp_input.c */
 320void tcp_input(register struct mbuf *, int, struct socket *);
 321int tcp_mss(register struct tcpcb *, u_int);
 322
 323/* tcp_output.c */
 324int tcp_output(register struct tcpcb *);
 325void tcp_setpersist(register struct tcpcb *);
 326
 327/* tcp_subr.c */
 328void tcp_init(Slirp *);
 329void tcp_cleanup(Slirp *);
 330void tcp_template(struct tcpcb *);
 331void tcp_respond(struct tcpcb *, register struct tcpiphdr *, register struct mbuf *, tcp_seq, tcp_seq, int);
 332struct tcpcb * tcp_newtcpcb(struct socket *);
 333struct tcpcb * tcp_close(register struct tcpcb *);
 334void tcp_sockclosed(struct tcpcb *);
 335int tcp_fconnect(struct socket *);
 336void tcp_connect(struct socket *);
 337int tcp_attach(struct socket *);
 338uint8_t tcp_tos(struct socket *);
 339int tcp_emu(struct socket *, struct mbuf *);
 340int tcp_ctl(struct socket *);
 341struct tcpcb *tcp_drop(struct tcpcb *tp, int err);
 342
 343#ifdef USE_PPP
 344#define MIN_MRU MINMRU
 345#define MAX_MRU MAXMRU
 346#else
 347#define MIN_MRU 128
 348#define MAX_MRU 16384
 349#endif
 350
 351#ifndef _WIN32
 352#define min(x,y) ((x) < (y) ? (x) : (y))
 353#define max(x,y) ((x) > (y) ? (x) : (y))
 354#endif
 355
 356#ifdef _WIN32
 357#undef errno
 358#define errno (WSAGetLastError())
 359#endif
 360
 361#endif
 362