1 /* 2 * QEMU rocker switch emulation 3 * 4 * Copyright (c) 2014 Scott Feldman <sfeldma@gmail.com> 5 * Copyright (c) 2014 Jiri Pirko <jiri@resnulli.us> 6 * Copyright (c) 2014 Neil Horman <nhorman@tuxdriver.com> 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 */ 18 19 #ifndef ROCKER_H 20 #define ROCKER_H 21 22 #include "qemu/sockets.h" 23 #include "qom/object.h" 24 25 #if defined(DEBUG_ROCKER) 26 # define DPRINTF(fmt, ...) \ 27 do { \ 28 struct timeval tv; \ 29 char timestr[64]; \ 30 time_t now; \ 31 gettimeofday(&tv, NULL); \ 32 now = tv.tv_sec; \ 33 strftime(timestr, sizeof(timestr), "%T", localtime(&now)); \ 34 fprintf(stderr, "%s.%06ld ", timestr, tv.tv_usec); \ 35 fprintf(stderr, "ROCKER: " fmt, ## __VA_ARGS__); \ 36 } while (0) 37 #else 38 static inline GCC_FMT_ATTR(1, 2) int DPRINTF(const char *fmt, ...) 39 { 40 return 0; 41 } 42 #endif 43 44 #define __le16 uint16_t 45 #define __le32 uint32_t 46 #define __le64 uint64_t 47 48 #define __be16 uint16_t 49 #define __be32 uint32_t 50 #define __be64 uint64_t 51 52 static inline bool ipv4_addr_is_multicast(__be32 addr) 53 { 54 return (addr & htonl(0xf0000000)) == htonl(0xe0000000); 55 } 56 57 typedef struct ipv6_addr { 58 union { 59 uint8_t addr8[16]; 60 __be16 addr16[8]; 61 __be32 addr32[4]; 62 }; 63 } Ipv6Addr; 64 65 static inline bool ipv6_addr_is_multicast(const Ipv6Addr *addr) 66 { 67 return (addr->addr32[0] & htonl(0xFF000000)) == htonl(0xFF000000); 68 } 69 70 typedef struct world World; 71 typedef struct desc_info DescInfo; 72 typedef struct desc_ring DescRing; 73 74 #define TYPE_ROCKER "rocker" 75 typedef struct rocker Rocker; 76 DECLARE_INSTANCE_CHECKER(Rocker, ROCKER, 77 TYPE_ROCKER) 78 79 Rocker *rocker_find(const char *name); 80 uint32_t rocker_fp_ports(Rocker *r); 81 int rocker_event_link_changed(Rocker *r, uint32_t pport, bool link_up); 82 int rocker_event_mac_vlan_seen(Rocker *r, uint32_t pport, uint8_t *addr, 83 uint16_t vlan_id); 84 int rx_produce(World *world, uint32_t pport, 85 const struct iovec *iov, int iovcnt, uint8_t copy_to_cpu); 86 int rocker_port_eg(Rocker *r, uint32_t pport, 87 const struct iovec *iov, int iovcnt); 88 89 #endif /* ROCKER_H */ 90