/* * QEMU rocker switch emulation * * Copyright (c) 2014 Scott Feldman * Copyright (c) 2014 Jiri Pirko * Copyright (c) 2014 Neil Horman * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #ifndef ROCKER_H #define ROCKER_H #include "qemu/sockets.h" #if defined(DEBUG_ROCKER) # define DPRINTF(fmt, ...) \ do { \ struct timeval tv; \ char timestr[64]; \ time_t now; \ gettimeofday(&tv, NULL); \ now = tv.tv_sec; \ strftime(timestr, sizeof(timestr), "%T", localtime(&now)); \ fprintf(stderr, "%s.%06ld ", timestr, tv.tv_usec); \ fprintf(stderr, "ROCKER: " fmt, ## __VA_ARGS__); \ } while (0) #else static inline GCC_FMT_ATTR(1, 2) int DPRINTF(const char *fmt, ...) { return 0; } #endif #define __le16 uint16_t #define __le32 uint32_t #define __le64 uint64_t #define __be16 uint16_t #define __be32 uint32_t #define __be64 uint64_t static inline bool ipv4_addr_is_multicast(__be32 addr) { return (addr & htonl(0xf0000000)) == htonl(0xe0000000); } typedef struct ipv6_addr { union { uint8_t addr8[16]; __be16 addr16[8]; __be32 addr32[4]; }; } Ipv6Addr; static inline bool ipv6_addr_is_multicast(const Ipv6Addr *addr) { return (addr->addr32[0] & htonl(0xFF000000)) == htonl(0xFF000000); } typedef struct world World; typedef struct desc_info DescInfo; typedef struct desc_ring DescRing; #define TYPE_ROCKER "rocker" typedef struct rocker Rocker; #define ROCKER(obj) \ OBJECT_CHECK(Rocker, (obj), TYPE_ROCKER) Rocker *rocker_find(const char *name); uint32_t rocker_fp_ports(Rocker *r); int rocker_event_link_changed(Rocker *r, uint32_t pport, bool link_up); int rocker_event_mac_vlan_seen(Rocker *r, uint32_t pport, uint8_t *addr, uint16_t vlan_id); int rx_produce(World *world, uint32_t pport, const struct iovec *iov, int iovcnt, uint8_t copy_to_cpu); int rocker_port_eg(Rocker *r, uint32_t pport, const struct iovec *iov, int iovcnt); #endif /* ROCKER_H */