X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fpackets.c;h=3edfe01a711521f4413df1de345609782e75c535;hb=5a51b2cd3483c6c1719e5ef7091f558d49431351;hp=65ba3f685a2472e44afd858167310394991ce740;hpb=d8b352b3e111615b0c1961704138748c6a71c204;p=sliver-openvswitch.git diff --git a/lib/packets.c b/lib/packets.c index 65ba3f685..3edfe01a7 100644 --- a/lib/packets.c +++ b/lib/packets.c @@ -619,12 +619,13 @@ packet_set_ipv4_addr(struct ofpbuf *packet, { struct ip_header *nh = packet->l3; ovs_be32 old_addr = get_16aligned_be32(addr); + size_t l4_size = ofpbuf_get_l4_size(packet); - if (nh->ip_proto == IPPROTO_TCP && packet->l7) { + if (nh->ip_proto == IPPROTO_TCP && l4_size >= TCP_HEADER_LEN) { struct tcp_header *th = packet->l4; th->tcp_csum = recalc_csum32(th->tcp_csum, old_addr, new_addr); - } else if (nh->ip_proto == IPPROTO_UDP && packet->l7) { + } else if (nh->ip_proto == IPPROTO_UDP && l4_size >= UDP_HEADER_LEN ) { struct udp_header *uh = packet->l4; if (uh->udp_csum) { @@ -727,11 +728,13 @@ static void packet_update_csum128(struct ofpbuf *packet, uint8_t proto, ovs_16aligned_be32 addr[4], const ovs_be32 new_addr[4]) { - if (proto == IPPROTO_TCP && packet->l7) { + size_t l4_size = ofpbuf_get_l4_size(packet); + + if (proto == IPPROTO_TCP && l4_size >= TCP_HEADER_LEN) { struct tcp_header *th = packet->l4; th->tcp_csum = recalc_csum128(th->tcp_csum, addr, new_addr); - } else if (proto == IPPROTO_UDP && packet->l7) { + } else if (proto == IPPROTO_UDP && l4_size >= UDP_HEADER_LEN) { struct udp_header *uh = packet->l4; if (uh->udp_csum) {