}
/* We only process the first fragment. */
- flow->nw_frag = FLOW_NW_FRAG_ANY;
- if ((frag_hdr->ip6f_offlg & IP6F_OFF_MASK) != htons(0)) {
- flow->nw_frag |= FLOW_NW_FRAG_LATER;
- nexthdr = IPPROTO_FRAGMENT;
- break;
+ if (frag_hdr->ip6f_offlg != htons(0)) {
+ if ((frag_hdr->ip6f_offlg & IP6F_OFF_MASK) == htons(0)) {
+ flow->nw_frag = FLOW_NW_FRAG_ANY;
+ } else {
+ flow->nw_frag |= FLOW_NW_FRAG_LATER;
+ nexthdr = IPPROTO_FRAGMENT;
+ break;
+ }
}
}
}
b->l4 = tcp = ofpbuf_put_zeros(b, sizeof *tcp);
tcp->tcp_src = flow->tp_src;
tcp->tcp_dst = flow->tp_dst;
+ tcp->tcp_ctl = TCP_CTL(0, 5);
} else if (flow->nw_proto == IPPROTO_UDP) {
struct udp_header *udp;
icmp->icmp_code = ntohs(flow->tp_dst);
}
}
+
+ ip->ip_tot_len = htons((uint8_t *) b->data + b->size
+ - (uint8_t *) b->l3);
} else if (flow->dl_type == htons(ETH_TYPE_IPV6)) {
/* XXX */
} else if (flow->dl_type == htons(ETH_TYPE_ARP)) {