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 g_autoptr(GDateTime) now = g_date_time_new_now_local(); \ 29 g_autofree char *nowstr = g_date_time_format(now, "%T.%f");\ 30 fprintf(stderr, "%s ROCKER: " fmt, nowstr, ## __VA_ARGS__);\ 31 } while (0) 32 #else 33 static inline G_GNUC_PRINTF(1, 2) int DPRINTF(const char *fmt, ...) 34 { 35 return 0; 36 } 37 #endif 38 39 static inline bool ipv4_addr_is_multicast(uint32_t addr) 40 { 41 return (addr & htonl(0xf0000000)) == htonl(0xe0000000); 42 } 43 44 typedef struct ipv6_addr { 45 union { 46 uint8_t addr8[16]; 47 uint16_t addr16[8]; 48 uint32_t addr32[4]; 49 }; 50 } Ipv6Addr; 51 52 static inline bool ipv6_addr_is_multicast(const Ipv6Addr *addr) 53 { 54 return (addr->addr32[0] & htonl(0xFF000000)) == htonl(0xFF000000); 55 } 56 57 typedef struct world World; 58 typedef struct desc_info DescInfo; 59 typedef struct desc_ring DescRing; 60 61 #define TYPE_ROCKER "rocker" 62 typedef struct rocker Rocker; 63 DECLARE_INSTANCE_CHECKER(Rocker, ROCKER, 64 TYPE_ROCKER) 65 66 Rocker *rocker_find(const char *name); 67 int rocker_event_link_changed(Rocker *r, uint32_t pport, bool link_up); 68 int rocker_event_mac_vlan_seen(Rocker *r, uint32_t pport, uint8_t *addr, 69 uint16_t vlan_id); 70 int rx_produce(World *world, uint32_t pport, 71 const struct iovec *iov, int iovcnt, uint8_t copy_to_cpu); 72 int rocker_port_eg(Rocker *r, uint32_t pport, 73 const struct iovec *iov, int iovcnt); 74 75 #endif /* ROCKER_H */ 76