18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef QEMU_NET_H
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define QEMU_NET_H
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
45d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "qemu-common.h"
55d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* VLANs support */
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
95d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef int (NetCanReceive)(VLANClientState *);
105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef ssize_t (NetReceive)(VLANClientState *, const uint8_t *, size_t);
115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef ssize_t (NetReceiveIOV)(VLANClientState *, const struct iovec *, int);
125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef void (NetCleanup) (VLANClientState *);
135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef void (LinkStatusChanged)(VLANClientState *);
145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct VLANClientState {
165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    NetReceive *receive;
175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    NetReceiveIOV *receive_iov;
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* Packets may still be sent if this returns zero.  It's used to
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       rate-limit the slirp code.  */
205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    NetCanReceive *can_receive;
215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    NetCleanup *cleanup;
225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    LinkStatusChanged *link_status_changed;
235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int link_down;
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    void *opaque;
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    struct VLANClientState *next;
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    struct VLANState *vlan;
275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    char *model;
285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    char *name;
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char info_str[256];
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct VLANPacket VLANPacket;
335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef void (NetPacketSent) (VLANClientState *);
355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct VLANPacket {
375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    struct VLANPacket *next;
385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    VLANClientState *sender;
395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int size;
405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    NetPacketSent *sent_cb;
415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    uint8_t data[0];
425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner};
435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct VLANState {
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int id;
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    VLANClientState *first_client;
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    struct VLANState *next;
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    unsigned int nb_guest_devs, nb_host_devs;
495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    VLANPacket *send_queue;
505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int delivering;
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectVLANState *qemu_find_vlan(int id);
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectVLANClientState *qemu_new_vlan_client(VLANState *vlan,
555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                      const char *model,
565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                      const char *name,
575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                      NetCanReceive *can_receive,
585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                      NetReceive *receive,
595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                      NetReceiveIOV *receive_iov,
605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                      NetCleanup *cleanup,
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                      void *opaque);
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid qemu_del_vlan_client(VLANClientState *vc);
635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerVLANClientState *qemu_find_vlan_client(VLANState *vlan, void *opaque);
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint qemu_can_send_packet(VLANClientState *vc);
655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerssize_t qemu_sendv_packet(VLANClientState *vc, const struct iovec *iov,
665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                          int iovcnt);
675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerssize_t qemu_sendv_packet_async(VLANClientState *vc, const struct iovec *iov,
685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                int iovcnt, NetPacketSent *sent_cb);
698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid qemu_send_packet(VLANClientState *vc, const uint8_t *buf, int size);
705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerssize_t qemu_send_packet_async(VLANClientState *vc, const uint8_t *buf,
715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                               int size, NetPacketSent *sent_cb);
725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_flush_queued_packets(VLANClientState *vc);
735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_format_nic_info_str(VLANClientState *vc, uint8_t macaddr[6]);
745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_check_nic_model(NICInfo *nd, const char *model);
755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_check_nic_model_list(NICInfo *nd, const char * const *models,
765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                               const char *default_model);
778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid qemu_handler_true(void *opaque);
788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid do_info_network(Monitor *mon);
805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint do_set_link(Monitor *mon, const char *name, const char *up_or_down);
818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* NIC info */
838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define MAX_NICS 8
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct NICInfo {
878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint8_t macaddr[6];
888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char *model;
895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    const char *name;
908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    VLANState *vlan;
915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void *private;
925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int used;
938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int nb_nics;
968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern NICInfo nd_table[MAX_NICS];
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* BT HCI info */
995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct HCIInfo {
1015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int (*bdaddr_set)(struct HCIInfo *hci, const uint8_t *bd_addr);
1025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void (*cmd_send)(struct HCIInfo *hci, const uint8_t *data, int len);
1035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void (*sco_send)(struct HCIInfo *hci, const uint8_t *data, int len);
1045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void (*acl_send)(struct HCIInfo *hci, const uint8_t *data, int len);
1055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void *opaque;
1065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void (*evt_recv)(void *opaque, const uint8_t *data, int len);
1075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    void (*acl_recv)(void *opaque, const uint8_t *data, int len);
1085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner};
1095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct HCIInfo *qemu_next_hci(void);
1115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* checksumming functions (net-checksum.c) */
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint32_t net_checksum_add(int len, uint8_t *buf);
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint16_t net_checksum_finish(uint32_t sum);
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint16_t net_checksum_tcpudp(uint16_t length, uint16_t proto,
1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                             uint8_t *addrs, uint8_t *buf);
1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid net_checksum_calculate(uint8_t *data, int length);
1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* from net.c */
1205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint net_client_init(Monitor *mon, const char *device, const char *p);
1215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid net_client_uninit(NICInfo *nd);
1225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint net_client_parse(const char *str);
1235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid net_slirp_smb(const char *exported_dir);
1245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid net_slirp_redir(Monitor *mon, const char *redir_str, const char *redir_opt2);
1255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid net_cleanup(void);
1265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint slirp_is_inited(void);
1275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid net_client_check(void);
1285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid net_host_device_add(Monitor *mon, const char *device, const char *opts);
1295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid net_host_device_remove(Monitor *mon, int vlan_id, const char *device);
1305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEFAULT_NETWORK_SCRIPT "/etc/qemu-ifup"
1325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEFAULT_NETWORK_DOWN_SCRIPT "/etc/qemu-ifdown"
1335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef __sun__
1345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define SMBD_COMMAND "/usr/sfw/sbin/smbd"
1355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#else
1365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define SMBD_COMMAND "/usr/sbin/smbd"
1375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif
1385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qdev_get_macaddr(DeviceState *dev, uint8_t *macaddr);
1405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerVLANClientState *qdev_get_vlan_client(DeviceState *dev,
1415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                      NetCanReceive *can_receive,
1425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                      NetReceive *receive,
1435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                      NetReceiveIOV *receive_iov,
1445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                      NetCleanup *cleanup,
1455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                      void *opaque);
1465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
148