Ben Pfaff [Mon, 11 Aug 2008 23:24:24 +0000 (16:24 -0700)]
Drop rconn's responsibility for limiting the tx queue.
Now it helps clients track the number of in-flight messages, but lets the
clients do the limiting themselves. This will come in handy for packet-in
rate limiting (in an upcoming commit), in which we want to track in-flight
packet-in messages separately from other in-flight messages.
Ben Pfaff [Tue, 12 Aug 2008 21:41:48 +0000 (14:41 -0700)]
Implement signal-driven time tracking.
Checking the current time only when a periodic timer expires allows us
to reduce the number of system calls to obtain the current time to 10 per
second (from an arbitrary number) plus one per poll loop.
This fixes poll_block() to properly handle being interrupted.
Otherwise, a timeout longer than the interval between signals will never
complete (because it will restart from the beginning after every
signal).
Ben Pfaff [Fri, 8 Aug 2008 22:39:20 +0000 (15:39 -0700)]
Set up flow to drop packets that come in on their output port.
Commit 0a3d4ba3a, "Don't allow the learning switch to send packets back
out the incoming port," drops packets that come in on their incoming port,
but it does not set up a flow to drop those packets. If we are connected
to a hub, then this can be very expensive, since we can continue to get
many packets in that flow and have to drop them in secchan one by one. So
now we set up a flow to drop them for us.
Ben Pfaff [Thu, 7 Aug 2008 22:19:31 +0000 (15:19 -0700)]
Implement OpenFlow hard timeouts.
This updates the OpenFlow protocol version and changes the names of
structure members, so any software that uses OpenFlow will need to be
updated to match.
Ben Pfaff [Tue, 5 Aug 2008 20:05:56 +0000 (13:05 -0700)]
Drop controller-bound traffic that arrives on the controller's port.
Before, if a hub connected a number of OpenFlow switches and the controller,
then in-band control traffic from one of the OpenFlow switches would be
seen by each of the other switches and forwarded up to the controller as
an ofp_packet_in message. That message would then be seen by all of the
other OpenFlow switches and also forwarded, and so on in an infinite loop.
This change prevents this situation by keeping secchan from forwarding
ofp_packet_in messages for a packet destined to the controller that
arrives on the port where the controller is located.
This code has at least two weaknesses. First, if the controller's port
changes, then the flows set up to drop packets will not be deleted. This
should not be a major problem: if this inadvertently kills a switch's
connection to the controller, then the switch will realize it after it
stops receiving data and re-connect. Its new connection will have new
flow data and therefore its packets will not be dropped.
Second, the notion of the "controller's port" does not take into account
the possibility of loops in the network topology. We need spanning tree
protocol for that.
Ben Pfaff [Wed, 30 Jul 2008 22:45:33 +0000 (15:45 -0700)]
netdev: Let netdev_get_in4(), netdev_get_in6() take null pointer argument.
Some callers want to just test whether the device has an address assigned
and don't care about the particular address, so this simplifies those
callers slightly.
Don't allow the learning switch to send packets back out the incoming port.
The learning switch functionality included in OpenFlow will send packets
out the port they arrived on if the learned destination is from that port.
This causes problems when newer switches flood packets for destinations they
don't know and OpenFlow reinjects packets back into the network. The correct
behavior is to just drop the packet.
Ben Pfaff [Tue, 29 Jul 2008 00:29:26 +0000 (17:29 -0700)]
rconn: Reconnect reliably when underlying vconn reports error.
When a vconn reports an error, the rconn would not reliably reconnect.
In particular, if the error was reported after the call to rconn_run()
but before rconn_run_wait() was called, then the state's "run" routine
would not set min_timeout properly, leading to a potentially arbitrarily
long wait (depending on what other events were going on in) until the
state's "run" routine was called again.
The fix is to have a separate per-state "timeout" routine to compute
when the state needs to be re-entered.
This commit was tested using the following change to randomly inject
errors:
Ben Pfaff [Mon, 28 Jul 2008 14:08:38 +0000 (07:08 -0700)]
Be slightly pickier about going into fail-open mode.
Before, the amount of time disconnected was measured relative to the
last time we connected, that is, the last time connect(2) succeeded.
Thus, if we were connected for a long time, and then disconnected,
we would immediately go into fail-open mode.
This change make the disconnected time relative to the last OpenFlow
message received. Thus, if we are connected for a long time and
receive plenty of packets, and then disconnect, there will still be
an opportunity to reconnect before failing open.
Ben Pfaff [Thu, 24 Jul 2008 00:21:58 +0000 (17:21 -0700)]
Don't invoke Debconf from openflow-switch postinst.
This was in there because at one time it seemed desirable to configure
from the postinst, but that idea was abandoned. Now Debconf seems to
be screwing something up somehow, so we might as well not run it at all,
since it wasn't doing anything useful.
Ben Pfaff [Wed, 23 Jul 2008 23:42:05 +0000 (16:42 -0700)]
Fix kdist_clean target in debian/rules.
This fixes "module-assistant auto-install openflow-datapath" for
bootstrapping from a clean environment. (Use "m-a -f purge
openflow-datapath" to test that it works starting from an un-clean
environment.)
Ben Pfaff [Wed, 23 Jul 2008 21:53:06 +0000 (14:53 -0700)]
Only generate private key and certificate request if ssl enabled.
Generating them unconditionally caused a problem with the init script:
the script required there to be a certificate for the private key if
the private key existed, but we do want to allow TCP-only configurations
and always having a private key prevented that.
Also, give the user advice on how to deal with this problem when it
arises in the init script.
Ben Pfaff [Tue, 22 Jul 2008 20:26:03 +0000 (13:26 -0700)]
Add SIGALRM to blockable fatal signals.
We use SIGALRM to limit runtime of dpctl and ofp-discover. There is no
reason that we should not clean up after it in the same way as any other
catchable signal. In particular, ofp-discover wants to restore network
device flags on timeout.
Ben Pfaff [Tue, 22 Jul 2008 21:01:10 +0000 (14:01 -0700)]
dhcp: Make dhcp_msg_to_string() support a multiline format also.
The upcoming ofp-discover program wants to print out the binding
information, and dhcp_msg_to_string() is pretty close to what it
wants. But one-field-per-line is easier for other programs to parse.
Ben Pfaff [Tue, 22 Jul 2008 21:01:01 +0000 (14:01 -0700)]
dhcp: Break out netdev configuration from DHCP binding.
This allows us to have DHCP clients that don't actually bind or unbind
a network device's IP address. This is useful for doing controller
discovery without actually reconfiguring a network device.
Ben Pfaff [Tue, 22 Jul 2008 21:00:03 +0000 (14:00 -0700)]
dhcp: Be more precise about updating 'changed' flag.
There's no need to set changed unconditionally in dhclient_init(), and
it can make extra work for the users of the dhclient, by causing them
to think that something changed when it didn't.
Ben Pfaff [Mon, 21 Jul 2008 21:48:53 +0000 (14:48 -0700)]
Drop use of libtool for libraries.
libtool was needed when NOX was directly linking against libopenflow.
Since it doesn't do that anymore, we can drop its use (and that makes
OpenFlow configure and build slightly faster).
Ben Pfaff [Mon, 21 Jul 2008 21:37:21 +0000 (14:37 -0700)]
Only link programs that need it against OpenSSL.
This keeps vlogconf, in particular, from being linked against OpenSSL,
which in turn keeps the Debian package build tools from complaining that
the openflow-common package shouldn't need to depend on OpenSSL but does
because of the spurious library link.
Ben Pfaff [Mon, 21 Jul 2008 20:54:01 +0000 (13:54 -0700)]
Get rid of unnecessary synchronization in tables.
The table insert and delete functions are already fully serialized
on dp_mutex (and genl_mutex), so there's no need for them to use
additional spinlocks.
Ben Pfaff [Mon, 21 Jul 2008 18:22:28 +0000 (11:22 -0700)]
Properly synchronize dp_dev destruction.
Before, we didn't really synchronize this at all. Now, when we want
to destroy the ofX device, we stop the transmit path and wait for
in-progress transmissions to finish.
Ben Pfaff [Mon, 21 Jul 2008 20:59:10 +0000 (13:59 -0700)]
Simplify use of dp_mutex.
There was little point in taking the dp_mutex farther down in the
code than dp_genl_openflow, since that function is already completely
serialized by genl_rcv across the genl_mutex. We could get rid of
dp_mutex completely, except that we still need it to serialize timeout.
Ben Pfaff [Mon, 21 Jul 2008 20:26:37 +0000 (13:26 -0700)]
Get rid of useless use of rcu_read_lock.
These code paths are fully protected by the Generic Netlink genl_mutex,
which is taken by genl_rcv() that calls dp_genl_openflow(), so there is
no need for them to take the rcu_read_lock.
Ben Pfaff [Thu, 17 Jul 2008 18:58:15 +0000 (11:58 -0700)]
Use an IP ID of 0 for transmitted DHCP packets.
We can't guarantee uniqueness of ip_id versus the host's, screwing up
fragment reassembly, so prevent fragmentation and use an all-zeros
ip_id. RFC 791 doesn't say we can do this, but Linux does the same
thing for DF packets, so it must not screw anything up.