X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fpackets.c;h=d87aa8eb34019f9ed00cf9c4b9fc47baded420fe;hb=6b4b2f598246e87237342a9179a0d29e202ebe65;hp=d15c402fbc671d89f121093b2a9744a664a6588a;hpb=cc457b0fa2e45555b354d7107cabf9c9adc89183;p=sliver-openvswitch.git diff --git a/lib/packets.c b/lib/packets.c index d15c402fb..d87aa8eb3 100644 --- a/lib/packets.c +++ b/lib/packets.c @@ -130,8 +130,7 @@ eth_addr_is_reserved(const uint8_t ea[ETH_ADDR_LEN]) bool eth_addr_from_string(const char *s, uint8_t ea[ETH_ADDR_LEN]) { - if (sscanf(s, ETH_ADDR_SCAN_FMT, ETH_ADDR_SCAN_ARGS(ea)) - == ETH_ADDR_SCAN_COUNT) { + if (ovs_scan(s, ETH_ADDR_SCAN_FMT, ETH_ADDR_SCAN_ARGS(ea))) { return true; } else { memset(ea, 0, ETH_ADDR_LEN); @@ -218,32 +217,6 @@ eth_pop_vlan(struct ofpbuf *packet) } } -/* Return depth of mpls stack. - * - * 'packet->l2_5' should initially point to 'packet''s outer-most MPLS header - * or may be NULL if there are no MPLS headers. */ -uint16_t -eth_mpls_depth(const struct ofpbuf *packet) -{ - struct mpls_hdr *mh = packet->l2_5; - uint16_t depth; - - if (!mh) { - return 0; - } - - depth = 0; - while (packet->size >= ((char *)mh - (char *)packet->data) + sizeof *mh) { - depth++; - if (mh->mpls_lse & htonl(MPLS_BOS_MASK)) { - break; - } - mh++; - } - - return depth; -} - /* Set ethertype of the packet. */ void set_ethertype(struct ofpbuf *packet, ovs_be16 eth_type) @@ -452,14 +425,14 @@ eth_addr_bitand(const uint8_t src[ETH_ADDR_LEN], int ip_count_cidr_bits(ovs_be32 netmask) { - return 32 - ctz(ntohl(netmask)); + return 32 - ctz32(ntohl(netmask)); } void ip_format_masked(ovs_be32 ip, ovs_be32 mask, struct ds *s) { ds_put_format(s, IP_FMT, IP_ARGS(ip)); - if (mask != htonl(UINT32_MAX)) { + if (mask != OVS_BE32_MAX) { if (ip_is_cidr(mask)) { ds_put_format(s, "/%d", ip_count_cidr_bits(mask)); } else { @@ -924,7 +897,7 @@ packet_set_sctp_port(struct ofpbuf *packet, ovs_be16 src, ovs_be16 dst) * * 'flow' must be the flow corresponding to 'packet' and 'packet''s header * pointers must be properly initialized (e.g. with flow_extract()). */ -uint8_t +uint16_t packet_get_tcp_flags(const struct ofpbuf *packet, const struct flow *flow) { if (dl_type_is_ip_any(flow->dl_type) && @@ -936,11 +909,44 @@ packet_get_tcp_flags(const struct ofpbuf *packet, const struct flow *flow) } } +const char * +packet_tcp_flag_to_string(uint32_t flag) +{ + switch (flag) { + case TCP_FIN: + return "fin"; + case TCP_SYN: + return "syn"; + case TCP_RST: + return "rst"; + case TCP_PSH: + return "psh"; + case TCP_ACK: + return "ack"; + case TCP_URG: + return "urg"; + case TCP_ECE: + return "ece"; + case TCP_CWR: + return "cwr"; + case TCP_NS: + return "ns"; + case 0x200: + return "[200]"; + case 0x400: + return "[400]"; + case 0x800: + return "[800]"; + default: + return NULL; + } +} + /* Appends a string representation of the TCP flags value 'tcp_flags' * (e.g. obtained via packet_get_tcp_flags() or TCP_FLAGS) to 's', in the * format used by tcpdump. */ void -packet_format_tcp_flags(struct ds *s, uint8_t tcp_flags) +packet_format_tcp_flags(struct ds *s, uint16_t tcp_flags) { if (!tcp_flags) { ds_put_cstr(s, "none"); @@ -965,10 +971,22 @@ packet_format_tcp_flags(struct ds *s, uint8_t tcp_flags) if (tcp_flags & TCP_ACK) { ds_put_char(s, '.'); } - if (tcp_flags & 0x40) { - ds_put_cstr(s, "[40]"); + if (tcp_flags & TCP_ECE) { + ds_put_cstr(s, "E"); + } + if (tcp_flags & TCP_CWR) { + ds_put_cstr(s, "C"); + } + if (tcp_flags & TCP_NS) { + ds_put_cstr(s, "N"); + } + if (tcp_flags & 0x200) { + ds_put_cstr(s, "[200]"); + } + if (tcp_flags & 0x400) { + ds_put_cstr(s, "[400]"); } - if (tcp_flags & 0x80) { - ds_put_cstr(s, "[80]"); + if (tcp_flags & 0x800) { + ds_put_cstr(s, "[800]"); } }