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