#define ETH_TYPE_ARP 0x0806
#define ETH_TYPE_VLAN 0x8100
#define ETH_TYPE_IPV6 0x86dd
-#define ETH_TYPE_CFM 0x8902
#define ETH_TYPE_LACP 0x8809
/* Minimum value for an Ethernet type. Values below this are IEEE 802.2 frame
} __attribute__((packed));
BUILD_ASSERT_DECL(VLAN_ETH_HEADER_LEN == sizeof(struct vlan_eth_header));
-/* A 'ccm' represents a Continuity Check Message from the 802.1ag specification.
- * Continuity Check Messages are broadcast periodically so that hosts can
- * determine who they have connectivity to. */
-#define CCM_LEN 74
-#define CCM_MAID_LEN 48
-struct ccm {
- uint8_t mdlevel_version; /* MD Level and Version */
- uint8_t opcode;
- uint8_t flags;
- uint8_t tlv_offset;
- ovs_be32 seq;
- ovs_be16 mpid;
- uint8_t maid[CCM_MAID_LEN];
- uint8_t zero[16]; /* Defined by ITU-T Y.1731 should be zero */
-} __attribute__((packed));
-BUILD_ASSERT_DECL(CCM_LEN == sizeof(struct ccm));
-
/* The "(void) (ip)[0]" below has no effect on the value, since it's the first
* argument of a comma expression, but it makes sure that 'ip' is a pointer.
* This is useful since a common mistake is to pass an integer instead of a
int ipv6_count_cidr_bits(const struct in6_addr *netmask);
bool ipv6_is_cidr(const struct in6_addr *netmask);
+void *
+compose_packet(struct ofpbuf *, const uint8_t eth_dst[ETH_ADDR_LEN],
+ const uint8_t eth_src[ETH_ADDR_LEN], uint16_t eth_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_INFO_LEN 15
struct lacp_info {
- ovs_be16 sys_priority; /* System priority. */
- uint8_t sysid[ETH_ADDR_LEN]; /* System ID. */
- ovs_be16 key; /* Operational key. */
- ovs_be16 port_priority; /* Port priority. */
- ovs_be16 portid; /* Port ID. */
- uint8_t state; /* State mask. See LACP_STATE macros. */
+ 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));
} __attribute__((packed));
BUILD_ASSERT_DECL(LACP_PDU_LEN == sizeof(struct lacp_pdu));
-void compose_lacp_packet(struct ofpbuf *, struct lacp_info *actor,
- struct lacp_info *partner,
- const uint8_t eth_src[ETH_ADDR_LEN]);
+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 *);