]>
Commit | Line | Data |
---|---|---|
b9e8b45a BP |
1 | /* |
2 | * Copyright (c) 2009 Nicira Networks. | |
3 | * | |
4 | * Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | * you may not use this file except in compliance with the License. | |
6 | * You may obtain a copy of the License at: | |
7 | * | |
8 | * http://www.apache.org/licenses/LICENSE-2.0 | |
9 | * | |
10 | * Unless required by applicable law or agreed to in writing, software | |
11 | * distributed under the License is distributed on an "AS IS" BASIS, | |
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | * See the License for the specific language governing permissions and | |
14 | * limitations under the License. | |
15 | */ | |
16 | ||
17 | #include <config.h> | |
18 | #include "packets.h" | |
19 | #include <netinet/in.h> | |
20 | #include "ofpbuf.h" | |
21 | ||
22 | /* Fills 'b' with an 802.2 SNAP packet with Ethernet source address 'eth_src', | |
23 | * the Nicira OUI as SNAP organization and 'snap_type' as SNAP type. The text | |
24 | * string in 'tag' is enclosed as the packet payload. | |
25 | * | |
26 | * This function is used by Open vSwitch to compose packets in cases where | |
27 | * context is important but content doesn't (or shouldn't) matter. For this | |
28 | * purpose, 'snap_type' should be a random number and 'tag' should be an | |
29 | * English phrase that explains the purpose of the packet. (The English phrase | |
30 | * gives hapless admins running Wireshark the opportunity to figure out what's | |
31 | * going on.) */ | |
32 | void | |
33 | compose_benign_packet(struct ofpbuf *b, const char *tag, uint16_t snap_type, | |
34 | const uint8_t eth_src[ETH_ADDR_LEN]) | |
35 | { | |
36 | struct eth_header *eth; | |
37 | struct llc_snap_header *llc_snap; | |
38 | ||
39 | /* Compose basic packet structure. (We need the payload size to stick into | |
40 | * the 802.2 header.) */ | |
41 | ofpbuf_clear(b); | |
42 | eth = ofpbuf_put_zeros(b, ETH_HEADER_LEN); | |
43 | llc_snap = ofpbuf_put_zeros(b, LLC_SNAP_HEADER_LEN); | |
44 | ofpbuf_put(b, tag, strlen(tag) + 1); /* Includes null byte. */ | |
45 | ofpbuf_put(b, eth_src, ETH_ADDR_LEN); | |
46 | ||
47 | /* Compose 802.2 header. */ | |
48 | memcpy(eth->eth_dst, eth_addr_broadcast, ETH_ADDR_LEN); | |
49 | memcpy(eth->eth_src, eth_src, ETH_ADDR_LEN); | |
50 | eth->eth_type = htons(b->size - ETH_HEADER_LEN); | |
51 | ||
52 | /* Compose LLC, SNAP headers. */ | |
53 | llc_snap->llc.llc_dsap = LLC_DSAP_SNAP; | |
54 | llc_snap->llc.llc_ssap = LLC_SSAP_SNAP; | |
55 | llc_snap->llc.llc_cntl = LLC_CNTL_SNAP; | |
56 | memcpy(llc_snap->snap.snap_org, "\x00\x23\x20", 3); | |
57 | llc_snap->snap.snap_type = htons(snap_type); | |
58 | } |