~logan/ubuntu/raring/openvswitch/fixes-1094556

« back to all changes in this revision

Viewing changes to .pc/0001-datapath-Remove-custom-version-of-ipv6_skip_exthdr.patch/lib/flow.c

  • Committer: Package Import Robot
  • Author(s): James Page
  • Date: 2012-10-23 17:24:17 UTC
  • Revision ID: package-import@ubuntu.com-20121023172417-26590u7zfr4r795j
Tags: 1.4.3-0ubuntu2
* Re-enable the openvswitch-datapath-dkms package to enable support
  for gre tunnels between virtual switches which is not supported
  in the kernel provided openvswitch module (LP: #1068365). 
  - d/patches/0001->0008*.patch: Cherry picked patches from upstream
    trunk which enable support for the 3.5 linux kernel and align
    dkms module naming with kernel module naming.
  - d/dkms.conf.in: Drop _mod postfix from dkms module names.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira Networks.
 
3
 *
 
4
 * Licensed under the Apache License, Version 2.0 (the "License");
 
5
 * you may not use this file except in compliance with the License.
 
6
 * You may obtain a copy of the License at:
 
7
 *
 
8
 *     http://www.apache.org/licenses/LICENSE-2.0
 
9
 *
 
10
 * Unless required by applicable law or agreed to in writing, software
 
11
 * distributed under the License is distributed on an "AS IS" BASIS,
 
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
13
 * See the License for the specific language governing permissions and
 
14
 * limitations under the License.
 
15
 */
 
16
#include <config.h>
 
17
#include <sys/types.h>
 
18
#include "flow.h"
 
19
#include <assert.h>
 
20
#include <errno.h>
 
21
#include <inttypes.h>
 
22
#include <netinet/in.h>
 
23
#include <netinet/icmp6.h>
 
24
#include <netinet/ip6.h>
 
25
#include <stdlib.h>
 
26
#include <string.h>
 
27
#include "byte-order.h"
 
28
#include "coverage.h"
 
29
#include "dynamic-string.h"
 
30
#include "hash.h"
 
31
#include "ofpbuf.h"
 
32
#include "openflow/openflow.h"
 
33
#include "packets.h"
 
34
#include "unaligned.h"
 
35
#include "vlog.h"
 
36
 
 
37
VLOG_DEFINE_THIS_MODULE(flow);
 
38
 
 
39
COVERAGE_DEFINE(flow_extract);
 
40
 
 
41
static struct arp_eth_header *
 
42
pull_arp(struct ofpbuf *packet)
 
43
{
 
44
    return ofpbuf_try_pull(packet, ARP_ETH_HEADER_LEN);
 
45
}
 
46
 
 
47
static struct ip_header *
 
48
pull_ip(struct ofpbuf *packet)
 
49
{
 
50
    if (packet->size >= IP_HEADER_LEN) {
 
51
        struct ip_header *ip = packet->data;
 
52
        int ip_len = IP_IHL(ip->ip_ihl_ver) * 4;
 
53
        if (ip_len >= IP_HEADER_LEN && packet->size >= ip_len) {
 
54
            return ofpbuf_pull(packet, ip_len);
 
55
        }
 
56
    }
 
57
    return NULL;
 
58
}
 
59
 
 
60
static struct tcp_header *
 
61
pull_tcp(struct ofpbuf *packet)
 
62
{
 
63
    if (packet->size >= TCP_HEADER_LEN) {
 
64
        struct tcp_header *tcp = packet->data;
 
65
        int tcp_len = TCP_OFFSET(tcp->tcp_ctl) * 4;
 
66
        if (tcp_len >= TCP_HEADER_LEN && packet->size >= tcp_len) {
 
67
            return ofpbuf_pull(packet, tcp_len);
 
68
        }
 
69
    }
 
70
    return NULL;
 
71
}
 
72
 
 
73
static struct udp_header *
 
74
pull_udp(struct ofpbuf *packet)
 
75
{
 
76
    return ofpbuf_try_pull(packet, UDP_HEADER_LEN);
 
77
}
 
78
 
 
79
static struct icmp_header *
 
80
pull_icmp(struct ofpbuf *packet)
 
81
{
 
82
    return ofpbuf_try_pull(packet, ICMP_HEADER_LEN);
 
83
}
 
84
 
 
85
static struct icmp6_hdr *
 
86
pull_icmpv6(struct ofpbuf *packet)
 
87
{
 
88
    return ofpbuf_try_pull(packet, sizeof(struct icmp6_hdr));
 
89
}
 
90
 
 
91
static void
 
92
parse_vlan(struct ofpbuf *b, struct flow *flow)
 
93
{
 
94
    struct qtag_prefix {
 
95
        ovs_be16 eth_type;      /* ETH_TYPE_VLAN */
 
96
        ovs_be16 tci;
 
97
    };
 
98
 
 
99
    if (b->size >= sizeof(struct qtag_prefix) + sizeof(ovs_be16)) {
 
100
        struct qtag_prefix *qp = ofpbuf_pull(b, sizeof *qp);
 
101
        flow->vlan_tci = qp->tci | htons(VLAN_CFI);
 
102
    }
 
103
}
 
104
 
 
105
static ovs_be16
 
106
parse_ethertype(struct ofpbuf *b)
 
107
{
 
108
    struct llc_snap_header *llc;
 
109
    ovs_be16 proto;
 
110
 
 
111
    proto = *(ovs_be16 *) ofpbuf_pull(b, sizeof proto);
 
112
    if (ntohs(proto) >= ETH_TYPE_MIN) {
 
113
        return proto;
 
114
    }
 
115
 
 
116
    if (b->size < sizeof *llc) {
 
117
        return htons(FLOW_DL_TYPE_NONE);
 
118
    }
 
119
 
 
120
    llc = b->data;
 
121
    if (llc->llc.llc_dsap != LLC_DSAP_SNAP
 
122
        || llc->llc.llc_ssap != LLC_SSAP_SNAP
 
123
        || llc->llc.llc_cntl != LLC_CNTL_SNAP
 
124
        || memcmp(llc->snap.snap_org, SNAP_ORG_ETHERNET,
 
125
                  sizeof llc->snap.snap_org)) {
 
126
        return htons(FLOW_DL_TYPE_NONE);
 
127
    }
 
128
 
 
129
    ofpbuf_pull(b, sizeof *llc);
 
130
    return llc->snap.snap_type;
 
131
}
 
132
 
 
133
static int
 
134
parse_ipv6(struct ofpbuf *packet, struct flow *flow)
 
135
{
 
136
    const struct ip6_hdr *nh;
 
137
    ovs_be32 tc_flow;
 
138
    int nexthdr;
 
139
 
 
140
    nh = ofpbuf_try_pull(packet, sizeof *nh);
 
141
    if (!nh) {
 
142
        return EINVAL;
 
143
    }
 
144
 
 
145
    nexthdr = nh->ip6_nxt;
 
146
 
 
147
    flow->ipv6_src = nh->ip6_src;
 
148
    flow->ipv6_dst = nh->ip6_dst;
 
149
 
 
150
    tc_flow = get_unaligned_be32(&nh->ip6_flow);
 
151
    flow->nw_tos = ntohl(tc_flow) >> 20;
 
152
    flow->ipv6_label = tc_flow & htonl(IPV6_LABEL_MASK);
 
153
    flow->nw_ttl = nh->ip6_hlim;
 
154
    flow->nw_proto = IPPROTO_NONE;
 
155
 
 
156
    while (1) {
 
157
        if ((nexthdr != IPPROTO_HOPOPTS)
 
158
                && (nexthdr != IPPROTO_ROUTING)
 
159
                && (nexthdr != IPPROTO_DSTOPTS)
 
160
                && (nexthdr != IPPROTO_AH)
 
161
                && (nexthdr != IPPROTO_FRAGMENT)) {
 
162
            /* It's either a terminal header (e.g., TCP, UDP) or one we
 
163
             * don't understand.  In either case, we're done with the
 
164
             * packet, so use it to fill in 'nw_proto'. */
 
165
            break;
 
166
        }
 
167
 
 
168
        /* We only verify that at least 8 bytes of the next header are
 
169
         * available, but many of these headers are longer.  Ensure that
 
170
         * accesses within the extension header are within those first 8
 
171
         * bytes. All extension headers are required to be at least 8
 
172
         * bytes. */
 
173
        if (packet->size < 8) {
 
174
            return EINVAL;
 
175
        }
 
176
 
 
177
        if ((nexthdr == IPPROTO_HOPOPTS)
 
178
                || (nexthdr == IPPROTO_ROUTING)
 
179
                || (nexthdr == IPPROTO_DSTOPTS)) {
 
180
            /* These headers, while different, have the fields we care about
 
181
             * in the same location and with the same interpretation. */
 
182
            const struct ip6_ext *ext_hdr = (struct ip6_ext *)packet->data;
 
183
            nexthdr = ext_hdr->ip6e_nxt;
 
184
            if (!ofpbuf_try_pull(packet, (ext_hdr->ip6e_len + 1) * 8)) {
 
185
                return EINVAL;
 
186
            }
 
187
        } else if (nexthdr == IPPROTO_AH) {
 
188
            /* A standard AH definition isn't available, but the fields
 
189
             * we care about are in the same location as the generic
 
190
             * option header--only the header length is calculated
 
191
             * differently. */
 
192
            const struct ip6_ext *ext_hdr = (struct ip6_ext *)packet->data;
 
193
            nexthdr = ext_hdr->ip6e_nxt;
 
194
            if (!ofpbuf_try_pull(packet, (ext_hdr->ip6e_len + 2) * 4)) {
 
195
               return EINVAL;
 
196
            }
 
197
        } else if (nexthdr == IPPROTO_FRAGMENT) {
 
198
            const struct ip6_frag *frag_hdr = (struct ip6_frag *)packet->data;
 
199
 
 
200
            nexthdr = frag_hdr->ip6f_nxt;
 
201
            if (!ofpbuf_try_pull(packet, sizeof *frag_hdr)) {
 
202
                return EINVAL;
 
203
            }
 
204
 
 
205
            /* We only process the first fragment. */
 
206
            flow->nw_frag = FLOW_NW_FRAG_ANY;
 
207
            if ((frag_hdr->ip6f_offlg & IP6F_OFF_MASK) != htons(0)) {
 
208
                flow->nw_frag |= FLOW_NW_FRAG_LATER;
 
209
                nexthdr = IPPROTO_FRAGMENT;
 
210
                break;
 
211
            }
 
212
        }
 
213
    }
 
214
 
 
215
    flow->nw_proto = nexthdr;
 
216
    return 0;
 
217
}
 
218
 
 
219
static void
 
220
parse_tcp(struct ofpbuf *packet, struct ofpbuf *b, struct flow *flow)
 
221
{
 
222
    const struct tcp_header *tcp = pull_tcp(b);
 
223
    if (tcp) {
 
224
        flow->tp_src = tcp->tcp_src;
 
225
        flow->tp_dst = tcp->tcp_dst;
 
226
        packet->l7 = b->data;
 
227
    }
 
228
}
 
229
 
 
230
static void
 
231
parse_udp(struct ofpbuf *packet, struct ofpbuf *b, struct flow *flow)
 
232
{
 
233
    const struct udp_header *udp = pull_udp(b);
 
234
    if (udp) {
 
235
        flow->tp_src = udp->udp_src;
 
236
        flow->tp_dst = udp->udp_dst;
 
237
        packet->l7 = b->data;
 
238
    }
 
239
}
 
240
 
 
241
static bool
 
242
parse_icmpv6(struct ofpbuf *b, struct flow *flow)
 
243
{
 
244
    const struct icmp6_hdr *icmp = pull_icmpv6(b);
 
245
 
 
246
    if (!icmp) {
 
247
        return false;
 
248
    }
 
249
 
 
250
    /* The ICMPv6 type and code fields use the 16-bit transport port
 
251
     * fields, so we need to store them in 16-bit network byte order. */
 
252
    flow->tp_src = htons(icmp->icmp6_type);
 
253
    flow->tp_dst = htons(icmp->icmp6_code);
 
254
 
 
255
    if (icmp->icmp6_code == 0 &&
 
256
        (icmp->icmp6_type == ND_NEIGHBOR_SOLICIT ||
 
257
         icmp->icmp6_type == ND_NEIGHBOR_ADVERT)) {
 
258
        const struct in6_addr *nd_target;
 
259
 
 
260
        nd_target = ofpbuf_try_pull(b, sizeof *nd_target);
 
261
        if (!nd_target) {
 
262
            return false;
 
263
        }
 
264
        flow->nd_target = *nd_target;
 
265
 
 
266
        while (b->size >= 8) {
 
267
            /* The minimum size of an option is 8 bytes, which also is
 
268
             * the size of Ethernet link-layer options. */
 
269
            const struct nd_opt_hdr *nd_opt = b->data;
 
270
            int opt_len = nd_opt->nd_opt_len * 8;
 
271
 
 
272
            if (!opt_len || opt_len > b->size) {
 
273
                goto invalid;
 
274
            }
 
275
 
 
276
            /* Store the link layer address if the appropriate option is
 
277
             * provided.  It is considered an error if the same link
 
278
             * layer option is specified twice. */
 
279
            if (nd_opt->nd_opt_type == ND_OPT_SOURCE_LINKADDR
 
280
                    && opt_len == 8) {
 
281
                if (eth_addr_is_zero(flow->arp_sha)) {
 
282
                    memcpy(flow->arp_sha, nd_opt + 1, ETH_ADDR_LEN);
 
283
                } else {
 
284
                    goto invalid;
 
285
                }
 
286
            } else if (nd_opt->nd_opt_type == ND_OPT_TARGET_LINKADDR
 
287
                    && opt_len == 8) {
 
288
                if (eth_addr_is_zero(flow->arp_tha)) {
 
289
                    memcpy(flow->arp_tha, nd_opt + 1, ETH_ADDR_LEN);
 
290
                } else {
 
291
                    goto invalid;
 
292
                }
 
293
            }
 
294
 
 
295
            if (!ofpbuf_try_pull(b, opt_len)) {
 
296
                goto invalid;
 
297
            }
 
298
        }
 
299
    }
 
300
 
 
301
    return true;
 
302
 
 
303
invalid:
 
304
    memset(&flow->nd_target, 0, sizeof(flow->nd_target));
 
305
    memset(flow->arp_sha, 0, sizeof(flow->arp_sha));
 
306
    memset(flow->arp_tha, 0, sizeof(flow->arp_tha));
 
307
 
 
308
    return false;
 
309
 
 
310
}
 
311
 
 
312
/* Initializes 'flow' members from 'packet', 'tun_id', and 'ofp_in_port'.
 
313
 * Initializes 'packet' header pointers as follows:
 
314
 *
 
315
 *    - packet->l2 to the start of the Ethernet header.
 
316
 *
 
317
 *    - packet->l3 to just past the Ethernet header, or just past the
 
318
 *      vlan_header if one is present, to the first byte of the payload of the
 
319
 *      Ethernet frame.
 
320
 *
 
321
 *    - packet->l4 to just past the IPv4 header, if one is present and has a
 
322
 *      correct length, and otherwise NULL.
 
323
 *
 
324
 *    - packet->l7 to just past the TCP or UDP or ICMP header, if one is
 
325
 *      present and has a correct length, and otherwise NULL.
 
326
 */
 
327
void
 
328
flow_extract(struct ofpbuf *packet, uint32_t priority, ovs_be64 tun_id,
 
329
             uint16_t ofp_in_port, struct flow *flow)
 
330
{
 
331
    struct ofpbuf b = *packet;
 
332
    struct eth_header *eth;
 
333
 
 
334
    COVERAGE_INC(flow_extract);
 
335
 
 
336
    memset(flow, 0, sizeof *flow);
 
337
    flow->tun_id = tun_id;
 
338
    flow->in_port = ofp_in_port;
 
339
    flow->priority = priority;
 
340
 
 
341
    packet->l2 = b.data;
 
342
    packet->l3 = NULL;
 
343
    packet->l4 = NULL;
 
344
    packet->l7 = NULL;
 
345
 
 
346
    if (b.size < sizeof *eth) {
 
347
        return;
 
348
    }
 
349
 
 
350
    /* Link layer. */
 
351
    eth = b.data;
 
352
    memcpy(flow->dl_src, eth->eth_src, ETH_ADDR_LEN);
 
353
    memcpy(flow->dl_dst, eth->eth_dst, ETH_ADDR_LEN);
 
354
 
 
355
    /* dl_type, vlan_tci. */
 
356
    ofpbuf_pull(&b, ETH_ADDR_LEN * 2);
 
357
    if (eth->eth_type == htons(ETH_TYPE_VLAN)) {
 
358
        parse_vlan(&b, flow);
 
359
    }
 
360
    flow->dl_type = parse_ethertype(&b);
 
361
 
 
362
    /* Network layer. */
 
363
    packet->l3 = b.data;
 
364
    if (flow->dl_type == htons(ETH_TYPE_IP)) {
 
365
        const struct ip_header *nh = pull_ip(&b);
 
366
        if (nh) {
 
367
            packet->l4 = b.data;
 
368
 
 
369
            flow->nw_src = get_unaligned_be32(&nh->ip_src);
 
370
            flow->nw_dst = get_unaligned_be32(&nh->ip_dst);
 
371
            flow->nw_proto = nh->ip_proto;
 
372
 
 
373
            flow->nw_tos = nh->ip_tos;
 
374
            if (IP_IS_FRAGMENT(nh->ip_frag_off)) {
 
375
                flow->nw_frag = FLOW_NW_FRAG_ANY;
 
376
                if (nh->ip_frag_off & htons(IP_FRAG_OFF_MASK)) {
 
377
                    flow->nw_frag |= FLOW_NW_FRAG_LATER;
 
378
                }
 
379
            }
 
380
            flow->nw_ttl = nh->ip_ttl;
 
381
 
 
382
            if (!(nh->ip_frag_off & htons(IP_FRAG_OFF_MASK))) {
 
383
                if (flow->nw_proto == IPPROTO_TCP) {
 
384
                    parse_tcp(packet, &b, flow);
 
385
                } else if (flow->nw_proto == IPPROTO_UDP) {
 
386
                    parse_udp(packet, &b, flow);
 
387
                } else if (flow->nw_proto == IPPROTO_ICMP) {
 
388
                    const struct icmp_header *icmp = pull_icmp(&b);
 
389
                    if (icmp) {
 
390
                        flow->tp_src = htons(icmp->icmp_type);
 
391
                        flow->tp_dst = htons(icmp->icmp_code);
 
392
                        packet->l7 = b.data;
 
393
                    }
 
394
                }
 
395
            }
 
396
        }
 
397
    } else if (flow->dl_type == htons(ETH_TYPE_IPV6)) {
 
398
        if (parse_ipv6(&b, flow)) {
 
399
            return;
 
400
        }
 
401
 
 
402
        packet->l4 = b.data;
 
403
        if (flow->nw_proto == IPPROTO_TCP) {
 
404
            parse_tcp(packet, &b, flow);
 
405
        } else if (flow->nw_proto == IPPROTO_UDP) {
 
406
            parse_udp(packet, &b, flow);
 
407
        } else if (flow->nw_proto == IPPROTO_ICMPV6) {
 
408
            if (parse_icmpv6(&b, flow)) {
 
409
                packet->l7 = b.data;
 
410
            }
 
411
        }
 
412
    } else if (flow->dl_type == htons(ETH_TYPE_ARP)) {
 
413
        const struct arp_eth_header *arp = pull_arp(&b);
 
414
        if (arp && arp->ar_hrd == htons(1)
 
415
            && arp->ar_pro == htons(ETH_TYPE_IP)
 
416
            && arp->ar_hln == ETH_ADDR_LEN
 
417
            && arp->ar_pln == 4) {
 
418
            /* We only match on the lower 8 bits of the opcode. */
 
419
            if (ntohs(arp->ar_op) <= 0xff) {
 
420
                flow->nw_proto = ntohs(arp->ar_op);
 
421
            }
 
422
 
 
423
            if ((flow->nw_proto == ARP_OP_REQUEST)
 
424
                || (flow->nw_proto == ARP_OP_REPLY)) {
 
425
                flow->nw_src = arp->ar_spa;
 
426
                flow->nw_dst = arp->ar_tpa;
 
427
                memcpy(flow->arp_sha, arp->ar_sha, ETH_ADDR_LEN);
 
428
                memcpy(flow->arp_tha, arp->ar_tha, ETH_ADDR_LEN);
 
429
            }
 
430
        }
 
431
    }
 
432
}
 
433
 
 
434
/* For every bit of a field that is wildcarded in 'wildcards', sets the
 
435
 * corresponding bit in 'flow' to zero. */
 
436
void
 
437
flow_zero_wildcards(struct flow *flow, const struct flow_wildcards *wildcards)
 
438
{
 
439
    const flow_wildcards_t wc = wildcards->wildcards;
 
440
    int i;
 
441
 
 
442
    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 7);
 
443
 
 
444
    for (i = 0; i < FLOW_N_REGS; i++) {
 
445
        flow->regs[i] &= wildcards->reg_masks[i];
 
446
    }
 
447
    flow->tun_id &= wildcards->tun_id_mask;
 
448
    flow->nw_src &= wildcards->nw_src_mask;
 
449
    flow->nw_dst &= wildcards->nw_dst_mask;
 
450
    if (wc & FWW_IN_PORT) {
 
451
        flow->in_port = 0;
 
452
    }
 
453
    flow->vlan_tci &= wildcards->vlan_tci_mask;
 
454
    if (wc & FWW_DL_TYPE) {
 
455
        flow->dl_type = htons(0);
 
456
    }
 
457
    if (wc & FWW_TP_SRC) {
 
458
        flow->tp_src = htons(0);
 
459
    }
 
460
    if (wc & FWW_TP_DST) {
 
461
        flow->tp_dst = htons(0);
 
462
    }
 
463
    if (wc & FWW_DL_SRC) {
 
464
        memset(flow->dl_src, 0, sizeof flow->dl_src);
 
465
    }
 
466
    if (wc & FWW_DL_DST) {
 
467
        flow->dl_dst[0] &= 0x01;
 
468
        memset(&flow->dl_dst[1], 0, 5);
 
469
    }
 
470
    if (wc & FWW_ETH_MCAST) {
 
471
        flow->dl_dst[0] &= 0xfe;
 
472
    }
 
473
    if (wc & FWW_NW_PROTO) {
 
474
        flow->nw_proto = 0;
 
475
    }
 
476
    if (wc & FWW_IPV6_LABEL) {
 
477
        flow->ipv6_label = htonl(0);
 
478
    }
 
479
    if (wc & FWW_NW_DSCP) {
 
480
        flow->nw_tos &= ~IP_DSCP_MASK;
 
481
    }
 
482
    if (wc & FWW_NW_ECN) {
 
483
        flow->nw_tos &= ~IP_ECN_MASK;
 
484
    }
 
485
    if (wc & FWW_NW_TTL) {
 
486
        flow->nw_ttl = 0;
 
487
    }
 
488
    flow->nw_frag &= wildcards->nw_frag_mask;
 
489
    if (wc & FWW_ARP_SHA) {
 
490
        memset(flow->arp_sha, 0, sizeof flow->arp_sha);
 
491
    }
 
492
    if (wc & FWW_ARP_THA) {
 
493
        memset(flow->arp_tha, 0, sizeof flow->arp_tha);
 
494
    }
 
495
    flow->ipv6_src = ipv6_addr_bitand(&flow->ipv6_src,
 
496
            &wildcards->ipv6_src_mask);
 
497
    flow->ipv6_dst = ipv6_addr_bitand(&flow->ipv6_dst,
 
498
            &wildcards->ipv6_dst_mask);
 
499
    if (wc & FWW_ND_TARGET) {
 
500
        memset(&flow->nd_target, 0, sizeof flow->nd_target);
 
501
    }
 
502
    flow->priority = 0;
 
503
}
 
504
 
 
505
char *
 
506
flow_to_string(const struct flow *flow)
 
507
{
 
508
    struct ds ds = DS_EMPTY_INITIALIZER;
 
509
    flow_format(&ds, flow);
 
510
    return ds_cstr(&ds);
 
511
}
 
512
 
 
513
void
 
514
flow_format(struct ds *ds, const struct flow *flow)
 
515
{
 
516
    ds_put_format(ds, "priority%"PRIu32
 
517
                      ":tunnel%#"PRIx64
 
518
                      ":in_port%04"PRIx16,
 
519
                      flow->priority,
 
520
                      ntohll(flow->tun_id),
 
521
                      flow->in_port);
 
522
 
 
523
    ds_put_format(ds, ":tci(");
 
524
    if (flow->vlan_tci) {
 
525
        ds_put_format(ds, "vlan%"PRIu16",pcp%d",
 
526
                      vlan_tci_to_vid(flow->vlan_tci),
 
527
                      vlan_tci_to_pcp(flow->vlan_tci));
 
528
    } else {
 
529
        ds_put_char(ds, '0');
 
530
    }
 
531
    ds_put_format(ds, ") mac"ETH_ADDR_FMT"->"ETH_ADDR_FMT
 
532
                      " type%04"PRIx16,
 
533
                  ETH_ADDR_ARGS(flow->dl_src),
 
534
                  ETH_ADDR_ARGS(flow->dl_dst),
 
535
                  ntohs(flow->dl_type));
 
536
 
 
537
    if (flow->dl_type == htons(ETH_TYPE_IPV6)) {
 
538
        ds_put_format(ds, " label%#"PRIx32" proto%"PRIu8" tos%#"PRIx8
 
539
                          " ttl%"PRIu8" ipv6",
 
540
                      ntohl(flow->ipv6_label), flow->nw_proto,
 
541
                      flow->nw_tos, flow->nw_ttl);
 
542
        print_ipv6_addr(ds, &flow->ipv6_src);
 
543
        ds_put_cstr(ds, "->");
 
544
        print_ipv6_addr(ds, &flow->ipv6_dst);
 
545
 
 
546
    } else {
 
547
        ds_put_format(ds, " proto%"PRIu8" tos%#"PRIx8" ttl%"PRIu8
 
548
                          " ip"IP_FMT"->"IP_FMT,
 
549
                      flow->nw_proto, flow->nw_tos, flow->nw_ttl,
 
550
                      IP_ARGS(&flow->nw_src), IP_ARGS(&flow->nw_dst));
 
551
    }
 
552
    if (flow->nw_frag) {
 
553
        ds_put_format(ds, " frag(%s)",
 
554
                      flow->nw_frag == FLOW_NW_FRAG_ANY ? "first"
 
555
                      : flow->nw_frag == (FLOW_NW_FRAG_ANY | FLOW_NW_FRAG_LATER)
 
556
                      ? "later" : "<error>");
 
557
    }
 
558
    if (flow->tp_src || flow->tp_dst) {
 
559
        ds_put_format(ds, " port%"PRIu16"->%"PRIu16,
 
560
                ntohs(flow->tp_src), ntohs(flow->tp_dst));
 
561
    }
 
562
    if (!eth_addr_is_zero(flow->arp_sha) || !eth_addr_is_zero(flow->arp_tha)) {
 
563
        ds_put_format(ds, " arp_ha"ETH_ADDR_FMT"->"ETH_ADDR_FMT,
 
564
                ETH_ADDR_ARGS(flow->arp_sha),
 
565
                ETH_ADDR_ARGS(flow->arp_tha));
 
566
    }
 
567
}
 
568
 
 
569
void
 
570
flow_print(FILE *stream, const struct flow *flow)
 
571
{
 
572
    char *s = flow_to_string(flow);
 
573
    fputs(s, stream);
 
574
    free(s);
 
575
}
 
576
 
 
577
/* flow_wildcards functions. */
 
578
 
 
579
/* Initializes 'wc' as a set of wildcards that matches every packet. */
 
580
void
 
581
flow_wildcards_init_catchall(struct flow_wildcards *wc)
 
582
{
 
583
    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 7);
 
584
 
 
585
    wc->wildcards = FWW_ALL;
 
586
    wc->tun_id_mask = htonll(0);
 
587
    wc->nw_src_mask = htonl(0);
 
588
    wc->nw_dst_mask = htonl(0);
 
589
    wc->ipv6_src_mask = in6addr_any;
 
590
    wc->ipv6_dst_mask = in6addr_any;
 
591
    memset(wc->reg_masks, 0, sizeof wc->reg_masks);
 
592
    wc->vlan_tci_mask = htons(0);
 
593
    wc->nw_frag_mask = 0;
 
594
    memset(wc->zeros, 0, sizeof wc->zeros);
 
595
}
 
596
 
 
597
/* Initializes 'wc' as an exact-match set of wildcards; that is, 'wc' does not
 
598
 * wildcard any bits or fields. */
 
599
void
 
600
flow_wildcards_init_exact(struct flow_wildcards *wc)
 
601
{
 
602
    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 7);
 
603
 
 
604
    wc->wildcards = 0;
 
605
    wc->tun_id_mask = htonll(UINT64_MAX);
 
606
    wc->nw_src_mask = htonl(UINT32_MAX);
 
607
    wc->nw_dst_mask = htonl(UINT32_MAX);
 
608
    wc->ipv6_src_mask = in6addr_exact;
 
609
    wc->ipv6_dst_mask = in6addr_exact;
 
610
    memset(wc->reg_masks, 0xff, sizeof wc->reg_masks);
 
611
    wc->vlan_tci_mask = htons(UINT16_MAX);
 
612
    wc->nw_frag_mask = UINT8_MAX;
 
613
    memset(wc->zeros, 0, sizeof wc->zeros);
 
614
}
 
615
 
 
616
/* Returns true if 'wc' is exact-match, false if 'wc' wildcards any bits or
 
617
 * fields. */
 
618
bool
 
619
flow_wildcards_is_exact(const struct flow_wildcards *wc)
 
620
{
 
621
    int i;
 
622
 
 
623
    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 7);
 
624
 
 
625
    if (wc->wildcards
 
626
        || wc->tun_id_mask != htonll(UINT64_MAX)
 
627
        || wc->nw_src_mask != htonl(UINT32_MAX)
 
628
        || wc->nw_dst_mask != htonl(UINT32_MAX)
 
629
        || wc->vlan_tci_mask != htons(UINT16_MAX)
 
630
        || !ipv6_mask_is_exact(&wc->ipv6_src_mask)
 
631
        || !ipv6_mask_is_exact(&wc->ipv6_dst_mask)
 
632
        || wc->nw_frag_mask != UINT8_MAX) {
 
633
        return false;
 
634
    }
 
635
 
 
636
    for (i = 0; i < FLOW_N_REGS; i++) {
 
637
        if (wc->reg_masks[i] != UINT32_MAX) {
 
638
            return false;
 
639
        }
 
640
    }
 
641
 
 
642
    return true;
 
643
}
 
644
 
 
645
/* Returns true if 'wc' matches every packet, false if 'wc' fixes any bits or
 
646
 * fields. */
 
647
bool
 
648
flow_wildcards_is_catchall(const struct flow_wildcards *wc)
 
649
{
 
650
    int i;
 
651
 
 
652
    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 7);
 
653
 
 
654
    if (wc->wildcards != FWW_ALL
 
655
        || wc->tun_id_mask != htonll(0)
 
656
        || wc->nw_src_mask != htonl(0)
 
657
        || wc->nw_dst_mask != htonl(0)
 
658
        || wc->vlan_tci_mask != htons(0)
 
659
        || !ipv6_mask_is_any(&wc->ipv6_src_mask)
 
660
        || !ipv6_mask_is_any(&wc->ipv6_dst_mask)
 
661
        || wc->nw_frag_mask != 0) {
 
662
        return false;
 
663
    }
 
664
 
 
665
    for (i = 0; i < FLOW_N_REGS; i++) {
 
666
        if (wc->reg_masks[i] != 0) {
 
667
            return false;
 
668
        }
 
669
    }
 
670
 
 
671
    return true;
 
672
}
 
673
 
 
674
/* Initializes 'dst' as the combination of wildcards in 'src1' and 'src2'.
 
675
 * That is, a bit or a field is wildcarded in 'dst' if it is wildcarded in
 
676
 * 'src1' or 'src2' or both.  */
 
677
void
 
678
flow_wildcards_combine(struct flow_wildcards *dst,
 
679
                       const struct flow_wildcards *src1,
 
680
                       const struct flow_wildcards *src2)
 
681
{
 
682
    int i;
 
683
 
 
684
    dst->wildcards = src1->wildcards | src2->wildcards;
 
685
    dst->tun_id_mask = src1->tun_id_mask & src2->tun_id_mask;
 
686
    dst->nw_src_mask = src1->nw_src_mask & src2->nw_src_mask;
 
687
    dst->nw_dst_mask = src1->nw_dst_mask & src2->nw_dst_mask;
 
688
    dst->ipv6_src_mask = ipv6_addr_bitand(&src1->ipv6_src_mask,
 
689
                                        &src2->ipv6_src_mask);
 
690
    dst->ipv6_dst_mask = ipv6_addr_bitand(&src1->ipv6_dst_mask,
 
691
                                        &src2->ipv6_dst_mask);
 
692
    for (i = 0; i < FLOW_N_REGS; i++) {
 
693
        dst->reg_masks[i] = src1->reg_masks[i] & src2->reg_masks[i];
 
694
    }
 
695
    dst->vlan_tci_mask = src1->vlan_tci_mask & src2->vlan_tci_mask;
 
696
    dst->nw_frag_mask = src1->nw_frag_mask & src2->nw_frag_mask;
 
697
}
 
698
 
 
699
/* Returns a hash of the wildcards in 'wc'. */
 
700
uint32_t
 
701
flow_wildcards_hash(const struct flow_wildcards *wc, uint32_t basis)
 
702
{
 
703
    /* If you change struct flow_wildcards and thereby trigger this
 
704
     * assertion, please check that the new struct flow_wildcards has no holes
 
705
     * in it before you update the assertion. */
 
706
    BUILD_ASSERT_DECL(sizeof *wc == 60 + FLOW_N_REGS * 4);
 
707
    return hash_bytes(wc, sizeof *wc, basis);
 
708
}
 
709
 
 
710
/* Returns true if 'a' and 'b' represent the same wildcards, false if they are
 
711
 * different. */
 
712
bool
 
713
flow_wildcards_equal(const struct flow_wildcards *a,
 
714
                     const struct flow_wildcards *b)
 
715
{
 
716
    int i;
 
717
 
 
718
    if (a->wildcards != b->wildcards
 
719
        || a->tun_id_mask != b->tun_id_mask
 
720
        || a->nw_src_mask != b->nw_src_mask
 
721
        || a->nw_dst_mask != b->nw_dst_mask
 
722
        || a->vlan_tci_mask != b->vlan_tci_mask
 
723
        || !ipv6_addr_equals(&a->ipv6_src_mask, &b->ipv6_src_mask)
 
724
        || !ipv6_addr_equals(&a->ipv6_dst_mask, &b->ipv6_dst_mask)
 
725
        || a->nw_frag_mask != b->nw_frag_mask) {
 
726
        return false;
 
727
    }
 
728
 
 
729
    for (i = 0; i < FLOW_N_REGS; i++) {
 
730
        if (a->reg_masks[i] != b->reg_masks[i]) {
 
731
            return false;
 
732
        }
 
733
    }
 
734
 
 
735
    return true;
 
736
}
 
737
 
 
738
/* Returns true if at least one bit or field is wildcarded in 'a' but not in
 
739
 * 'b', false otherwise. */
 
740
bool
 
741
flow_wildcards_has_extra(const struct flow_wildcards *a,
 
742
                         const struct flow_wildcards *b)
 
743
{
 
744
    int i;
 
745
    struct in6_addr ipv6_masked;
 
746
 
 
747
    for (i = 0; i < FLOW_N_REGS; i++) {
 
748
        if ((a->reg_masks[i] & b->reg_masks[i]) != b->reg_masks[i]) {
 
749
            return true;
 
750
        }
 
751
    }
 
752
 
 
753
    ipv6_masked = ipv6_addr_bitand(&a->ipv6_src_mask, &b->ipv6_src_mask);
 
754
    if (!ipv6_addr_equals(&ipv6_masked, &b->ipv6_src_mask)) {
 
755
        return true;
 
756
    }
 
757
 
 
758
    ipv6_masked = ipv6_addr_bitand(&a->ipv6_dst_mask, &b->ipv6_dst_mask);
 
759
    if (!ipv6_addr_equals(&ipv6_masked, &b->ipv6_dst_mask)) {
 
760
        return true;
 
761
    }
 
762
 
 
763
    return (a->wildcards & ~b->wildcards
 
764
            || (a->tun_id_mask & b->tun_id_mask) != b->tun_id_mask
 
765
            || (a->nw_src_mask & b->nw_src_mask) != b->nw_src_mask
 
766
            || (a->nw_dst_mask & b->nw_dst_mask) != b->nw_dst_mask
 
767
            || (a->vlan_tci_mask & b->vlan_tci_mask) != b->vlan_tci_mask
 
768
            || (a->nw_frag_mask & b->nw_frag_mask) != b->nw_frag_mask);
 
769
}
 
770
 
 
771
/* Sets the wildcard mask for register 'idx' in 'wc' to 'mask'.
 
772
 * (A 0-bit indicates a wildcard bit.) */
 
773
void
 
774
flow_wildcards_set_reg_mask(struct flow_wildcards *wc, int idx, uint32_t mask)
 
775
{
 
776
    wc->reg_masks[idx] = mask;
 
777
}
 
778
 
 
779
/* Returns the wildcard bitmask for the Ethernet destination address
 
780
 * that 'wc' specifies.  The bitmask has a 0 in each bit that is wildcarded
 
781
 * and a 1 in each bit that must match.  */
 
782
const uint8_t *
 
783
flow_wildcards_to_dl_dst_mask(flow_wildcards_t wc)
 
784
{
 
785
    static const uint8_t    no_wild[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
 
786
    static const uint8_t  addr_wild[] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00};
 
787
    static const uint8_t mcast_wild[] = {0xfe, 0xff, 0xff, 0xff, 0xff, 0xff};
 
788
    static const uint8_t   all_wild[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
 
789
 
 
790
    switch (wc & (FWW_DL_DST | FWW_ETH_MCAST)) {
 
791
    case 0:                             return no_wild;
 
792
    case FWW_DL_DST:                    return addr_wild;
 
793
    case FWW_ETH_MCAST:                 return mcast_wild;
 
794
    case FWW_DL_DST | FWW_ETH_MCAST:    return all_wild;
 
795
    }
 
796
    NOT_REACHED();
 
797
}
 
798
 
 
799
/* Returns true if 'mask' is a valid wildcard bitmask for the Ethernet
 
800
 * destination address.  Valid bitmasks are either all-bits-0 or all-bits-1,
 
801
 * except that the multicast bit may differ from the rest of the bits.  So,
 
802
 * there are four possible valid bitmasks:
 
803
 *
 
804
 *  - 00:00:00:00:00:00
 
805
 *  - 01:00:00:00:00:00
 
806
 *  - fe:ff:ff:ff:ff:ff
 
807
 *  - ff:ff:ff:ff:ff:ff
 
808
 *
 
809
 * All other bitmasks are invalid. */
 
810
bool
 
811
flow_wildcards_is_dl_dst_mask_valid(const uint8_t mask[ETH_ADDR_LEN])
 
812
{
 
813
    switch (mask[0]) {
 
814
    case 0x00:
 
815
    case 0x01:
 
816
        return (mask[1] | mask[2] | mask[3] | mask[4] | mask[5]) == 0x00;
 
817
 
 
818
    case 0xfe:
 
819
    case 0xff:
 
820
        return (mask[1] & mask[2] & mask[3] & mask[4] & mask[5]) == 0xff;
 
821
 
 
822
    default:
 
823
        return false;
 
824
    }
 
825
}
 
826
 
 
827
/* Returns 'wc' with the FWW_DL_DST and FWW_ETH_MCAST bits modified
 
828
 * appropriately to match 'mask'.
 
829
 *
 
830
 * This function will assert-fail if 'mask' is invalid.  Only 'mask' values
 
831
 * accepted by flow_wildcards_is_dl_dst_mask_valid() are allowed. */
 
832
flow_wildcards_t
 
833
flow_wildcards_set_dl_dst_mask(flow_wildcards_t wc,
 
834
                               const uint8_t mask[ETH_ADDR_LEN])
 
835
{
 
836
    assert(flow_wildcards_is_dl_dst_mask_valid(mask));
 
837
 
 
838
    switch (mask[0]) {
 
839
    case 0x00:
 
840
        return wc | FWW_DL_DST | FWW_ETH_MCAST;
 
841
 
 
842
    case 0x01:
 
843
        return (wc | FWW_DL_DST) & ~FWW_ETH_MCAST;
 
844
 
 
845
    case 0xfe:
 
846
        return (wc & ~FWW_DL_DST) | FWW_ETH_MCAST;
 
847
 
 
848
    case 0xff:
 
849
        return wc & ~(FWW_DL_DST | FWW_ETH_MCAST);
 
850
 
 
851
    default:
 
852
        NOT_REACHED();
 
853
    }
 
854
}
 
855
 
 
856
/* Hashes 'flow' based on its L2 through L4 protocol information. */
 
857
uint32_t
 
858
flow_hash_symmetric_l4(const struct flow *flow, uint32_t basis)
 
859
{
 
860
    struct {
 
861
        union {
 
862
            ovs_be32 ipv4_addr;
 
863
            struct in6_addr ipv6_addr;
 
864
        };
 
865
        ovs_be16 eth_type;
 
866
        ovs_be16 vlan_tci;
 
867
        ovs_be16 tp_addr;
 
868
        uint8_t eth_addr[ETH_ADDR_LEN];
 
869
        uint8_t ip_proto;
 
870
    } fields;
 
871
 
 
872
    int i;
 
873
 
 
874
    memset(&fields, 0, sizeof fields);
 
875
    for (i = 0; i < ETH_ADDR_LEN; i++) {
 
876
        fields.eth_addr[i] = flow->dl_src[i] ^ flow->dl_dst[i];
 
877
    }
 
878
    fields.vlan_tci = flow->vlan_tci & htons(VLAN_VID_MASK);
 
879
    fields.eth_type = flow->dl_type;
 
880
 
 
881
    /* UDP source and destination port are not taken into account because they
 
882
     * will not necessarily be symmetric in a bidirectional flow. */
 
883
    if (fields.eth_type == htons(ETH_TYPE_IP)) {
 
884
        fields.ipv4_addr = flow->nw_src ^ flow->nw_dst;
 
885
        fields.ip_proto = flow->nw_proto;
 
886
        if (fields.ip_proto == IPPROTO_TCP) {
 
887
            fields.tp_addr = flow->tp_src ^ flow->tp_dst;
 
888
        }
 
889
    } else if (fields.eth_type == htons(ETH_TYPE_IPV6)) {
 
890
        const uint8_t *a = &flow->ipv6_src.s6_addr[0];
 
891
        const uint8_t *b = &flow->ipv6_dst.s6_addr[0];
 
892
        uint8_t *ipv6_addr = &fields.ipv6_addr.s6_addr[0];
 
893
 
 
894
        for (i=0; i<16; i++) {
 
895
            ipv6_addr[i] = a[i] ^ b[i];
 
896
        }
 
897
        fields.ip_proto = flow->nw_proto;
 
898
        if (fields.ip_proto == IPPROTO_TCP) {
 
899
            fields.tp_addr = flow->tp_src ^ flow->tp_dst;
 
900
        }
 
901
    }
 
902
    return hash_bytes(&fields, sizeof fields, basis);
 
903
}
 
904
 
 
905
/* Hashes the portions of 'flow' designated by 'fields'. */
 
906
uint32_t
 
907
flow_hash_fields(const struct flow *flow, enum nx_hash_fields fields,
 
908
                 uint16_t basis)
 
909
{
 
910
    switch (fields) {
 
911
 
 
912
    case NX_HASH_FIELDS_ETH_SRC:
 
913
        return hash_bytes(flow->dl_src, sizeof flow->dl_src, basis);
 
914
 
 
915
    case NX_HASH_FIELDS_SYMMETRIC_L4:
 
916
        return flow_hash_symmetric_l4(flow, basis);
 
917
    }
 
918
 
 
919
    NOT_REACHED();
 
920
}
 
921
 
 
922
/* Returns a string representation of 'fields'. */
 
923
const char *
 
924
flow_hash_fields_to_str(enum nx_hash_fields fields)
 
925
{
 
926
    switch (fields) {
 
927
    case NX_HASH_FIELDS_ETH_SRC: return "eth_src";
 
928
    case NX_HASH_FIELDS_SYMMETRIC_L4: return "symmetric_l4";
 
929
    default: return "<unknown>";
 
930
    }
 
931
}
 
932
 
 
933
/* Returns true if the value of 'fields' is supported. Otherwise false. */
 
934
bool
 
935
flow_hash_fields_valid(enum nx_hash_fields fields)
 
936
{
 
937
    return fields == NX_HASH_FIELDS_ETH_SRC
 
938
        || fields == NX_HASH_FIELDS_SYMMETRIC_L4;
 
939
}
 
940
 
 
941
/* Sets the VLAN VID that 'flow' matches to 'vid', which is interpreted as an
 
942
 * OpenFlow 1.0 "dl_vlan" value:
 
943
 *
 
944
 *      - If it is in the range 0...4095, 'flow->vlan_tci' is set to match
 
945
 *        that VLAN.  Any existing PCP match is unchanged (it becomes 0 if
 
946
 *        'flow' previously matched packets without a VLAN header).
 
947
 *
 
948
 *      - If it is OFP_VLAN_NONE, 'flow->vlan_tci' is set to match a packet
 
949
 *        without a VLAN tag.
 
950
 *
 
951
 *      - Other values of 'vid' should not be used. */
 
952
void
 
953
flow_set_vlan_vid(struct flow *flow, ovs_be16 vid)
 
954
{
 
955
    if (vid == htons(OFP_VLAN_NONE)) {
 
956
        flow->vlan_tci = htons(0);
 
957
    } else {
 
958
        vid &= htons(VLAN_VID_MASK);
 
959
        flow->vlan_tci &= ~htons(VLAN_VID_MASK);
 
960
        flow->vlan_tci |= htons(VLAN_CFI) | vid;
 
961
    }
 
962
}
 
963
 
 
964
/* Sets the VLAN PCP that 'flow' matches to 'pcp', which should be in the
 
965
 * range 0...7.
 
966
 *
 
967
 * This function has no effect on the VLAN ID that 'flow' matches.
 
968
 *
 
969
 * After calling this function, 'flow' will not match packets without a VLAN
 
970
 * header. */
 
971
void
 
972
flow_set_vlan_pcp(struct flow *flow, uint8_t pcp)
 
973
{
 
974
    pcp &= 0x07;
 
975
    flow->vlan_tci &= ~htons(VLAN_PCP_MASK);
 
976
    flow->vlan_tci |= htons((pcp << VLAN_PCP_SHIFT) | VLAN_CFI);
 
977
}
 
978
 
 
979
/* Puts into 'b' a packet that flow_extract() would parse as having the given
 
980
 * 'flow'.
 
981
 *
 
982
 * (This is useful only for testing, obviously, and the packet isn't really
 
983
 * valid.  It hasn't got any checksums filled in, for one, and lots of fields
 
984
 * are just zeroed.) */
 
985
void
 
986
flow_compose(struct ofpbuf *b, const struct flow *flow)
 
987
{
 
988
    eth_compose(b, flow->dl_dst, flow->dl_src, ntohs(flow->dl_type), 0);
 
989
    if (flow->dl_type == htons(FLOW_DL_TYPE_NONE)) {
 
990
        struct eth_header *eth = b->l2;
 
991
        eth->eth_type = htons(b->size);
 
992
        return;
 
993
    }
 
994
 
 
995
    if (flow->vlan_tci & htons(VLAN_CFI)) {
 
996
        eth_push_vlan(b, flow->vlan_tci & ~htons(VLAN_CFI));
 
997
    }
 
998
 
 
999
    if (flow->dl_type == htons(ETH_TYPE_IP)) {
 
1000
        struct ip_header *ip;
 
1001
 
 
1002
        b->l3 = ip = ofpbuf_put_zeros(b, sizeof *ip);
 
1003
        ip->ip_ihl_ver = IP_IHL_VER(5, 4);
 
1004
        ip->ip_tos = flow->nw_tos;
 
1005
        ip->ip_proto = flow->nw_proto;
 
1006
        ip->ip_src = flow->nw_src;
 
1007
        ip->ip_dst = flow->nw_dst;
 
1008
 
 
1009
        if (flow->nw_frag & FLOW_NW_FRAG_ANY) {
 
1010
            ip->ip_frag_off |= htons(IP_MORE_FRAGMENTS);
 
1011
            if (flow->nw_frag & FLOW_NW_FRAG_LATER) {
 
1012
                ip->ip_frag_off |= htons(100);
 
1013
            }
 
1014
        }
 
1015
        if (!(flow->nw_frag & FLOW_NW_FRAG_ANY)
 
1016
            || !(flow->nw_frag & FLOW_NW_FRAG_LATER)) {
 
1017
            if (flow->nw_proto == IPPROTO_TCP) {
 
1018
                struct tcp_header *tcp;
 
1019
 
 
1020
                b->l4 = tcp = ofpbuf_put_zeros(b, sizeof *tcp);
 
1021
                tcp->tcp_src = flow->tp_src;
 
1022
                tcp->tcp_dst = flow->tp_dst;
 
1023
            } else if (flow->nw_proto == IPPROTO_UDP) {
 
1024
                struct udp_header *udp;
 
1025
 
 
1026
                b->l4 = udp = ofpbuf_put_zeros(b, sizeof *udp);
 
1027
                udp->udp_src = flow->tp_src;
 
1028
                udp->udp_dst = flow->tp_dst;
 
1029
            } else if (flow->nw_proto == IPPROTO_ICMP) {
 
1030
                struct icmp_header *icmp;
 
1031
 
 
1032
                b->l4 = icmp = ofpbuf_put_zeros(b, sizeof *icmp);
 
1033
                icmp->icmp_type = ntohs(flow->tp_src);
 
1034
                icmp->icmp_code = ntohs(flow->tp_dst);
 
1035
            }
 
1036
        }
 
1037
    } else if (flow->dl_type == htons(ETH_TYPE_IPV6)) {
 
1038
        /* XXX */
 
1039
    } else if (flow->dl_type == htons(ETH_TYPE_ARP)) {
 
1040
        struct arp_eth_header *arp;
 
1041
 
 
1042
        b->l3 = arp = ofpbuf_put_zeros(b, sizeof *arp);
 
1043
        arp->ar_hrd = htons(1);
 
1044
        arp->ar_pro = htons(ETH_TYPE_IP);
 
1045
        arp->ar_hln = ETH_ADDR_LEN;
 
1046
        arp->ar_pln = 4;
 
1047
        arp->ar_op = htons(flow->nw_proto);
 
1048
 
 
1049
        if (flow->nw_proto == ARP_OP_REQUEST ||
 
1050
            flow->nw_proto == ARP_OP_REPLY) {
 
1051
            arp->ar_spa = flow->nw_src;
 
1052
            arp->ar_tpa = flow->nw_dst;
 
1053
            memcpy(arp->ar_sha, flow->arp_sha, ETH_ADDR_LEN);
 
1054
            memcpy(arp->ar_tha, flow->arp_tha, ETH_ADDR_LEN);
 
1055
        }
 
1056
    }
 
1057
}