]>
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> | |
76343538 | 20 | #include <stdlib.h> |
b9e8b45a BP |
21 | #include "ofpbuf.h" |
22 | ||
76343538 BP |
23 | bool |
24 | dpid_from_string(const char *s, uint64_t *dpidp) | |
25 | { | |
b123cc3c | 26 | *dpidp = (strlen(s) == 16 && strspn(s, "0123456789abcdefABCDEF") == 16 |
76343538 BP |
27 | ? strtoll(s, NULL, 16) |
28 | : 0); | |
29 | return *dpidp != 0; | |
30 | } | |
31 | ||
32 | bool | |
33 | eth_addr_from_string(const char *s, uint8_t ea[ETH_ADDR_LEN]) | |
34 | { | |
35 | if (sscanf(s, ETH_ADDR_SCAN_FMT, ETH_ADDR_SCAN_ARGS(ea)) | |
36 | == ETH_ADDR_SCAN_COUNT) { | |
37 | return true; | |
38 | } else { | |
39 | memset(ea, 0, ETH_ADDR_LEN); | |
40 | return false; | |
41 | } | |
42 | } | |
43 | ||
b9e8b45a BP |
44 | /* Fills 'b' with an 802.2 SNAP packet with Ethernet source address 'eth_src', |
45 | * the Nicira OUI as SNAP organization and 'snap_type' as SNAP type. The text | |
46 | * string in 'tag' is enclosed as the packet payload. | |
47 | * | |
48 | * This function is used by Open vSwitch to compose packets in cases where | |
49 | * context is important but content doesn't (or shouldn't) matter. For this | |
50 | * purpose, 'snap_type' should be a random number and 'tag' should be an | |
51 | * English phrase that explains the purpose of the packet. (The English phrase | |
52 | * gives hapless admins running Wireshark the opportunity to figure out what's | |
53 | * going on.) */ | |
54 | void | |
55 | compose_benign_packet(struct ofpbuf *b, const char *tag, uint16_t snap_type, | |
56 | const uint8_t eth_src[ETH_ADDR_LEN]) | |
57 | { | |
58 | struct eth_header *eth; | |
59 | struct llc_snap_header *llc_snap; | |
60 | ||
61 | /* Compose basic packet structure. (We need the payload size to stick into | |
62 | * the 802.2 header.) */ | |
63 | ofpbuf_clear(b); | |
64 | eth = ofpbuf_put_zeros(b, ETH_HEADER_LEN); | |
65 | llc_snap = ofpbuf_put_zeros(b, LLC_SNAP_HEADER_LEN); | |
66 | ofpbuf_put(b, tag, strlen(tag) + 1); /* Includes null byte. */ | |
67 | ofpbuf_put(b, eth_src, ETH_ADDR_LEN); | |
68 | ||
69 | /* Compose 802.2 header. */ | |
70 | memcpy(eth->eth_dst, eth_addr_broadcast, ETH_ADDR_LEN); | |
71 | memcpy(eth->eth_src, eth_src, ETH_ADDR_LEN); | |
72 | eth->eth_type = htons(b->size - ETH_HEADER_LEN); | |
73 | ||
74 | /* Compose LLC, SNAP headers. */ | |
75 | llc_snap->llc.llc_dsap = LLC_DSAP_SNAP; | |
76 | llc_snap->llc.llc_ssap = LLC_SSAP_SNAP; | |
77 | llc_snap->llc.llc_cntl = LLC_CNTL_SNAP; | |
78 | memcpy(llc_snap->snap.snap_org, "\x00\x23\x20", 3); | |
79 | llc_snap->snap.snap_type = htons(snap_type); | |
80 | } |