mirror of
https://github.com/openvswitch/ovs
synced 2025-10-23 14:57:06 +00:00
Add a tun_id field which contains the ID of the encapsulating tunnel on which a packet was received (0 if not received on a tunnel). Also add an action which allows the tunnel ID to be set for outgoing packets. At this point there aren't any tunnel implementations so these fields don't have any effect. The matching is exposed to OpenFlow by overloading the high 32 bits of the cookie as the tunnel ID. ovs-ofctl is capable of turning on this special behavior using a new "tun-cookie" command but this command is intentially undocumented to avoid it being used without a full understanding of the consequences.
93 lines
2.6 KiB
C
93 lines
2.6 KiB
C
/*
|
|
* Copyright (c) 2009, 2010 Nicira Networks.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include <config.h>
|
|
#include "flow.h"
|
|
#include <errno.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "openflow/openflow.h"
|
|
#include "timeval.h"
|
|
#include "ofpbuf.h"
|
|
#include "ofp-print.h"
|
|
#include "pcap.h"
|
|
#include "util.h"
|
|
#include "vlog.h"
|
|
|
|
#undef NDEBUG
|
|
#include <assert.h>
|
|
|
|
int
|
|
main(int argc OVS_UNUSED, char *argv[])
|
|
{
|
|
struct ofp_match expected_match;
|
|
FILE *flows, *pcap;
|
|
int retval;
|
|
int n = 0, errors = 0;
|
|
|
|
set_program_name(argv[0]);
|
|
time_init();
|
|
vlog_init();
|
|
|
|
flows = stdin;
|
|
pcap = fdopen(3, "rb");
|
|
if (!pcap) {
|
|
ovs_fatal(errno, "failed to open fd 3 for reading");
|
|
}
|
|
|
|
retval = pcap_read_header(pcap);
|
|
if (retval) {
|
|
ovs_fatal(retval > 0 ? retval : 0, "reading pcap header failed");
|
|
}
|
|
|
|
while (fread(&expected_match, sizeof expected_match, 1, flows)) {
|
|
struct ofpbuf *packet;
|
|
struct ofp_match extracted_match;
|
|
flow_t flow;
|
|
|
|
n++;
|
|
|
|
retval = pcap_read(pcap, &packet);
|
|
if (retval == EOF) {
|
|
ovs_fatal(0, "unexpected end of file reading pcap file");
|
|
} else if (retval) {
|
|
ovs_fatal(retval, "error reading pcap file");
|
|
}
|
|
|
|
flow_extract(packet, 0, 1, &flow);
|
|
flow_to_match(&flow, 0, false, &extracted_match);
|
|
|
|
if (memcmp(&expected_match, &extracted_match, sizeof expected_match)) {
|
|
char *exp_s = ofp_match_to_string(&expected_match, 2);
|
|
char *got_s = ofp_match_to_string(&extracted_match, 2);
|
|
errors++;
|
|
printf("mismatch on packet #%d (1-based).\n", n);
|
|
printf("Packet:\n");
|
|
ofp_print_packet(stdout, packet->data, packet->size, packet->size);
|
|
printf("Expected flow:\n%s\n", exp_s);
|
|
printf("Actually extracted flow:\n%s\n", got_s);
|
|
printf("\n");
|
|
free(exp_s);
|
|
free(got_s);
|
|
}
|
|
|
|
ofpbuf_delete(packet);
|
|
}
|
|
printf("checked %d packets, %d errors\n", n, errors);
|
|
return errors != 0;
|
|
}
|
|
|