-
Notifications
You must be signed in to change notification settings - Fork 65
Migration from vnet.Net to transport.Net
This page summarized changes to Pion's virtual network test facility which have been introduced by v2 of the pion/transport module.
The vnet (Virtual NETwork) package was introduced to facilitate integration tests by emulating a network stack in user-space to build. This allowed Pion to be tested against complex network topologies / NAT setups to ensure its correct operation.
It does so my providing alternative implementations of many functions provided by Go's standard net package.
These alternative functions are implemented as methods for a new vnet.Net type:
package vnet
type Net struct {
[...]
v *vNet // internal type to represent the virtual network
}
func (n *Net) ListenUDP(network string, locAddr *net.UDPAddr) (UDPPacketConn, error) {
if n.v == nil {
return net.ListenUDP(network, locAddr)
}
return n.v.listenUDP(network, locAddr)
}
[...]Whether the original net functions or alternative implementation of vnet.Net where used was decided by vnet.Net the presence of the vnet.vNet member.
As the use of Go's standard net functions is widespread throughout the Pion code base, the respective vnet.Net instance needs to be passed to various network-related Pion modules like pion/stun, pion/turn and pion/ice. Ultimately, the Net type is also surfaced by pion/webrtc's SettingEngine.
The initial implementation implemented Net as a struct type whose methods where not an exact mapping of standard net functions.
In v2 of pion/transport introduced a new transport.Net interface to further abstract Pions use of the network stack:
package transport
interface Net {
ListenUDP(network string, locAddr *net.UDPAddr) (UDPPacketConn, error)
[.. All functions of Go's standard net package follow here ..]
}Initially, two implementations are provided for this interface:
-
stdnet.Neta direct mapping to the standardnetpackage, used for production -
vnet.Netthe virtual network used for testing
In many places, Pion will automatically use a stdnet.Net if a nil pointer is provided for transport.Net (e.g. the webrtc SettingEngine).
The new transport.Net interface will allow users to provide their own network stack in the future.
E.g. a virtual network implementation based on stv0g/gont which uses Linux kernel network namespaces rather than a userspace implementation. In its current state vnet.Net only supports UDP sockets. Hence a virtual network implementation based on stv0g/gont could lift this limitation.
In addition, the new new interface is more closely aligned with the function signatures of the net package.
This will allow use to eliminate any remaining direct calls to standard net functions which currently can still be found in some places of the Pion codespace (mainly for name resolution and TCP sockets in pion/ice, pion/turn and pion/dtls).
The Pion developers currently exclude the vnet.Net API from the semantic versioning guarantees as they are considered to be used mainly for debugging and testing and as such not part of the Pion's core API.
Updating your project to the new transport.Net interface is relatively straight forward:
- Upgrade your imports of
pion/transporttopion/transport/v2. - Change all occurrences of the
* vnet.Nettype to the new interfacetransport.Net.
In the long run, all Pion developers are encouraged to fully eliminate any remaining direct calls to the standard net functions.
We can expect to add those functions to the global list of disallowed functions for the Pion project at some point in time.