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