packets: Do not assume that IPv4, TCP, or ARP headers are 32-bit aligned.
[sliver-openvswitch.git] / lib / packets.c
1 /*
2  * Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
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
17 #include <config.h>
18 #include "packets.h"
19 #include <arpa/inet.h>
20 #include <sys/socket.h>
21 #include <netinet/in.h>
22 #include <netinet/ip6.h>
23 #include <stdlib.h>
24 #include "byte-order.h"
25 #include "csum.h"
26 #include "crc32c.h"
27 #include "flow.h"
28 #include "hmap.h"
29 #include "dynamic-string.h"
30 #include "ofpbuf.h"
31 #include "ovs-thread.h"
32 #include "unaligned.h"
33
34 const struct in6_addr in6addr_exact = IN6ADDR_EXACT_INIT;
35
36 /* Parses 's' as a 16-digit hexadecimal number representing a datapath ID.  On
37  * success stores the dpid into '*dpidp' and returns true, on failure stores 0
38  * into '*dpidp' and returns false.
39  *
40  * Rejects an all-zeros dpid as invalid. */
41 bool
42 dpid_from_string(const char *s, uint64_t *dpidp)
43 {
44     *dpidp = (strlen(s) == 16 && strspn(s, "0123456789abcdefABCDEF") == 16
45               ? strtoull(s, NULL, 16)
46               : 0);
47     return *dpidp != 0;
48 }
49
50 /* Returns true if 'ea' is a reserved address, that a bridge must never
51  * forward, false otherwise.
52  *
53  * If you change this function's behavior, please update corresponding
54  * documentation in vswitch.xml at the same time. */
55 bool
56 eth_addr_is_reserved(const uint8_t ea[ETH_ADDR_LEN])
57 {
58     struct eth_addr_node {
59         struct hmap_node hmap_node;
60         const uint64_t ea64;
61     };
62
63     static struct eth_addr_node nodes[] = {
64         /* STP, IEEE pause frames, and other reserved protocols. */
65         { HMAP_NODE_NULL_INITIALIZER, 0x0180c2000000ULL },
66         { HMAP_NODE_NULL_INITIALIZER, 0x0180c2000001ULL },
67         { HMAP_NODE_NULL_INITIALIZER, 0x0180c2000002ULL },
68         { HMAP_NODE_NULL_INITIALIZER, 0x0180c2000003ULL },
69         { HMAP_NODE_NULL_INITIALIZER, 0x0180c2000004ULL },
70         { HMAP_NODE_NULL_INITIALIZER, 0x0180c2000005ULL },
71         { HMAP_NODE_NULL_INITIALIZER, 0x0180c2000006ULL },
72         { HMAP_NODE_NULL_INITIALIZER, 0x0180c2000007ULL },
73         { HMAP_NODE_NULL_INITIALIZER, 0x0180c2000008ULL },
74         { HMAP_NODE_NULL_INITIALIZER, 0x0180c2000009ULL },
75         { HMAP_NODE_NULL_INITIALIZER, 0x0180c200000aULL },
76         { HMAP_NODE_NULL_INITIALIZER, 0x0180c200000bULL },
77         { HMAP_NODE_NULL_INITIALIZER, 0x0180c200000cULL },
78         { HMAP_NODE_NULL_INITIALIZER, 0x0180c200000dULL },
79         { HMAP_NODE_NULL_INITIALIZER, 0x0180c200000eULL },
80         { HMAP_NODE_NULL_INITIALIZER, 0x0180c200000fULL },
81
82         /* Extreme protocols. */
83         { HMAP_NODE_NULL_INITIALIZER, 0x00e02b000000ULL }, /* EDP. */
84         { HMAP_NODE_NULL_INITIALIZER, 0x00e02b000004ULL }, /* EAPS. */
85         { HMAP_NODE_NULL_INITIALIZER, 0x00e02b000006ULL }, /* EAPS. */
86
87         /* Cisco protocols. */
88         { HMAP_NODE_NULL_INITIALIZER, 0x01000c000000ULL }, /* ISL. */
89         { HMAP_NODE_NULL_INITIALIZER, 0x01000cccccccULL }, /* PAgP, UDLD, CDP,
90                                                             * DTP, VTP. */
91         { HMAP_NODE_NULL_INITIALIZER, 0x01000ccccccdULL }, /* PVST+. */
92         { HMAP_NODE_NULL_INITIALIZER, 0x01000ccdcdcdULL }, /* STP Uplink Fast,
93                                                             * FlexLink. */
94
95         /* Cisco CFM. */
96         { HMAP_NODE_NULL_INITIALIZER, 0x01000cccccc0ULL },
97         { HMAP_NODE_NULL_INITIALIZER, 0x01000cccccc1ULL },
98         { HMAP_NODE_NULL_INITIALIZER, 0x01000cccccc2ULL },
99         { HMAP_NODE_NULL_INITIALIZER, 0x01000cccccc3ULL },
100         { HMAP_NODE_NULL_INITIALIZER, 0x01000cccccc4ULL },
101         { HMAP_NODE_NULL_INITIALIZER, 0x01000cccccc5ULL },
102         { HMAP_NODE_NULL_INITIALIZER, 0x01000cccccc6ULL },
103         { HMAP_NODE_NULL_INITIALIZER, 0x01000cccccc7ULL },
104     };
105
106     static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
107     struct eth_addr_node *node;
108     static struct hmap addrs;
109     uint64_t ea64;
110
111     if (ovsthread_once_start(&once)) {
112         hmap_init(&addrs);
113         for (node = nodes; node < &nodes[ARRAY_SIZE(nodes)]; node++) {
114             hmap_insert(&addrs, &node->hmap_node,
115                         hash_2words(node->ea64, node->ea64 >> 32));
116         }
117         ovsthread_once_done(&once);
118     }
119
120     ea64 = eth_addr_to_uint64(ea);
121     HMAP_FOR_EACH_IN_BUCKET (node, hmap_node, hash_2words(ea64, ea64 >> 32),
122                              &addrs) {
123         if (node->ea64 == ea64) {
124             return true;
125         }
126     }
127     return false;
128 }
129
130 bool
131 eth_addr_from_string(const char *s, uint8_t ea[ETH_ADDR_LEN])
132 {
133     if (sscanf(s, ETH_ADDR_SCAN_FMT, ETH_ADDR_SCAN_ARGS(ea))
134         == ETH_ADDR_SCAN_COUNT) {
135         return true;
136     } else {
137         memset(ea, 0, ETH_ADDR_LEN);
138         return false;
139     }
140 }
141
142 /* Fills 'b' with a Reverse ARP packet with Ethernet source address 'eth_src'.
143  * This function is used by Open vSwitch to compose packets in cases where
144  * context is important but content doesn't (or shouldn't) matter.
145  *
146  * The returned packet has enough headroom to insert an 802.1Q VLAN header if
147  * desired. */
148 void
149 compose_rarp(struct ofpbuf *b, const uint8_t eth_src[ETH_ADDR_LEN])
150 {
151     struct eth_header *eth;
152     struct arp_eth_header *arp;
153
154     ofpbuf_clear(b);
155     ofpbuf_prealloc_tailroom(b, ETH_HEADER_LEN + VLAN_HEADER_LEN
156                              + ARP_ETH_HEADER_LEN);
157     ofpbuf_reserve(b, VLAN_HEADER_LEN);
158     eth = ofpbuf_put_uninit(b, sizeof *eth);
159     memcpy(eth->eth_dst, eth_addr_broadcast, ETH_ADDR_LEN);
160     memcpy(eth->eth_src, eth_src, ETH_ADDR_LEN);
161     eth->eth_type = htons(ETH_TYPE_RARP);
162
163     arp = ofpbuf_put_uninit(b, sizeof *arp);
164     arp->ar_hrd = htons(ARP_HRD_ETHERNET);
165     arp->ar_pro = htons(ARP_PRO_IP);
166     arp->ar_hln = sizeof arp->ar_sha;
167     arp->ar_pln = sizeof arp->ar_spa;
168     arp->ar_op = htons(ARP_OP_RARP);
169     memcpy(arp->ar_sha, eth_src, ETH_ADDR_LEN);
170     put_16aligned_be32(&arp->ar_spa, htonl(0));
171     memcpy(arp->ar_tha, eth_src, ETH_ADDR_LEN);
172     put_16aligned_be32(&arp->ar_tpa, htonl(0));
173 }
174
175 /* Insert VLAN header according to given TCI. Packet passed must be Ethernet
176  * packet.  Ignores the CFI bit of 'tci' using 0 instead.
177  *
178  * Also sets 'packet->l2' to point to the new Ethernet header. */
179 void
180 eth_push_vlan(struct ofpbuf *packet, ovs_be16 tci)
181 {
182     struct eth_header *eh = packet->data;
183     struct vlan_eth_header *veh;
184
185     /* Insert new 802.1Q header. */
186     struct vlan_eth_header tmp;
187     memcpy(tmp.veth_dst, eh->eth_dst, ETH_ADDR_LEN);
188     memcpy(tmp.veth_src, eh->eth_src, ETH_ADDR_LEN);
189     tmp.veth_type = htons(ETH_TYPE_VLAN);
190     tmp.veth_tci = tci & htons(~VLAN_CFI);
191     tmp.veth_next_type = eh->eth_type;
192
193     veh = ofpbuf_push_uninit(packet, VLAN_HEADER_LEN);
194     memcpy(veh, &tmp, sizeof tmp);
195
196     packet->l2 = packet->data;
197 }
198
199 /* Removes outermost VLAN header (if any is present) from 'packet'.
200  *
201  * 'packet->l2_5' should initially point to 'packet''s outer-most MPLS header
202  * or may be NULL if there are no MPLS headers. */
203 void
204 eth_pop_vlan(struct ofpbuf *packet)
205 {
206     struct vlan_eth_header *veh = packet->l2;
207     if (packet->size >= sizeof *veh
208         && veh->veth_type == htons(ETH_TYPE_VLAN)) {
209         struct eth_header tmp;
210
211         memcpy(tmp.eth_dst, veh->veth_dst, ETH_ADDR_LEN);
212         memcpy(tmp.eth_src, veh->veth_src, ETH_ADDR_LEN);
213         tmp.eth_type = veh->veth_next_type;
214
215         ofpbuf_pull(packet, VLAN_HEADER_LEN);
216         packet->l2 = (char*)packet->l2 + VLAN_HEADER_LEN;
217         memcpy(packet->data, &tmp, sizeof tmp);
218     }
219 }
220
221 /* Return depth of mpls stack.
222  *
223  * 'packet->l2_5' should initially point to 'packet''s outer-most MPLS header
224  * or may be NULL if there are no MPLS headers. */
225 uint16_t
226 eth_mpls_depth(const struct ofpbuf *packet)
227 {
228     struct mpls_hdr *mh = packet->l2_5;
229     uint16_t depth;
230
231     if (!mh) {
232         return 0;
233     }
234
235     depth = 0;
236     while (packet->size >= ((char *)mh - (char *)packet->data) + sizeof *mh) {
237         depth++;
238         if (mh->mpls_lse & htonl(MPLS_BOS_MASK)) {
239             break;
240         }
241         mh++;
242     }
243
244     return depth;
245 }
246
247 /* Set ethertype of the packet. */
248 void
249 set_ethertype(struct ofpbuf *packet, ovs_be16 eth_type)
250 {
251     struct eth_header *eh = packet->data;
252
253     if (eh->eth_type == htons(ETH_TYPE_VLAN)) {
254         ovs_be16 *p;
255         p = ALIGNED_CAST(ovs_be16 *,
256                 (char *)(packet->l2_5 ? packet->l2_5 : packet->l3) - 2);
257         *p = eth_type;
258     } else {
259         eh->eth_type = eth_type;
260     }
261 }
262
263 static bool is_mpls(struct ofpbuf *packet)
264 {
265     return packet->l2_5 != NULL;
266 }
267
268 /* Set time to live (TTL) of an MPLS label stack entry (LSE). */
269 void
270 set_mpls_lse_ttl(ovs_be32 *lse, uint8_t ttl)
271 {
272     *lse &= ~htonl(MPLS_TTL_MASK);
273     *lse |= htonl((ttl << MPLS_TTL_SHIFT) & MPLS_TTL_MASK);
274 }
275
276 /* Set traffic class (TC) of an MPLS label stack entry (LSE). */
277 void
278 set_mpls_lse_tc(ovs_be32 *lse, uint8_t tc)
279 {
280     *lse &= ~htonl(MPLS_TC_MASK);
281     *lse |= htonl((tc << MPLS_TC_SHIFT) & MPLS_TC_MASK);
282 }
283
284 /* Set label of an MPLS label stack entry (LSE). */
285 void
286 set_mpls_lse_label(ovs_be32 *lse, ovs_be32 label)
287 {
288     *lse &= ~htonl(MPLS_LABEL_MASK);
289     *lse |= htonl((ntohl(label) << MPLS_LABEL_SHIFT) & MPLS_LABEL_MASK);
290 }
291
292 /* Set bottom of stack (BoS) bit of an MPLS label stack entry (LSE). */
293 void
294 set_mpls_lse_bos(ovs_be32 *lse, uint8_t bos)
295 {
296     *lse &= ~htonl(MPLS_BOS_MASK);
297     *lse |= htonl((bos << MPLS_BOS_SHIFT) & MPLS_BOS_MASK);
298 }
299
300 /* Compose an MPLS label stack entry (LSE) from its components:
301  * label, traffic class (TC), time to live (TTL) and
302  * bottom of stack (BoS) bit. */
303 ovs_be32
304 set_mpls_lse_values(uint8_t ttl, uint8_t tc, uint8_t bos, ovs_be32 label)
305 {
306     ovs_be32 lse = htonl(0);
307     set_mpls_lse_ttl(&lse, ttl);
308     set_mpls_lse_tc(&lse, tc);
309     set_mpls_lse_bos(&lse, bos);
310     set_mpls_lse_label(&lse, label);
311     return lse;
312 }
313
314 /* Push an new MPLS stack entry onto the MPLS stack and adjust 'packet->l2' and
315  * 'packet->l2_5' accordingly.  The new entry will be the outermost entry on
316  * the stack.
317  *
318  * Previous to calling this function, 'packet->l2_5' must be set; if the MPLS
319  * label to be pushed will be the first label in 'packet', then it should be
320  * the same as 'packet->l3'. */
321 static void
322 push_mpls_lse(struct ofpbuf *packet, struct mpls_hdr *mh)
323 {
324     char * header;
325     size_t len;
326     header = ofpbuf_push_uninit(packet, MPLS_HLEN);
327     len = (char *)packet->l2_5 - (char *)packet->l2;
328     memmove(header, packet->l2, len);
329     memcpy(header + len, mh, sizeof *mh);
330     packet->l2 = (char*)packet->l2 - MPLS_HLEN;
331     packet->l2_5 = (char*)packet->l2_5 - MPLS_HLEN;
332 }
333
334 /* Set MPLS label stack entry to outermost MPLS header.*/
335 void
336 set_mpls_lse(struct ofpbuf *packet, ovs_be32 mpls_lse)
337 {
338     struct mpls_hdr *mh = packet->l2_5;
339
340     /* Packet type should be MPLS to set label stack entry. */
341     if (is_mpls(packet)) {
342         /* Update mpls label stack entry. */
343         mh->mpls_lse = mpls_lse;
344     }
345 }
346
347 /* Push MPLS label stack entry 'lse' onto 'packet' as the the outermost MPLS
348  * header.  If 'packet' does not already have any MPLS labels, then its
349  * Ethertype is changed to 'ethtype' (which must be an MPLS Ethertype). */
350 void
351 push_mpls(struct ofpbuf *packet, ovs_be16 ethtype, ovs_be32 lse)
352 {
353     struct mpls_hdr mh;
354
355     if (!eth_type_mpls(ethtype)) {
356         return;
357     }
358
359     if (!is_mpls(packet)) {
360         /* Set ethtype and MPLS label stack entry. */
361         set_ethertype(packet, ethtype);
362         packet->l2_5 = packet->l3;
363     }
364
365     /* Push new MPLS shim header onto packet. */
366     mh.mpls_lse = lse;
367     push_mpls_lse(packet, &mh);
368 }
369
370 /* If 'packet' is an MPLS packet, removes its outermost MPLS label stack entry.
371  * If the label that was removed was the only MPLS label, changes 'packet''s
372  * Ethertype to 'ethtype' (which ordinarily should not be an MPLS
373  * Ethertype). */
374 void
375 pop_mpls(struct ofpbuf *packet, ovs_be16 ethtype)
376 {
377     struct mpls_hdr *mh = NULL;
378
379     if (is_mpls(packet)) {
380         size_t len;
381         mh = packet->l2_5;
382         len = (char*)packet->l2_5 - (char*)packet->l2;
383         set_ethertype(packet, ethtype);
384         if (mh->mpls_lse & htonl(MPLS_BOS_MASK)) {
385             packet->l2_5 = NULL;
386         } else {
387             packet->l2_5 = (char*)packet->l2_5 + MPLS_HLEN;
388         }
389         /* Shift the l2 header forward. */
390         memmove((char*)packet->data + MPLS_HLEN, packet->data, len);
391         packet->size -= MPLS_HLEN;
392         packet->data = (char*)packet->data + MPLS_HLEN;
393         packet->l2 = (char*)packet->l2 + MPLS_HLEN;
394     }
395 }
396
397 /* Converts hex digits in 'hex' to an Ethernet packet in '*packetp'.  The
398  * caller must free '*packetp'.  On success, returns NULL.  On failure, returns
399  * an error message and stores NULL in '*packetp'. */
400 const char *
401 eth_from_hex(const char *hex, struct ofpbuf **packetp)
402 {
403     struct ofpbuf *packet;
404
405     packet = *packetp = ofpbuf_new(strlen(hex) / 2);
406
407     if (ofpbuf_put_hex(packet, hex, NULL)[0] != '\0') {
408         ofpbuf_delete(packet);
409         *packetp = NULL;
410         return "Trailing garbage in packet data";
411     }
412
413     if (packet->size < ETH_HEADER_LEN) {
414         ofpbuf_delete(packet);
415         *packetp = NULL;
416         return "Packet data too short for Ethernet";
417     }
418
419     return NULL;
420 }
421
422 void
423 eth_format_masked(const uint8_t eth[ETH_ADDR_LEN],
424                   const uint8_t mask[ETH_ADDR_LEN], struct ds *s)
425 {
426     ds_put_format(s, ETH_ADDR_FMT, ETH_ADDR_ARGS(eth));
427     if (mask && !eth_mask_is_exact(mask)) {
428         ds_put_format(s, "/"ETH_ADDR_FMT, ETH_ADDR_ARGS(mask));
429     }
430 }
431
432 void
433 eth_addr_bitand(const uint8_t src[ETH_ADDR_LEN],
434                 const uint8_t mask[ETH_ADDR_LEN],
435                 uint8_t dst[ETH_ADDR_LEN])
436 {
437     int i;
438
439     for (i = 0; i < ETH_ADDR_LEN; i++) {
440         dst[i] = src[i] & mask[i];
441     }
442 }
443
444 /* Given the IP netmask 'netmask', returns the number of bits of the IP address
445  * that it specifies, that is, the number of 1-bits in 'netmask'.
446  *
447  * If 'netmask' is not a CIDR netmask (see ip_is_cidr()), the return value will
448  * still be in the valid range but isn't otherwise meaningful. */
449 int
450 ip_count_cidr_bits(ovs_be32 netmask)
451 {
452     return 32 - ctz(ntohl(netmask));
453 }
454
455 void
456 ip_format_masked(ovs_be32 ip, ovs_be32 mask, struct ds *s)
457 {
458     ds_put_format(s, IP_FMT, IP_ARGS(ip));
459     if (mask != htonl(UINT32_MAX)) {
460         if (ip_is_cidr(mask)) {
461             ds_put_format(s, "/%d", ip_count_cidr_bits(mask));
462         } else {
463             ds_put_format(s, "/"IP_FMT, IP_ARGS(mask));
464         }
465     }
466 }
467
468
469 /* Stores the string representation of the IPv6 address 'addr' into the
470  * character array 'addr_str', which must be at least INET6_ADDRSTRLEN
471  * bytes long. */
472 void
473 format_ipv6_addr(char *addr_str, const struct in6_addr *addr)
474 {
475     inet_ntop(AF_INET6, addr, addr_str, INET6_ADDRSTRLEN);
476 }
477
478 void
479 print_ipv6_addr(struct ds *string, const struct in6_addr *addr)
480 {
481     char *dst;
482
483     ds_reserve(string, string->length + INET6_ADDRSTRLEN);
484
485     dst = string->string + string->length;
486     format_ipv6_addr(dst, addr);
487     string->length += strlen(dst);
488 }
489
490 void
491 print_ipv6_masked(struct ds *s, const struct in6_addr *addr,
492                   const struct in6_addr *mask)
493 {
494     print_ipv6_addr(s, addr);
495     if (mask && !ipv6_mask_is_exact(mask)) {
496         if (ipv6_is_cidr(mask)) {
497             int cidr_bits = ipv6_count_cidr_bits(mask);
498             ds_put_format(s, "/%d", cidr_bits);
499         } else {
500             ds_put_char(s, '/');
501             print_ipv6_addr(s, mask);
502         }
503     }
504 }
505
506 struct in6_addr ipv6_addr_bitand(const struct in6_addr *a,
507                                  const struct in6_addr *b)
508 {
509     int i;
510     struct in6_addr dst;
511
512 #ifdef s6_addr32
513     for (i=0; i<4; i++) {
514         dst.s6_addr32[i] = a->s6_addr32[i] & b->s6_addr32[i];
515     }
516 #else
517     for (i=0; i<16; i++) {
518         dst.s6_addr[i] = a->s6_addr[i] & b->s6_addr[i];
519     }
520 #endif
521
522     return dst;
523 }
524
525 /* Returns an in6_addr consisting of 'mask' high-order 1-bits and 128-N
526  * low-order 0-bits. */
527 struct in6_addr
528 ipv6_create_mask(int mask)
529 {
530     struct in6_addr netmask;
531     uint8_t *netmaskp = &netmask.s6_addr[0];
532
533     memset(&netmask, 0, sizeof netmask);
534     while (mask > 8) {
535         *netmaskp = 0xff;
536         netmaskp++;
537         mask -= 8;
538     }
539
540     if (mask) {
541         *netmaskp = 0xff << (8 - mask);
542     }
543
544     return netmask;
545 }
546
547 /* Given the IPv6 netmask 'netmask', returns the number of bits of the IPv6
548  * address that it specifies, that is, the number of 1-bits in 'netmask'.
549  * 'netmask' must be a CIDR netmask (see ipv6_is_cidr()).
550  *
551  * If 'netmask' is not a CIDR netmask (see ipv6_is_cidr()), the return value
552  * will still be in the valid range but isn't otherwise meaningful. */
553 int
554 ipv6_count_cidr_bits(const struct in6_addr *netmask)
555 {
556     int i;
557     int count = 0;
558     const uint8_t *netmaskp = &netmask->s6_addr[0];
559
560     for (i=0; i<16; i++) {
561         if (netmaskp[i] == 0xff) {
562             count += 8;
563         } else {
564             uint8_t nm;
565
566             for(nm = netmaskp[i]; nm; nm <<= 1) {
567                 count++;
568             }
569             break;
570         }
571
572     }
573
574     return count;
575 }
576
577 /* Returns true if 'netmask' is a CIDR netmask, that is, if it consists of N
578  * high-order 1-bits and 128-N low-order 0-bits. */
579 bool
580 ipv6_is_cidr(const struct in6_addr *netmask)
581 {
582     const uint8_t *netmaskp = &netmask->s6_addr[0];
583     int i;
584
585     for (i=0; i<16; i++) {
586         if (netmaskp[i] != 0xff) {
587             uint8_t x = ~netmaskp[i];
588             if (x & (x + 1)) {
589                 return false;
590             }
591             while (++i < 16) {
592                 if (netmaskp[i]) {
593                     return false;
594                 }
595             }
596         }
597     }
598
599     return true;
600 }
601
602 /* Populates 'b' with an Ethernet II packet headed with the given 'eth_dst',
603  * 'eth_src' and 'eth_type' parameters.  A payload of 'size' bytes is allocated
604  * in 'b' and returned.  This payload may be populated with appropriate
605  * information by the caller.  Sets 'b''s 'l2' and 'l3' pointers to the
606  * Ethernet header and payload respectively.
607  *
608  * The returned packet has enough headroom to insert an 802.1Q VLAN header if
609  * desired. */
610 void *
611 eth_compose(struct ofpbuf *b, const uint8_t eth_dst[ETH_ADDR_LEN],
612             const uint8_t eth_src[ETH_ADDR_LEN], uint16_t eth_type,
613             size_t size)
614 {
615     void *data;
616     struct eth_header *eth;
617
618     ofpbuf_clear(b);
619
620     ofpbuf_prealloc_tailroom(b, ETH_HEADER_LEN + VLAN_HEADER_LEN + size);
621     ofpbuf_reserve(b, VLAN_HEADER_LEN);
622     eth = ofpbuf_put_uninit(b, ETH_HEADER_LEN);
623     data = ofpbuf_put_uninit(b, size);
624
625     memcpy(eth->eth_dst, eth_dst, ETH_ADDR_LEN);
626     memcpy(eth->eth_src, eth_src, ETH_ADDR_LEN);
627     eth->eth_type = htons(eth_type);
628
629     b->l2 = eth;
630     b->l3 = data;
631
632     return data;
633 }
634
635 static void
636 packet_set_ipv4_addr(struct ofpbuf *packet,
637                      ovs_16aligned_be32 *addr, ovs_be32 new_addr)
638 {
639     struct ip_header *nh = packet->l3;
640     ovs_be32 old_addr = get_16aligned_be32(addr);
641
642     if (nh->ip_proto == IPPROTO_TCP && packet->l7) {
643         struct tcp_header *th = packet->l4;
644
645         th->tcp_csum = recalc_csum32(th->tcp_csum, old_addr, new_addr);
646     } else if (nh->ip_proto == IPPROTO_UDP && packet->l7) {
647         struct udp_header *uh = packet->l4;
648
649         if (uh->udp_csum) {
650             uh->udp_csum = recalc_csum32(uh->udp_csum, old_addr, new_addr);
651             if (!uh->udp_csum) {
652                 uh->udp_csum = htons(0xffff);
653             }
654         }
655     }
656     nh->ip_csum = recalc_csum32(nh->ip_csum, old_addr, new_addr);
657     put_16aligned_be32(addr, new_addr);
658 }
659
660 /* Returns true, if packet contains at least one routing header where
661  * segements_left > 0.
662  *
663  * This function assumes that L3 and L4 markers are set in the packet. */
664 static bool
665 packet_rh_present(struct ofpbuf *packet)
666 {
667     const struct ip6_hdr *nh;
668     int nexthdr;
669     size_t len;
670     size_t remaining;
671     uint8_t *data = packet->l3;
672
673     remaining = (uint8_t *)packet->l4 - (uint8_t *)packet->l3;
674
675     if (remaining < sizeof *nh) {
676         return false;
677     }
678     nh = ALIGNED_CAST(struct ip6_hdr *, data);
679     data += sizeof *nh;
680     remaining -= sizeof *nh;
681     nexthdr = nh->ip6_nxt;
682
683     while (1) {
684         if ((nexthdr != IPPROTO_HOPOPTS)
685                 && (nexthdr != IPPROTO_ROUTING)
686                 && (nexthdr != IPPROTO_DSTOPTS)
687                 && (nexthdr != IPPROTO_AH)
688                 && (nexthdr != IPPROTO_FRAGMENT)) {
689             /* It's either a terminal header (e.g., TCP, UDP) or one we
690              * don't understand.  In either case, we're done with the
691              * packet, so use it to fill in 'nw_proto'. */
692             break;
693         }
694
695         /* We only verify that at least 8 bytes of the next header are
696          * available, but many of these headers are longer.  Ensure that
697          * accesses within the extension header are within those first 8
698          * bytes. All extension headers are required to be at least 8
699          * bytes. */
700         if (remaining < 8) {
701             return false;
702         }
703
704         if (nexthdr == IPPROTO_AH) {
705             /* A standard AH definition isn't available, but the fields
706              * we care about are in the same location as the generic
707              * option header--only the header length is calculated
708              * differently. */
709             const struct ip6_ext *ext_hdr = (struct ip6_ext *)data;
710
711             nexthdr = ext_hdr->ip6e_nxt;
712             len = (ext_hdr->ip6e_len + 2) * 4;
713         } else if (nexthdr == IPPROTO_FRAGMENT) {
714             const struct ip6_frag *frag_hdr = ALIGNED_CAST(struct ip6_frag *,
715                                                            data);
716
717             nexthdr = frag_hdr->ip6f_nxt;
718             len = sizeof *frag_hdr;
719         } else if (nexthdr == IPPROTO_ROUTING) {
720             const struct ip6_rthdr *rh = (struct ip6_rthdr *)data;
721
722             if (rh->ip6r_segleft > 0) {
723                 return true;
724             }
725
726             nexthdr = rh->ip6r_nxt;
727             len = (rh->ip6r_len + 1) * 8;
728         } else {
729             const struct ip6_ext *ext_hdr = (struct ip6_ext *)data;
730
731             nexthdr = ext_hdr->ip6e_nxt;
732             len = (ext_hdr->ip6e_len + 1) * 8;
733         }
734
735         if (remaining < len) {
736             return false;
737         }
738         remaining -= len;
739         data += len;
740     }
741
742     return false;
743 }
744
745 static void
746 packet_update_csum128(struct ofpbuf *packet, uint8_t proto,
747                      ovs_be32 addr[4], const ovs_be32 new_addr[4])
748 {
749     if (proto == IPPROTO_TCP && packet->l7) {
750         struct tcp_header *th = packet->l4;
751
752         th->tcp_csum = recalc_csum128(th->tcp_csum, addr, new_addr);
753     } else if (proto == IPPROTO_UDP && packet->l7) {
754         struct udp_header *uh = packet->l4;
755
756         if (uh->udp_csum) {
757             uh->udp_csum = recalc_csum128(uh->udp_csum, addr, new_addr);
758             if (!uh->udp_csum) {
759                 uh->udp_csum = htons(0xffff);
760             }
761         }
762     }
763 }
764
765 static void
766 packet_set_ipv6_addr(struct ofpbuf *packet, uint8_t proto,
767                      struct in6_addr *addr, const ovs_be32 new_addr[4],
768                      bool recalculate_csum)
769 {
770     if (recalculate_csum) {
771         packet_update_csum128(packet, proto, (ovs_be32 *)addr, new_addr);
772     }
773     memcpy(addr, new_addr, sizeof(*addr));
774 }
775
776 static void
777 packet_set_ipv6_flow_label(ovs_be32 *flow_label, ovs_be32 flow_key)
778 {
779     *flow_label = (*flow_label & htonl(~IPV6_LABEL_MASK)) | flow_key;
780 }
781
782 static void
783 packet_set_ipv6_tc(ovs_be32 *flow_label, uint8_t tc)
784 {
785     *flow_label = (*flow_label & htonl(0xF00FFFFF)) | htonl(tc << 20);
786 }
787
788 /* Modifies the IPv4 header fields of 'packet' to be consistent with 'src',
789  * 'dst', 'tos', and 'ttl'.  Updates 'packet''s L4 checksums as appropriate.
790  * 'packet' must contain a valid IPv4 packet with correctly populated l[347]
791  * markers. */
792 void
793 packet_set_ipv4(struct ofpbuf *packet, ovs_be32 src, ovs_be32 dst,
794                 uint8_t tos, uint8_t ttl)
795 {
796     struct ip_header *nh = packet->l3;
797
798     if (get_16aligned_be32(&nh->ip_src) != src) {
799         packet_set_ipv4_addr(packet, &nh->ip_src, src);
800     }
801
802     if (get_16aligned_be32(&nh->ip_dst) != dst) {
803         packet_set_ipv4_addr(packet, &nh->ip_dst, dst);
804     }
805
806     if (nh->ip_tos != tos) {
807         uint8_t *field = &nh->ip_tos;
808
809         nh->ip_csum = recalc_csum16(nh->ip_csum, htons((uint16_t) *field),
810                                     htons((uint16_t) tos));
811         *field = tos;
812     }
813
814     if (nh->ip_ttl != ttl) {
815         uint8_t *field = &nh->ip_ttl;
816
817         nh->ip_csum = recalc_csum16(nh->ip_csum, htons(*field << 8),
818                                     htons(ttl << 8));
819         *field = ttl;
820     }
821 }
822
823 /* Modifies the IPv6 header fields of 'packet' to be consistent with 'src',
824  * 'dst', 'traffic class', and 'next hop'.  Updates 'packet''s L4 checksums as
825  * appropriate. 'packet' must contain a valid IPv6 packet with correctly
826  * populated l[347] markers. */
827 void
828 packet_set_ipv6(struct ofpbuf *packet, uint8_t proto, const ovs_be32 src[4],
829                 const ovs_be32 dst[4], uint8_t key_tc, ovs_be32 key_fl,
830                 uint8_t key_hl)
831 {
832     struct ip6_hdr *nh = packet->l3;
833
834     if (memcmp(&nh->ip6_src, src, sizeof(ovs_be32[4]))) {
835         packet_set_ipv6_addr(packet, proto, &nh->ip6_src, src, true);
836     }
837
838     if (memcmp(&nh->ip6_dst, dst, sizeof(ovs_be32[4]))) {
839         packet_set_ipv6_addr(packet, proto, &nh->ip6_dst, dst,
840                              !packet_rh_present(packet));
841     }
842
843     packet_set_ipv6_tc(&nh->ip6_flow, key_tc);
844
845     packet_set_ipv6_flow_label(&nh->ip6_flow, key_fl);
846
847     nh->ip6_hlim = key_hl;
848 }
849
850 static void
851 packet_set_port(ovs_be16 *port, ovs_be16 new_port, ovs_be16 *csum)
852 {
853     if (*port != new_port) {
854         *csum = recalc_csum16(*csum, *port, new_port);
855         *port = new_port;
856     }
857 }
858
859 /* Sets the TCP source and destination port ('src' and 'dst' respectively) of
860  * the TCP header contained in 'packet'.  'packet' must be a valid TCP packet
861  * with its l4 marker properly populated. */
862 void
863 packet_set_tcp_port(struct ofpbuf *packet, ovs_be16 src, ovs_be16 dst)
864 {
865     struct tcp_header *th = packet->l4;
866
867     packet_set_port(&th->tcp_src, src, &th->tcp_csum);
868     packet_set_port(&th->tcp_dst, dst, &th->tcp_csum);
869 }
870
871 /* Sets the UDP source and destination port ('src' and 'dst' respectively) of
872  * the UDP header contained in 'packet'.  'packet' must be a valid UDP packet
873  * with its l4 marker properly populated. */
874 void
875 packet_set_udp_port(struct ofpbuf *packet, ovs_be16 src, ovs_be16 dst)
876 {
877     struct udp_header *uh = packet->l4;
878
879     if (uh->udp_csum) {
880         packet_set_port(&uh->udp_src, src, &uh->udp_csum);
881         packet_set_port(&uh->udp_dst, dst, &uh->udp_csum);
882
883         if (!uh->udp_csum) {
884             uh->udp_csum = htons(0xffff);
885         }
886     } else {
887         uh->udp_src = src;
888         uh->udp_dst = dst;
889     }
890 }
891
892 /* Sets the SCTP source and destination port ('src' and 'dst' respectively) of
893  * the SCTP header contained in 'packet'.  'packet' must be a valid SCTP packet
894  * with its l4 marker properly populated. */
895 void
896 packet_set_sctp_port(struct ofpbuf *packet, ovs_be16 src, ovs_be16 dst)
897 {
898     struct sctp_header *sh = packet->l4;
899     ovs_be32 old_csum, old_correct_csum, new_csum;
900     uint16_t tp_len = packet->size - ((uint8_t*)sh - (uint8_t*)packet->data);
901
902     old_csum = sh->sctp_csum;
903     sh->sctp_csum = 0;
904     old_correct_csum = crc32c(packet->l4, tp_len);
905
906     sh->sctp_src = src;
907     sh->sctp_dst = dst;
908
909     new_csum = crc32c(packet->l4, tp_len);
910     sh->sctp_csum = old_csum ^ old_correct_csum ^ new_csum;
911 }
912
913 /* If 'packet' is a TCP packet, returns the TCP flags.  Otherwise, returns 0.
914  *
915  * 'flow' must be the flow corresponding to 'packet' and 'packet''s header
916  * pointers must be properly initialized (e.g. with flow_extract()). */
917 uint8_t
918 packet_get_tcp_flags(const struct ofpbuf *packet, const struct flow *flow)
919 {
920     if (dl_type_is_ip_any(flow->dl_type) &&
921         flow->nw_proto == IPPROTO_TCP && packet->l7) {
922         const struct tcp_header *tcp = packet->l4;
923         return TCP_FLAGS(tcp->tcp_ctl);
924     } else {
925         return 0;
926     }
927 }
928
929 /* Appends a string representation of the TCP flags value 'tcp_flags'
930  * (e.g. obtained via packet_get_tcp_flags() or TCP_FLAGS) to 's', in the
931  * format used by tcpdump. */
932 void
933 packet_format_tcp_flags(struct ds *s, uint8_t tcp_flags)
934 {
935     if (!tcp_flags) {
936         ds_put_cstr(s, "none");
937         return;
938     }
939
940     if (tcp_flags & TCP_SYN) {
941         ds_put_char(s, 'S');
942     }
943     if (tcp_flags & TCP_FIN) {
944         ds_put_char(s, 'F');
945     }
946     if (tcp_flags & TCP_PSH) {
947         ds_put_char(s, 'P');
948     }
949     if (tcp_flags & TCP_RST) {
950         ds_put_char(s, 'R');
951     }
952     if (tcp_flags & TCP_URG) {
953         ds_put_char(s, 'U');
954     }
955     if (tcp_flags & TCP_ACK) {
956         ds_put_char(s, '.');
957     }
958     if (tcp_flags & 0x40) {
959         ds_put_cstr(s, "[40]");
960     }
961     if (tcp_flags & 0x80) {
962         ds_put_cstr(s, "[80]");
963     }
964 }