File:  [Qemu by Fabrice Bellard] / qemu / slirp / slirp.h
Revision 1.1.1.10 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 19:51:41 2018 UTC (3 years, 3 months ago) by root
Branches: qemu, MAIN
CVS tags: qemu1101, HEAD
qemu 1.1.1

    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: 
   10: typedef 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)
   76: char *strdup(const char *);
   77: #endif
   78: 
   79: /* Systems lacking malloc() definition in <stdlib.h>. */
   80: #if defined(ultrix) || defined(hcx)
   81: void *malloc(size_t arg);
   82: void 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_socket.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: 
  170: struct 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: 
  176: struct 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: 
  194: typedef struct ArpTable {
  195:     struct arphdr table[ARP_TABLE_SIZE];
  196:     int next_victim;
  197: } ArpTable;
  198: 
  199: void arp_table_add(Slirp *slirp, uint32_t ip_addr, uint8_t ethaddr[ETH_ALEN]);
  200: 
  201: bool arp_table_search(Slirp *slirp, uint32_t ip_addr,
  202:                       uint8_t out_ethaddr[ETH_ALEN]);
  203: 
  204: struct Slirp {
  205:     QTAILQ_ENTRY(Slirp) entry;
  206: 
  207:     /* virtual network configuration */
  208:     struct in_addr vnetwork_addr;
  209:     struct in_addr vnetwork_mask;
  210:     struct in_addr vhost_addr;
  211:     struct in_addr vdhcp_startaddr;
  212:     struct in_addr vnameserver_addr;
  213: 
  214:     struct in_addr client_ipaddr;
  215:     char client_hostname[33];
  216: 
  217:     int restricted;
  218:     struct timeval tt;
  219:     struct ex_list *exec_list;
  220: 
  221:     /* mbuf states */
  222:     struct mbuf m_freelist, m_usedlist;
  223:     int mbuf_alloced;
  224: 
  225:     /* if states */
  226:     struct mbuf if_fastq;   /* fast queue (for interactive data) */
  227:     struct mbuf if_batchq;  /* queue for non-interactive data */
  228:     struct mbuf *next_m;    /* pointer to next mbuf to output */
  229:     bool if_start_busy;     /* avoid if_start recursion */
  230: 
  231:     /* ip states */
  232:     struct ipq ipq;         /* ip reass. queue */
  233:     uint16_t ip_id;         /* ip packet ctr, for ids */
  234: 
  235:     /* bootp/dhcp states */
  236:     BOOTPClient bootp_clients[NB_BOOTP_CLIENTS];
  237:     char *bootp_filename;
  238: 
  239:     /* tcp states */
  240:     struct socket tcb;
  241:     struct socket *tcp_last_so;
  242:     tcp_seq tcp_iss;        /* tcp initial send seq # */
  243:     uint32_t tcp_now;       /* for RFC 1323 timestamps */
  244: 
  245:     /* udp states */
  246:     struct socket udb;
  247:     struct socket *udp_last_so;
  248: 
  249:     /* icmp states */
  250:     struct socket icmp;
  251:     struct socket *icmp_last_so;
  252: 
  253:     /* tftp states */
  254:     char *tftp_prefix;
  255:     struct tftp_session tftp_sessions[TFTP_SESSIONS_MAX];
  256: 
  257:     ArpTable arp_table;
  258: 
  259:     void *opaque;
  260: };
  261: 
  262: extern Slirp *slirp_instance;
  263: 
  264: #ifndef NULL
  265: #define NULL (void *)0
  266: #endif
  267: 
  268: #ifndef FULL_BOLT
  269: void if_start(Slirp *);
  270: #else
  271: void if_start(struct ttys *);
  272: #endif
  273: 
  274: #ifndef HAVE_STRERROR
  275:  char *strerror(int error);
  276: #endif
  277: 
  278: #ifndef HAVE_INDEX
  279:  char *index(const char *, int);
  280: #endif
  281: 
  282: #ifndef HAVE_GETHOSTID
  283:  long gethostid(void);
  284: #endif
  285: 
  286: void lprint(const char *, ...) GCC_FMT_ATTR(1, 2);
  287: 
  288: #ifndef _WIN32
  289: #include <netdb.h>
  290: #endif
  291: 
  292: #define DEFAULT_BAUD 115200
  293: 
  294: #define SO_OPTIONS DO_KEEPALIVE
  295: #define TCP_MAXIDLE (TCPTV_KEEPCNT * TCPTV_KEEPINTVL)
  296: 
  297: /* cksum.c */
  298: int cksum(struct mbuf *m, int len);
  299: 
  300: /* if.c */
  301: void if_init(Slirp *);
  302: void if_output(struct socket *, struct mbuf *);
  303: 
  304: /* ip_input.c */
  305: void ip_init(Slirp *);
  306: void ip_cleanup(Slirp *);
  307: void ip_input(struct mbuf *);
  308: void ip_slowtimo(Slirp *);
  309: void ip_stripoptions(register struct mbuf *, struct mbuf *);
  310: 
  311: /* ip_output.c */
  312: int ip_output(struct socket *, struct mbuf *);
  313: 
  314: /* tcp_input.c */
  315: void tcp_input(register struct mbuf *, int, struct socket *);
  316: int tcp_mss(register struct tcpcb *, u_int);
  317: 
  318: /* tcp_output.c */
  319: int tcp_output(register struct tcpcb *);
  320: void tcp_setpersist(register struct tcpcb *);
  321: 
  322: /* tcp_subr.c */
  323: void tcp_init(Slirp *);
  324: void tcp_cleanup(Slirp *);
  325: void tcp_template(struct tcpcb *);
  326: void tcp_respond(struct tcpcb *, register struct tcpiphdr *, register struct mbuf *, tcp_seq, tcp_seq, int);
  327: struct tcpcb * tcp_newtcpcb(struct socket *);
  328: struct tcpcb * tcp_close(register struct tcpcb *);
  329: void tcp_sockclosed(struct tcpcb *);
  330: int tcp_fconnect(struct socket *);
  331: void tcp_connect(struct socket *);
  332: int tcp_attach(struct socket *);
  333: uint8_t tcp_tos(struct socket *);
  334: int tcp_emu(struct socket *, struct mbuf *);
  335: int tcp_ctl(struct socket *);
  336: struct tcpcb *tcp_drop(struct tcpcb *tp, int err);
  337: 
  338: #ifdef USE_PPP
  339: #define MIN_MRU MINMRU
  340: #define MAX_MRU MAXMRU
  341: #else
  342: #define MIN_MRU 128
  343: #define MAX_MRU 16384
  344: #endif
  345: 
  346: #ifndef _WIN32
  347: #define min(x,y) ((x) < (y) ? (x) : (y))
  348: #define max(x,y) ((x) > (y) ? (x) : (y))
  349: #endif
  350: 
  351: #ifdef _WIN32
  352: #undef errno
  353: #define errno (WSAGetLastError())
  354: #endif
  355: 
  356: #endif

unix.superglobalmegacorp.com