X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fpackets.h;h=8e21fa89bd2eef31dccc6267e0eae63331f2343e;hb=bdd534291ff72077390f7b1745c4443ad3833d99;hp=b7769146535d77a3d5a0507a29f4beef562453f1;hpb=4528f34f93422dde4c8ae4c56869cc4e268159c7;p=sliver-openvswitch.git diff --git a/lib/packets.h b/lib/packets.h index b77691465..8e21fa89b 100644 --- a/lib/packets.h +++ b/lib/packets.h @@ -31,6 +31,17 @@ struct ofpbuf; struct ds; +/* Datapath packet metadata */ +struct pkt_metadata { + struct flow_tnl tunnel; /* Encapsulating tunnel parameters. */ + uint32_t skb_priority; /* Packet priority for QoS. */ + uint32_t pkt_mark; /* Packet mark. */ + odp_port_t in_port; /* Input port. */ +}; + +#define PKT_METADATA_INITIALIZER(PORT) \ + (struct pkt_metadata){ { 0, 0, 0, 0, 0, 0}, 0, 0, (PORT) } + bool dpid_from_string(const char *s, uint64_t *dpidp); #define ETH_ADDR_LEN 6 @@ -140,11 +151,9 @@ bool eth_addr_from_string(const char *, uint8_t ea[ETH_ADDR_LEN]); void compose_rarp(struct ofpbuf *, const uint8_t eth_src[ETH_ADDR_LEN]); -void eth_push_vlan(struct ofpbuf *, ovs_be16 tci); +void eth_push_vlan(struct ofpbuf *, ovs_be16 tpid, ovs_be16 tci); void eth_pop_vlan(struct ofpbuf *); -uint16_t eth_mpls_depth(const struct ofpbuf *packet); - void set_ethertype(struct ofpbuf *packet, ovs_be16 eth_type); const char *eth_from_hex(const char *hex, struct ofpbuf **packetp); @@ -183,15 +192,14 @@ ovs_be32 set_mpls_lse_values(uint8_t ttl, uint8_t tc, uint8_t bos, * uint8_t mac[ETH_ADDR_LEN]; * int a, b; * - * if (sscanf(string, "%d"ETH_ADDR_SCAN_FMT"%d", - * &a, ETH_ADDR_SCAN_ARGS(mac), &b) == 1 + ETH_ADDR_SCAN_COUNT + 1) { + * if (ovs_scan(string, "%d"ETH_ADDR_SCAN_FMT"%d", + * &a, ETH_ADDR_SCAN_ARGS(mac), &b)) { * ... * } */ #define ETH_ADDR_SCAN_FMT "%"SCNx8":%"SCNx8":%"SCNx8":%"SCNx8":%"SCNx8":%"SCNx8 #define ETH_ADDR_SCAN_ARGS(ea) \ &(ea)[0], &(ea)[1], &(ea)[2], &(ea)[3], &(ea)[4], &(ea)[5] -#define ETH_ADDR_SCAN_COUNT 6 #define ETH_TYPE_IP 0x0800 #define ETH_TYPE_ARP 0x0806 @@ -383,8 +391,7 @@ mpls_lse_to_bos(ovs_be32 mpls_lse) * 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) { + * if (ovs_scan(string, "%d"IP_SCAN_FMT"%d", &a, IP_SCAN_ARGS(&ip), &b)) { * ... * } */ @@ -394,7 +401,6 @@ mpls_lse_to_bos(ovs_be32 mpls_lse) &((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. */ @@ -489,15 +495,18 @@ struct udp_header { }; BUILD_ASSERT_DECL(UDP_HEADER_LEN == sizeof(struct udp_header)); -#define TCP_FIN 0x01 -#define TCP_SYN 0x02 -#define TCP_RST 0x04 -#define TCP_PSH 0x08 -#define TCP_ACK 0x10 -#define TCP_URG 0x20 +#define TCP_FIN 0x001 +#define TCP_SYN 0x002 +#define TCP_RST 0x004 +#define TCP_PSH 0x008 +#define TCP_ACK 0x010 +#define TCP_URG 0x020 +#define TCP_ECE 0x040 +#define TCP_CWR 0x080 +#define TCP_NS 0x100 #define TCP_CTL(flags, offset) (htons((flags) | ((offset) << 12))) -#define TCP_FLAGS(tcp_ctl) (ntohs(tcp_ctl) & 0x003f) +#define TCP_FLAGS(tcp_ctl) (ntohs(tcp_ctl) & 0x0fff) #define TCP_OFFSET(tcp_ctl) (ntohs(tcp_ctl) >> 12) #define TCP_HEADER_LEN 20 @@ -577,7 +586,7 @@ struct ovs_16aligned_ip6_frag { * char ipv6_s[IPV6_SCAN_LEN + 1]; * struct in6_addr ipv6; * - * if (sscanf(string, "%d"IPV6_SCAN_FMT"%d", &a, ipv6_s, &b) == 3 + * if (ovs_scan(string, "%d"IPV6_SCAN_FMT"%d", &a, ipv6_s, &b) * && inet_pton(AF_INET6, ipv6_s, &ipv6) == 1) { * ... * } @@ -643,7 +652,8 @@ void packet_set_tcp_port(struct ofpbuf *, ovs_be16 src, ovs_be16 dst); void packet_set_udp_port(struct ofpbuf *, ovs_be16 src, ovs_be16 dst); void packet_set_sctp_port(struct ofpbuf *, ovs_be16 src, ovs_be16 dst); -uint8_t packet_get_tcp_flags(const struct ofpbuf *, const struct flow *); -void packet_format_tcp_flags(struct ds *, uint8_t); +uint16_t packet_get_tcp_flags(const struct ofpbuf *, const struct flow *); +void packet_format_tcp_flags(struct ds *, uint16_t); +const char *packet_tcp_flag_to_string(uint32_t flag); #endif /* packets.h */