{
/* Local if it is either a locally administered address or a Nicira random
* address. */
- return !!(ea[0] & 2)
- || (ea[0] == 0x00 && ea[1] == 0x23 && ea[2] == 0x20 && !!(ea[3] & 0x80));
+ return ea[0] & 2
+ || (ea[0] == 0x00 && ea[1] == 0x23 && ea[2] == 0x20 && ea[3] & 0x80);
}
static inline bool eth_addr_is_zero(const uint8_t ea[6])
{
uint16_t snap_type,
const uint8_t eth_src[ETH_ADDR_LEN]);
-void eth_set_vlan_tci(struct ofpbuf *, ovs_be16 tci);
+void eth_push_vlan(struct ofpbuf *, ovs_be16 tci);
/* Example:
*
((uint8_t *) ip)[2], \
((uint8_t *) ip)[3]
+/* Example:
+ *
+ * char *string = "1 33.44.55.66 2";
+ * ovs_be32 ip;
+ * int a, b;
+ *
+ * if (sscanf(string, "%d"IP_SCAN_FMT"%d",
+ * &a, IP_SCAN_ARGS(&ip), &b) == 1 + IP_SCAN_COUNT + 1) {
+ * ...
+ * }
+ */
+#define IP_SCAN_FMT "%"SCNu8".%"SCNu8".%"SCNu8".%"SCNu8
+#define IP_SCAN_ARGS(ip) \
+ ((void) (ovs_be32) *(ip), &((uint8_t *) ip)[0]), \
+ &((uint8_t *) ip)[1], \
+ &((uint8_t *) ip)[2], \
+ &((uint8_t *) ip)[3]
+#define IP_SCAN_COUNT 4
+
/* Returns true if 'netmask' is a CIDR netmask, that is, if it consists of N
* high-order 1-bits and 32-N low-order 0-bits. */
static inline bool
#define TCP_ACK 0x10
#define TCP_URG 0x20
-#define TCP_FLAGS(tcp_ctl) (htons(tcp_ctl) & 0x003f)
-#define TCP_OFFSET(tcp_ctl) (htons(tcp_ctl) >> 12)
+#define TCP_FLAGS(tcp_ctl) (ntohs(tcp_ctl) & 0x003f)
+#define TCP_OFFSET(tcp_ctl) (ntohs(tcp_ctl) >> 12)
#define TCP_HEADER_LEN 20
struct tcp_header {
} __attribute__((packed));
BUILD_ASSERT_DECL(ARP_ETH_HEADER_LEN == sizeof(struct arp_eth_header));
+/* Example:
+ *
+ * char *string = "1 ::1 2";
+ * char ipv6_s[IPV6_SCAN_LEN + 1];
+ * struct in6_addr ipv6;
+ *
+ * if (sscanf(string, "%d"IPV6_SCAN_FMT"%d", &a, ipv6_s, &b) == 3
+ * && inet_pton(AF_INET6, ipv6_s, &ipv6) == 1) {
+ * ...
+ * }
+ */
+#define IPV6_SCAN_FMT "%46[0123456789abcdefABCDEF:.]"
+#define IPV6_SCAN_LEN 46
+
extern const struct in6_addr in6addr_exact;
#define IN6ADDR_EXACT_INIT { { { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, \
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff } } }
const uint8_t eth_src[ETH_ADDR_LEN],
unsigned int oui, uint16_t snap_type, size_t size);
-/* Masks for lacp_info state member. */
-#define LACP_STATE_ACT 0x01 /* Activity. Active or passive? */
-#define LACP_STATE_TIME 0x02 /* Timeout. Short or long timeout? */
-#define LACP_STATE_AGG 0x04 /* Aggregation. Is the link is bondable? */
-#define LACP_STATE_SYNC 0x08 /* Synchronization. Is the link in up to date? */
-#define LACP_STATE_COL 0x10 /* Collecting. Is the link receiving frames? */
-#define LACP_STATE_DIST 0x20 /* Distributing. Is the link sending frames? */
-#define LACP_STATE_DEF 0x40 /* Defaulted. Using default partner info? */
-#define LACP_STATE_EXP 0x80 /* Expired. Using expired partner info? */
-
-#define LACP_FAST_TIME_TX 1000 /* Fast transmission rate. */
-#define LACP_SLOW_TIME_TX 30000 /* Slow transmission rate. */
-#define LACP_FAST_TIME_RX (LACP_FAST_TIME_TX * 3) /* Fast receive rate. */
-#define LACP_SLOW_TIME_RX (LACP_SLOW_TIME_TX * 3) /* Slow receive rate. */
-
-#define LACP_INFO_LEN 15
-struct lacp_info {
- ovs_be16 sys_priority; /* System priority. */
- uint8_t sys_id[ETH_ADDR_LEN]; /* System ID. */
- ovs_be16 key; /* Operational key. */
- ovs_be16 port_priority; /* Port priority. */
- ovs_be16 port_id; /* Port ID. */
- uint8_t state; /* State mask. See LACP_STATE macros. */
-} __attribute__((packed));
-BUILD_ASSERT_DECL(LACP_INFO_LEN == sizeof(struct lacp_info));
-
-#define LACP_PDU_LEN 110
-struct lacp_pdu {
- uint8_t subtype; /* Always 1. */
- uint8_t version; /* Always 1. */
-
- uint8_t actor_type; /* Always 1. */
- uint8_t actor_len; /* Always 20. */
- struct lacp_info actor; /* LACP actor information. */
- uint8_t z1[3]; /* Reserved. Always 0. */
-
- uint8_t partner_type; /* Always 2. */
- uint8_t partner_len; /* Always 20. */
- struct lacp_info partner; /* LACP partner information. */
- uint8_t z2[3]; /* Reserved. Always 0. */
-
- uint8_t collector_type; /* Always 3. */
- uint8_t collector_len; /* Always 16. */
- ovs_be16 collector_delay; /* Maximum collector delay. Set to UINT16_MAX. */
- uint8_t z3[64]; /* Combination of several fields. Always 0. */
-} __attribute__((packed));
-BUILD_ASSERT_DECL(LACP_PDU_LEN == sizeof(struct lacp_pdu));
-
-void compose_lacp_pdu(const struct lacp_info *actor,
- const struct lacp_info *partner, struct lacp_pdu *);
-
-const struct lacp_pdu *parse_lacp_packet(const struct ofpbuf *);
-
#endif /* packets.h */