3edfe01a711521f4413df1de345609782e75c535
[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,
116                         hash_2words(node->ea64, node->ea64 >> 32));
117         }
118         ovsthread_once_done(&once);
119     }
120
121     ea64 = eth_addr_to_uint64(ea);
122     HMAP_FOR_EACH_IN_BUCKET (node, hmap_node, hash_2words(ea64, ea64 >> 32),
123                              &addrs) {
124         if (node->ea64 == ea64) {
125             return true;
126         }
127     }
128     return false;
129 }
130
131 bool
132 eth_addr_from_string(const char *s, uint8_t ea[ETH_ADDR_LEN])
133 {
134     if (ovs_scan(s, ETH_ADDR_SCAN_FMT, ETH_ADDR_SCAN_ARGS(ea))) {
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, 2 + ETH_HEADER_LEN + VLAN_HEADER_LEN
156                              + ARP_ETH_HEADER_LEN);
157     ofpbuf_reserve(b, 2 + 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 tpid, 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 = tpid;
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 /* Set ethertype of the packet. */
222 static void
223 set_ethertype(struct ofpbuf *packet, ovs_be16 eth_type)
224 {
225     struct eth_header *eh = packet->data;
226
227     if (eh->eth_type == htons(ETH_TYPE_VLAN)) {
228         ovs_be16 *p;
229         p = ALIGNED_CAST(ovs_be16 *,
230                 (char *)(packet->l2_5 ? packet->l2_5 : packet->l3) - 2);
231         *p = eth_type;
232     } else {
233         eh->eth_type = eth_type;
234     }
235 }
236
237 static bool is_mpls(struct ofpbuf *packet)
238 {
239     return packet->l2_5 != NULL;
240 }
241
242 /* Set time to live (TTL) of an MPLS label stack entry (LSE). */
243 void
244 set_mpls_lse_ttl(ovs_be32 *lse, uint8_t ttl)
245 {
246     *lse &= ~htonl(MPLS_TTL_MASK);
247     *lse |= htonl((ttl << MPLS_TTL_SHIFT) & MPLS_TTL_MASK);
248 }
249
250 /* Set traffic class (TC) of an MPLS label stack entry (LSE). */
251 void
252 set_mpls_lse_tc(ovs_be32 *lse, uint8_t tc)
253 {
254     *lse &= ~htonl(MPLS_TC_MASK);
255     *lse |= htonl((tc << MPLS_TC_SHIFT) & MPLS_TC_MASK);
256 }
257
258 /* Set label of an MPLS label stack entry (LSE). */
259 void
260 set_mpls_lse_label(ovs_be32 *lse, ovs_be32 label)
261 {
262     *lse &= ~htonl(MPLS_LABEL_MASK);
263     *lse |= htonl((ntohl(label) << MPLS_LABEL_SHIFT) & MPLS_LABEL_MASK);
264 }
265
266 /* Set bottom of stack (BoS) bit of an MPLS label stack entry (LSE). */
267 void
268 set_mpls_lse_bos(ovs_be32 *lse, uint8_t bos)
269 {
270     *lse &= ~htonl(MPLS_BOS_MASK);
271     *lse |= htonl((bos << MPLS_BOS_SHIFT) & MPLS_BOS_MASK);
272 }
273
274 /* Compose an MPLS label stack entry (LSE) from its components:
275  * label, traffic class (TC), time to live (TTL) and
276  * bottom of stack (BoS) bit. */
277 ovs_be32
278 set_mpls_lse_values(uint8_t ttl, uint8_t tc, uint8_t bos, ovs_be32 label)
279 {
280     ovs_be32 lse = htonl(0);
281     set_mpls_lse_ttl(&lse, ttl);
282     set_mpls_lse_tc(&lse, tc);
283     set_mpls_lse_bos(&lse, bos);
284     set_mpls_lse_label(&lse, label);
285     return lse;
286 }
287
288 /* Push an new MPLS stack entry onto the MPLS stack and adjust 'packet->l2' and
289  * 'packet->l2_5' accordingly.  The new entry will be the outermost entry on
290  * the stack.
291  *
292  * Previous to calling this function, 'packet->l2_5' must be set; if the MPLS
293  * label to be pushed will be the first label in 'packet', then it should be
294  * the same as 'packet->l3'. */
295 static void
296 push_mpls_lse(struct ofpbuf *packet, struct mpls_hdr *mh)
297 {
298     char * header;
299     size_t len;
300     header = ofpbuf_push_uninit(packet, MPLS_HLEN);
301     len = (char *)packet->l2_5 - (char *)packet->l2;
302     memmove(header, packet->l2, len);
303     memcpy(header + len, mh, sizeof *mh);
304     packet->l2 = (char*)packet->l2 - MPLS_HLEN;
305     packet->l2_5 = (char*)packet->l2_5 - MPLS_HLEN;
306 }
307
308 /* Set MPLS label stack entry to outermost MPLS header.*/
309 void
310 set_mpls_lse(struct ofpbuf *packet, ovs_be32 mpls_lse)
311 {
312     struct mpls_hdr *mh = packet->l2_5;
313
314     /* Packet type should be MPLS to set label stack entry. */
315     if (is_mpls(packet)) {
316         /* Update mpls label stack entry. */
317         mh->mpls_lse = mpls_lse;
318     }
319 }
320
321 /* Push MPLS label stack entry 'lse' onto 'packet' as the the outermost MPLS
322  * header.  If 'packet' does not already have any MPLS labels, then its
323  * Ethertype is changed to 'ethtype' (which must be an MPLS Ethertype). */
324 void
325 push_mpls(struct ofpbuf *packet, ovs_be16 ethtype, ovs_be32 lse)
326 {
327     struct mpls_hdr mh;
328
329     if (!eth_type_mpls(ethtype)) {
330         return;
331     }
332
333     set_ethertype(packet, ethtype);
334
335     if (!is_mpls(packet)) {
336         /* Set MPLS label stack entry. */
337         packet->l2_5 = packet->l3;
338     }
339
340     /* Push new MPLS shim header onto packet. */
341     mh.mpls_lse = lse;
342     push_mpls_lse(packet, &mh);
343 }
344
345 /* If 'packet' is an MPLS packet, removes its outermost MPLS label stack entry.
346  * If the label that was removed was the only MPLS label, changes 'packet''s
347  * Ethertype to 'ethtype' (which ordinarily should not be an MPLS
348  * Ethertype). */
349 void
350 pop_mpls(struct ofpbuf *packet, ovs_be16 ethtype)
351 {
352     struct mpls_hdr *mh = NULL;
353
354     if (is_mpls(packet)) {
355         size_t len;
356         mh = packet->l2_5;
357         len = (char*)packet->l2_5 - (char*)packet->l2;
358         set_ethertype(packet, ethtype);
359         if (mh->mpls_lse & htonl(MPLS_BOS_MASK)) {
360             packet->l2_5 = NULL;
361         } else {
362             packet->l2_5 = (char*)packet->l2_5 + MPLS_HLEN;
363         }
364         /* Shift the l2 header forward. */
365         memmove((char*)packet->data + MPLS_HLEN, packet->data, len);
366         packet->size -= MPLS_HLEN;
367         packet->data = (char*)packet->data + MPLS_HLEN;
368         packet->l2 = (char*)packet->l2 + MPLS_HLEN;
369     }
370 }
371
372 /* Converts hex digits in 'hex' to an Ethernet packet in '*packetp'.  The
373  * caller must free '*packetp'.  On success, returns NULL.  On failure, returns
374  * an error message and stores NULL in '*packetp'.
375  *
376  * Aligns the L3 header of '*packetp' on a 32-bit boundary. */
377 const char *
378 eth_from_hex(const char *hex, struct ofpbuf **packetp)
379 {
380     struct ofpbuf *packet;
381
382     /* Use 2 bytes of headroom to 32-bit align the L3 header. */
383     packet = *packetp = ofpbuf_new_with_headroom(strlen(hex) / 2, 2);
384
385     if (ofpbuf_put_hex(packet, hex, NULL)[0] != '\0') {
386         ofpbuf_delete(packet);
387         *packetp = NULL;
388         return "Trailing garbage in packet data";
389     }
390
391     if (packet->size < ETH_HEADER_LEN) {
392         ofpbuf_delete(packet);
393         *packetp = NULL;
394         return "Packet data too short for Ethernet";
395     }
396
397     return NULL;
398 }
399
400 void
401 eth_format_masked(const uint8_t eth[ETH_ADDR_LEN],
402                   const uint8_t mask[ETH_ADDR_LEN], struct ds *s)
403 {
404     ds_put_format(s, ETH_ADDR_FMT, ETH_ADDR_ARGS(eth));
405     if (mask && !eth_mask_is_exact(mask)) {
406         ds_put_format(s, "/"ETH_ADDR_FMT, ETH_ADDR_ARGS(mask));
407     }
408 }
409
410 void
411 eth_addr_bitand(const uint8_t src[ETH_ADDR_LEN],
412                 const uint8_t mask[ETH_ADDR_LEN],
413                 uint8_t dst[ETH_ADDR_LEN])
414 {
415     int i;
416
417     for (i = 0; i < ETH_ADDR_LEN; i++) {
418         dst[i] = src[i] & mask[i];
419     }
420 }
421
422 /* Given the IP netmask 'netmask', returns the number of bits of the IP address
423  * that it specifies, that is, the number of 1-bits in 'netmask'.
424  *
425  * If 'netmask' is not a CIDR netmask (see ip_is_cidr()), the return value will
426  * still be in the valid range but isn't otherwise meaningful. */
427 int
428 ip_count_cidr_bits(ovs_be32 netmask)
429 {
430     return 32 - ctz32(ntohl(netmask));
431 }
432
433 void
434 ip_format_masked(ovs_be32 ip, ovs_be32 mask, struct ds *s)
435 {
436     ds_put_format(s, IP_FMT, IP_ARGS(ip));
437     if (mask != OVS_BE32_MAX) {
438         if (ip_is_cidr(mask)) {
439             ds_put_format(s, "/%d", ip_count_cidr_bits(mask));
440         } else {
441             ds_put_format(s, "/"IP_FMT, IP_ARGS(mask));
442         }
443     }
444 }
445
446
447 /* Stores the string representation of the IPv6 address 'addr' into the
448  * character array 'addr_str', which must be at least INET6_ADDRSTRLEN
449  * bytes long. */
450 void
451 format_ipv6_addr(char *addr_str, const struct in6_addr *addr)
452 {
453     inet_ntop(AF_INET6, addr, addr_str, INET6_ADDRSTRLEN);
454 }
455
456 void
457 print_ipv6_addr(struct ds *string, const struct in6_addr *addr)
458 {
459     char *dst;
460
461     ds_reserve(string, string->length + INET6_ADDRSTRLEN);
462
463     dst = string->string + string->length;
464     format_ipv6_addr(dst, addr);
465     string->length += strlen(dst);
466 }
467
468 void
469 print_ipv6_masked(struct ds *s, const struct in6_addr *addr,
470                   const struct in6_addr *mask)
471 {
472     print_ipv6_addr(s, addr);
473     if (mask && !ipv6_mask_is_exact(mask)) {
474         if (ipv6_is_cidr(mask)) {
475             int cidr_bits = ipv6_count_cidr_bits(mask);
476             ds_put_format(s, "/%d", cidr_bits);
477         } else {
478             ds_put_char(s, '/');
479             print_ipv6_addr(s, mask);
480         }
481     }
482 }
483
484 struct in6_addr ipv6_addr_bitand(const struct in6_addr *a,
485                                  const struct in6_addr *b)
486 {
487     int i;
488     struct in6_addr dst;
489
490 #ifdef s6_addr32
491     for (i=0; i<4; i++) {
492         dst.s6_addr32[i] = a->s6_addr32[i] & b->s6_addr32[i];
493     }
494 #else
495     for (i=0; i<16; i++) {
496         dst.s6_addr[i] = a->s6_addr[i] & b->s6_addr[i];
497     }
498 #endif
499
500     return dst;
501 }
502
503 /* Returns an in6_addr consisting of 'mask' high-order 1-bits and 128-N
504  * low-order 0-bits. */
505 struct in6_addr
506 ipv6_create_mask(int mask)
507 {
508     struct in6_addr netmask;
509     uint8_t *netmaskp = &netmask.s6_addr[0];
510
511     memset(&netmask, 0, sizeof netmask);
512     while (mask > 8) {
513         *netmaskp = 0xff;
514         netmaskp++;
515         mask -= 8;
516     }
517
518     if (mask) {
519         *netmaskp = 0xff << (8 - mask);
520     }
521
522     return netmask;
523 }
524
525 /* Given the IPv6 netmask 'netmask', returns the number of bits of the IPv6
526  * address that it specifies, that is, the number of 1-bits in 'netmask'.
527  * 'netmask' must be a CIDR netmask (see ipv6_is_cidr()).
528  *
529  * If 'netmask' is not a CIDR netmask (see ipv6_is_cidr()), the return value
530  * will still be in the valid range but isn't otherwise meaningful. */
531 int
532 ipv6_count_cidr_bits(const struct in6_addr *netmask)
533 {
534     int i;
535     int count = 0;
536     const uint8_t *netmaskp = &netmask->s6_addr[0];
537
538     for (i=0; i<16; i++) {
539         if (netmaskp[i] == 0xff) {
540             count += 8;
541         } else {
542             uint8_t nm;
543
544             for(nm = netmaskp[i]; nm; nm <<= 1) {
545                 count++;
546             }
547             break;
548         }
549
550     }
551
552     return count;
553 }
554
555 /* Returns true if 'netmask' is a CIDR netmask, that is, if it consists of N
556  * high-order 1-bits and 128-N low-order 0-bits. */
557 bool
558 ipv6_is_cidr(const struct in6_addr *netmask)
559 {
560     const uint8_t *netmaskp = &netmask->s6_addr[0];
561     int i;
562
563     for (i=0; i<16; i++) {
564         if (netmaskp[i] != 0xff) {
565             uint8_t x = ~netmaskp[i];
566             if (x & (x + 1)) {
567                 return false;
568             }
569             while (++i < 16) {
570                 if (netmaskp[i]) {
571                     return false;
572                 }
573             }
574         }
575     }
576
577     return true;
578 }
579
580 /* Populates 'b' with an Ethernet II packet headed with the given 'eth_dst',
581  * 'eth_src' and 'eth_type' parameters.  A payload of 'size' bytes is allocated
582  * in 'b' and returned.  This payload may be populated with appropriate
583  * information by the caller.  Sets 'b''s 'l2' and 'l3' pointers to the
584  * Ethernet header and payload respectively.  Aligns b->l3 on a 32-bit
585  * boundary.
586  *
587  * The returned packet has enough headroom to insert an 802.1Q VLAN header if
588  * desired. */
589 void *
590 eth_compose(struct ofpbuf *b, const uint8_t eth_dst[ETH_ADDR_LEN],
591             const uint8_t eth_src[ETH_ADDR_LEN], uint16_t eth_type,
592             size_t size)
593 {
594     void *data;
595     struct eth_header *eth;
596
597     ofpbuf_clear(b);
598
599     /* The magic 2 here ensures that the L3 header (when it is added later)
600      * will be 32-bit aligned. */
601     ofpbuf_prealloc_tailroom(b, 2 + ETH_HEADER_LEN + VLAN_HEADER_LEN + size);
602     ofpbuf_reserve(b, 2 + VLAN_HEADER_LEN);
603     eth = ofpbuf_put_uninit(b, ETH_HEADER_LEN);
604     data = ofpbuf_put_uninit(b, size);
605
606     memcpy(eth->eth_dst, eth_dst, ETH_ADDR_LEN);
607     memcpy(eth->eth_src, eth_src, ETH_ADDR_LEN);
608     eth->eth_type = htons(eth_type);
609
610     b->l2 = eth;
611     b->l3 = data;
612
613     return data;
614 }
615
616 static void
617 packet_set_ipv4_addr(struct ofpbuf *packet,
618                      ovs_16aligned_be32 *addr, ovs_be32 new_addr)
619 {
620     struct ip_header *nh = packet->l3;
621     ovs_be32 old_addr = get_16aligned_be32(addr);
622     size_t l4_size = ofpbuf_get_l4_size(packet);
623
624     if (nh->ip_proto == IPPROTO_TCP && l4_size >= TCP_HEADER_LEN) {
625         struct tcp_header *th = packet->l4;
626
627         th->tcp_csum = recalc_csum32(th->tcp_csum, old_addr, new_addr);
628     } else if (nh->ip_proto == IPPROTO_UDP && l4_size >= UDP_HEADER_LEN ) {
629         struct udp_header *uh = packet->l4;
630
631         if (uh->udp_csum) {
632             uh->udp_csum = recalc_csum32(uh->udp_csum, old_addr, new_addr);
633             if (!uh->udp_csum) {
634                 uh->udp_csum = htons(0xffff);
635             }
636         }
637     }
638     nh->ip_csum = recalc_csum32(nh->ip_csum, old_addr, new_addr);
639     put_16aligned_be32(addr, new_addr);
640 }
641
642 /* Returns true, if packet contains at least one routing header where
643  * segements_left > 0.
644  *
645  * This function assumes that L3 and L4 markers are set in the packet. */
646 static bool
647 packet_rh_present(struct ofpbuf *packet)
648 {
649     const struct ovs_16aligned_ip6_hdr *nh;
650     int nexthdr;
651     size_t len;
652     size_t remaining;
653     uint8_t *data = packet->l3;
654
655     remaining = (uint8_t *)packet->l4 - (uint8_t *)packet->l3;
656
657     if (remaining < sizeof *nh) {
658         return false;
659     }
660     nh = ALIGNED_CAST(struct ovs_16aligned_ip6_hdr *, data);
661     data += sizeof *nh;
662     remaining -= sizeof *nh;
663     nexthdr = nh->ip6_nxt;
664
665     while (1) {
666         if ((nexthdr != IPPROTO_HOPOPTS)
667                 && (nexthdr != IPPROTO_ROUTING)
668                 && (nexthdr != IPPROTO_DSTOPTS)
669                 && (nexthdr != IPPROTO_AH)
670                 && (nexthdr != IPPROTO_FRAGMENT)) {
671             /* It's either a terminal header (e.g., TCP, UDP) or one we
672              * don't understand.  In either case, we're done with the
673              * packet, so use it to fill in 'nw_proto'. */
674             break;
675         }
676
677         /* We only verify that at least 8 bytes of the next header are
678          * available, but many of these headers are longer.  Ensure that
679          * accesses within the extension header are within those first 8
680          * bytes. All extension headers are required to be at least 8
681          * bytes. */
682         if (remaining < 8) {
683             return false;
684         }
685
686         if (nexthdr == IPPROTO_AH) {
687             /* A standard AH definition isn't available, but the fields
688              * we care about are in the same location as the generic
689              * option header--only the header length is calculated
690              * differently. */
691             const struct ip6_ext *ext_hdr = (struct ip6_ext *)data;
692
693             nexthdr = ext_hdr->ip6e_nxt;
694             len = (ext_hdr->ip6e_len + 2) * 4;
695         } else if (nexthdr == IPPROTO_FRAGMENT) {
696             const struct ovs_16aligned_ip6_frag *frag_hdr
697                 = ALIGNED_CAST(struct ovs_16aligned_ip6_frag *, data);
698
699             nexthdr = frag_hdr->ip6f_nxt;
700             len = sizeof *frag_hdr;
701         } else if (nexthdr == IPPROTO_ROUTING) {
702             const struct ip6_rthdr *rh = (struct ip6_rthdr *)data;
703
704             if (rh->ip6r_segleft > 0) {
705                 return true;
706             }
707
708             nexthdr = rh->ip6r_nxt;
709             len = (rh->ip6r_len + 1) * 8;
710         } else {
711             const struct ip6_ext *ext_hdr = (struct ip6_ext *)data;
712
713             nexthdr = ext_hdr->ip6e_nxt;
714             len = (ext_hdr->ip6e_len + 1) * 8;
715         }
716
717         if (remaining < len) {
718             return false;
719         }
720         remaining -= len;
721         data += len;
722     }
723
724     return false;
725 }
726
727 static void
728 packet_update_csum128(struct ofpbuf *packet, uint8_t proto,
729                      ovs_16aligned_be32 addr[4], const ovs_be32 new_addr[4])
730 {
731     size_t l4_size = ofpbuf_get_l4_size(packet);
732
733     if (proto == IPPROTO_TCP && l4_size >= TCP_HEADER_LEN) {
734         struct tcp_header *th = packet->l4;
735
736         th->tcp_csum = recalc_csum128(th->tcp_csum, addr, new_addr);
737     } else if (proto == IPPROTO_UDP && l4_size >= UDP_HEADER_LEN) {
738         struct udp_header *uh = packet->l4;
739
740         if (uh->udp_csum) {
741             uh->udp_csum = recalc_csum128(uh->udp_csum, addr, new_addr);
742             if (!uh->udp_csum) {
743                 uh->udp_csum = htons(0xffff);
744             }
745         }
746     }
747 }
748
749 static void
750 packet_set_ipv6_addr(struct ofpbuf *packet, uint8_t proto,
751                      ovs_16aligned_be32 addr[4], const ovs_be32 new_addr[4],
752                      bool recalculate_csum)
753 {
754     if (recalculate_csum) {
755         packet_update_csum128(packet, proto, addr, new_addr);
756     }
757     memcpy(addr, new_addr, sizeof(ovs_be32[4]));
758 }
759
760 static void
761 packet_set_ipv6_flow_label(ovs_16aligned_be32 *flow_label, ovs_be32 flow_key)
762 {
763     ovs_be32 old_label = get_16aligned_be32(flow_label);
764     ovs_be32 new_label = (old_label & htonl(~IPV6_LABEL_MASK)) | flow_key;
765     put_16aligned_be32(flow_label, new_label);
766 }
767
768 static void
769 packet_set_ipv6_tc(ovs_16aligned_be32 *flow_label, uint8_t tc)
770 {
771     ovs_be32 old_label = get_16aligned_be32(flow_label);
772     ovs_be32 new_label = (old_label & htonl(0xF00FFFFF)) | htonl(tc << 20);
773     put_16aligned_be32(flow_label, new_label);
774 }
775
776 /* Modifies the IPv4 header fields of 'packet' to be consistent with 'src',
777  * 'dst', 'tos', and 'ttl'.  Updates 'packet''s L4 checksums as appropriate.
778  * 'packet' must contain a valid IPv4 packet with correctly populated l[347]
779  * markers. */
780 void
781 packet_set_ipv4(struct ofpbuf *packet, ovs_be32 src, ovs_be32 dst,
782                 uint8_t tos, uint8_t ttl)
783 {
784     struct ip_header *nh = packet->l3;
785
786     if (get_16aligned_be32(&nh->ip_src) != src) {
787         packet_set_ipv4_addr(packet, &nh->ip_src, src);
788     }
789
790     if (get_16aligned_be32(&nh->ip_dst) != dst) {
791         packet_set_ipv4_addr(packet, &nh->ip_dst, dst);
792     }
793
794     if (nh->ip_tos != tos) {
795         uint8_t *field = &nh->ip_tos;
796
797         nh->ip_csum = recalc_csum16(nh->ip_csum, htons((uint16_t) *field),
798                                     htons((uint16_t) tos));
799         *field = tos;
800     }
801
802     if (nh->ip_ttl != ttl) {
803         uint8_t *field = &nh->ip_ttl;
804
805         nh->ip_csum = recalc_csum16(nh->ip_csum, htons(*field << 8),
806                                     htons(ttl << 8));
807         *field = ttl;
808     }
809 }
810
811 /* Modifies the IPv6 header fields of 'packet' to be consistent with 'src',
812  * 'dst', 'traffic class', and 'next hop'.  Updates 'packet''s L4 checksums as
813  * appropriate. 'packet' must contain a valid IPv6 packet with correctly
814  * populated l[347] markers. */
815 void
816 packet_set_ipv6(struct ofpbuf *packet, uint8_t proto, const ovs_be32 src[4],
817                 const ovs_be32 dst[4], uint8_t key_tc, ovs_be32 key_fl,
818                 uint8_t key_hl)
819 {
820     struct ovs_16aligned_ip6_hdr *nh = packet->l3;
821
822     if (memcmp(&nh->ip6_src, src, sizeof(ovs_be32[4]))) {
823         packet_set_ipv6_addr(packet, proto, nh->ip6_src.be32, src, true);
824     }
825
826     if (memcmp(&nh->ip6_dst, dst, sizeof(ovs_be32[4]))) {
827         packet_set_ipv6_addr(packet, proto, nh->ip6_dst.be32, dst,
828                              !packet_rh_present(packet));
829     }
830
831     packet_set_ipv6_tc(&nh->ip6_flow, key_tc);
832
833     packet_set_ipv6_flow_label(&nh->ip6_flow, key_fl);
834
835     nh->ip6_hlim = key_hl;
836 }
837
838 static void
839 packet_set_port(ovs_be16 *port, ovs_be16 new_port, ovs_be16 *csum)
840 {
841     if (*port != new_port) {
842         *csum = recalc_csum16(*csum, *port, new_port);
843         *port = new_port;
844     }
845 }
846
847 /* Sets the TCP source and destination port ('src' and 'dst' respectively) of
848  * the TCP header contained in 'packet'.  'packet' must be a valid TCP packet
849  * with its l4 marker properly populated. */
850 void
851 packet_set_tcp_port(struct ofpbuf *packet, ovs_be16 src, ovs_be16 dst)
852 {
853     struct tcp_header *th = packet->l4;
854
855     packet_set_port(&th->tcp_src, src, &th->tcp_csum);
856     packet_set_port(&th->tcp_dst, dst, &th->tcp_csum);
857 }
858
859 /* Sets the UDP source and destination port ('src' and 'dst' respectively) of
860  * the UDP header contained in 'packet'.  'packet' must be a valid UDP packet
861  * with its l4 marker properly populated. */
862 void
863 packet_set_udp_port(struct ofpbuf *packet, ovs_be16 src, ovs_be16 dst)
864 {
865     struct udp_header *uh = packet->l4;
866
867     if (uh->udp_csum) {
868         packet_set_port(&uh->udp_src, src, &uh->udp_csum);
869         packet_set_port(&uh->udp_dst, dst, &uh->udp_csum);
870
871         if (!uh->udp_csum) {
872             uh->udp_csum = htons(0xffff);
873         }
874     } else {
875         uh->udp_src = src;
876         uh->udp_dst = dst;
877     }
878 }
879
880 /* Sets the SCTP source and destination port ('src' and 'dst' respectively) of
881  * the SCTP header contained in 'packet'.  'packet' must be a valid SCTP packet
882  * with its l4 marker properly populated. */
883 void
884 packet_set_sctp_port(struct ofpbuf *packet, ovs_be16 src, ovs_be16 dst)
885 {
886     struct sctp_header *sh = packet->l4;
887     ovs_be32 old_csum, old_correct_csum, new_csum;
888     uint16_t tp_len = packet->size - ((uint8_t*)sh - (uint8_t*)packet->data);
889
890     old_csum = sh->sctp_csum;
891     sh->sctp_csum = 0;
892     old_correct_csum = crc32c(packet->l4, tp_len);
893
894     sh->sctp_src = src;
895     sh->sctp_dst = dst;
896
897     new_csum = crc32c(packet->l4, tp_len);
898     sh->sctp_csum = old_csum ^ old_correct_csum ^ new_csum;
899 }
900
901 const char *
902 packet_tcp_flag_to_string(uint32_t flag)
903 {
904     switch (flag) {
905     case TCP_FIN:
906         return "fin";
907     case TCP_SYN:
908         return "syn";
909     case TCP_RST:
910         return "rst";
911     case TCP_PSH:
912         return "psh";
913     case TCP_ACK:
914         return "ack";
915     case TCP_URG:
916         return "urg";
917     case TCP_ECE:
918         return "ece";
919     case TCP_CWR:
920         return "cwr";
921     case TCP_NS:
922         return "ns";
923     case 0x200:
924         return "[200]";
925     case 0x400:
926         return "[400]";
927     case 0x800:
928         return "[800]";
929     default:
930         return NULL;
931     }
932 }
933
934 /* Appends a string representation of the TCP flags value 'tcp_flags'
935  * (e.g. from struct flow.tcp_flags or obtained via TCP_FLAGS) to 's', in the
936  * format used by tcpdump. */
937 void
938 packet_format_tcp_flags(struct ds *s, uint16_t tcp_flags)
939 {
940     if (!tcp_flags) {
941         ds_put_cstr(s, "none");
942         return;
943     }
944
945     if (tcp_flags & TCP_SYN) {
946         ds_put_char(s, 'S');
947     }
948     if (tcp_flags & TCP_FIN) {
949         ds_put_char(s, 'F');
950     }
951     if (tcp_flags & TCP_PSH) {
952         ds_put_char(s, 'P');
953     }
954     if (tcp_flags & TCP_RST) {
955         ds_put_char(s, 'R');
956     }
957     if (tcp_flags & TCP_URG) {
958         ds_put_char(s, 'U');
959     }
960     if (tcp_flags & TCP_ACK) {
961         ds_put_char(s, '.');
962     }
963     if (tcp_flags & TCP_ECE) {
964         ds_put_cstr(s, "E");
965     }
966     if (tcp_flags & TCP_CWR) {
967         ds_put_cstr(s, "C");
968     }
969     if (tcp_flags & TCP_NS) {
970         ds_put_cstr(s, "N");
971     }
972     if (tcp_flags & 0x200) {
973         ds_put_cstr(s, "[200]");
974     }
975     if (tcp_flags & 0x400) {
976         ds_put_cstr(s, "[400]");
977     }
978     if (tcp_flags & 0x800) {
979         ds_put_cstr(s, "[800]");
980     }
981 }