- nh = ofpbuf_pull(&b, nh_len);
- if (nh) {
- packet->l4 = b.data;
- if (flow->nw_proto == IPPROTO_TCP) {
- const struct tcp_header *tcp = pull_tcp(&b);
- if (tcp) {
- flow->tp_src = tcp->tcp_src;
- flow->tp_dst = tcp->tcp_dst;
- packet->l7 = b.data;
- }
- } else if (flow->nw_proto == IPPROTO_UDP) {
- const struct udp_header *udp = pull_udp(&b);
- if (udp) {
- flow->tp_src = udp->udp_src;
- flow->tp_dst = udp->udp_dst;
- packet->l7 = b.data;
- }
- } else if (flow->nw_proto == IPPROTO_ICMPV6) {
- int icmp_len = ntohs(nh->ip6_plen) + sizeof *nh - nh_len;
- if (parse_icmpv6(&b, flow, icmp_len)) {
- packet->l7 = b.data;
- }
+ packet->l4 = b.data;
+ if (flow->nw_proto == IPPROTO_TCP) {
+ parse_tcp(packet, &b, flow);
+ } else if (flow->nw_proto == IPPROTO_UDP) {
+ parse_udp(packet, &b, flow);
+ } else if (flow->nw_proto == IPPROTO_ICMPV6) {
+ if (parse_icmpv6(&b, flow)) {
+ packet->l7 = b.data;