X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=include%2Fpackets.h;h=bad36712d3fb96af550e156a65bfd2c3d7cd99b6;hb=b253101bd6199b5494c9b96862fc077454a0f2e5;hp=cf2dc279d4454c48a943245a0f8384a9e3a485f9;hpb=3f0201adb5da48e98039e4a7552284b77004784a;p=sliver-openvswitch.git diff --git a/include/packets.h b/include/packets.h index cf2dc279d..bad36712d 100644 --- a/include/packets.h +++ b/include/packets.h @@ -34,10 +34,16 @@ #define PACKETS_H 1 #include +#include +#include "compiler.h" +#include "random.h" #include "util.h" #define ETH_ADDR_LEN 6 +static const uint8_t eth_addr_broadcast[ETH_ADDR_LEN] UNUSED + = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + static inline bool eth_addr_is_broadcast(const uint8_t ea[6]) { return (ea[0] & ea[1] & ea[2] & ea[3] & ea[4] & ea[5]) == 0xff; @@ -50,6 +56,44 @@ static inline bool eth_addr_is_local(const uint8_t ea[6]) { return ea[0] & 2; } +static inline bool eth_addr_is_zero(const uint8_t ea[6]) +{ + return !(ea[0] | ea[1] | ea[2] | ea[3] | ea[4] | ea[5]); +} +static inline bool eth_addr_equals(const uint8_t a[ETH_ADDR_LEN], + const uint8_t b[ETH_ADDR_LEN]) +{ + return !memcmp(a, b, ETH_ADDR_LEN); +} +static inline uint64_t eth_addr_to_uint64(const uint8_t ea[ETH_ADDR_LEN]) +{ + return (((uint64_t) ea[0] << 40) + | ((uint64_t) ea[1] << 32) + | ((uint64_t) ea[2] << 24) + | ((uint64_t) ea[3] << 16) + | ((uint64_t) ea[4] << 8) + | ea[5]); +} +static inline void eth_addr_from_uint64(uint64_t x, uint8_t ea[ETH_ADDR_LEN]) +{ + ea[0] = x >> 40; + ea[1] = x >> 32; + ea[2] = x >> 24; + ea[3] = x >> 16; + ea[4] = x >> 8; + ea[5] = x; +} +static inline void eth_addr_random(uint8_t ea[ETH_ADDR_LEN]) +{ + random_bytes(ea, ETH_ADDR_LEN); + ea[0] &= ~1; /* Unicast. */ + ea[0] |= 2; /* Private. */ +} + +#define ETH_ADDR_FMT \ + "%02"PRIx8":%02"PRIx8":%02"PRIx8":%02"PRIx8":%02"PRIx8":%02"PRIx8 +#define ETH_ADDR_ARGS(ea) \ + (ea)[0], (ea)[1], (ea)[2], (ea)[3], (ea)[4], (ea)[5] #define ETH_TYPE_IP 0x0800 #define ETH_TYPE_ARP 0x0806 @@ -57,13 +101,15 @@ static inline bool eth_addr_is_local(const uint8_t ea[6]) #define ETH_HEADER_LEN 14 #define ETH_PAYLOAD_MIN 46 +#define ETH_PAYLOAD_MAX 1500 #define ETH_TOTAL_MIN (ETH_HEADER_LEN + ETH_PAYLOAD_MIN) -#define ETH_TOTAL_MAX (ETH_HEADER_LEN + VLAN_HEADER_LEN + 1500) +#define ETH_TOTAL_MAX (ETH_HEADER_LEN + ETH_PAYLOAD_MAX) +#define ETH_VLAN_TOTAL_MAX (ETH_HEADER_LEN + VLAN_HEADER_LEN + ETH_PAYLOAD_MAX) struct eth_header { uint8_t eth_dst[ETH_ADDR_LEN]; uint8_t eth_src[ETH_ADDR_LEN]; uint16_t eth_type; -}; +} __attribute__((packed)); BUILD_ASSERT_DECL(ETH_HEADER_LEN == sizeof(struct eth_header)); #define LLC_DSAP_SNAP 0xaa @@ -75,7 +121,7 @@ struct llc_header { uint8_t llc_dsap; uint8_t llc_ssap; uint8_t llc_cntl; -}; +} __attribute__((packed)); BUILD_ASSERT_DECL(LLC_HEADER_LEN == sizeof(struct llc_header)); #define SNAP_ORG_ETHERNET "\0\0" /* The compiler adds a null byte, so @@ -91,10 +137,11 @@ BUILD_ASSERT_DECL(SNAP_HEADER_LEN == sizeof(struct snap_header)); struct llc_snap_header { struct llc_header llc; struct snap_header snap; -}; +} __attribute__((packed)); BUILD_ASSERT_DECL(LLC_SNAP_HEADER_LEN == sizeof(struct llc_snap_header)); -#define VLAN_VID 0x0fff +#define VLAN_VID_MASK 0x0fff +#define VLAN_PCP_MASK 0xe000 #define VLAN_HEADER_LEN 4 struct vlan_header { @@ -110,15 +157,32 @@ struct vlan_eth_header { uint16_t veth_type; /* Always htons(ETH_TYPE_VLAN). */ uint16_t veth_tci; /* Lowest 12 bits are VLAN ID. */ uint16_t veth_next_type; -}; +} __attribute__((packed)); BUILD_ASSERT_DECL(VLAN_ETH_HEADER_LEN == sizeof(struct vlan_eth_header)); +#define IP_FMT "%"PRIu8".%"PRIu8".%"PRIu8".%"PRIu8 +#define IP_ARGS(ip) \ + ((uint8_t *) ip)[0], \ + ((uint8_t *) ip)[1], \ + ((uint8_t *) ip)[2], \ + ((uint8_t *) ip)[3] + #define IP_VER(ip_ihl_ver) ((ip_ihl_ver) >> 4) #define IP_IHL(ip_ihl_ver) ((ip_ihl_ver) & 15) +#define IP_IHL_VER(ihl, ver) (((ver) << 4) | (ihl)) +#define IP_TYPE_ICMP 1 #define IP_TYPE_TCP 6 #define IP_TYPE_UDP 17 +#define IP_VERSION 4 + +#define IP_DONT_FRAGMENT 0x4000 /* Don't fragment. */ +#define IP_MORE_FRAGMENTS 0x2000 /* More fragments. */ +#define IP_FRAG_OFF_MASK 0x1fff /* Fragment offset. */ +#define IP_IS_FRAGMENT(ip_frag_off) \ + ((ip_frag_off) & htons(IP_MORE_FRAGMENTS | IP_FRAG_OFF_MASK)) + #define IP_HEADER_LEN 20 struct ip_header { uint8_t ip_ihl_ver;