summaryrefslogtreecommitdiff
path: root/drafts/dell-dock.html
blob: 4be6691ff92b0958de7a181914d838142c539f75 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<h1>Make Your Docking Station Work for You on FreeBSD</h1>

<p class="description">
  Here's the problem. I have a Dell Latitude E-series laptop running FreeBSD
  12.1-RELEASE. I also have a Dell E-Port II docking station on my desk. I
  wanted to be able to take my shut, sleeping laptop and plop it down on the
  docking station, hit the dock power button, and have the laptop wake up and
  switch over to all of the docking station peripherals. All of the USB devices
  did this without any additional work. However, the ethernet hookup, external
  monitor, and speakers all required some additional tinkering. This assumes
  that you're already familiar with wired and wireless network interfaces on
  FreeBSD!
</p>

<h2>Link Aggregation (Failover)</h2>

<p>
  FreeBSD doesn't magically swap from wireless to wired connections by default,
  but there's an easy way to remedy this: link failover. I recommend reading the
  <a href="https://www.freebsd.org/doc/handbook/network-aggregation.html"
    >FreeBSD handbook page on network aggregation</a
  >
  as it's where I found out how to do what I'm about to show you. Basically,
  aggregation lets you bind two of your network interfaces together into a
  single virtual interface. Failover lets your traffic continue moving as long
  as one of the aggregated interfaces has is connected. The steps I had to
  follow are as follows:
</p>

<ul>
  <li>
    Bind the wireless network interface to the MAC address of the wired
    interface
  </li>
  <li>Create a lagg interface using the two network interfaces</li>
  <li>Bind the lagg interface to an IP address, preferably with DHCP</li>
</ul>

<p>All of this is configured in my <code>rc.conf</code>:</p>

<pre><code>
wlans_iwn0="wlan0" # <- wlan0 device should use the iwn driver
ifconfig_wlan0="WPA" # <- wlan0 should use WPA (wpa_supplicant) to connect to wireless SSIDs
create_args_wlan0="wlanaddr 5c:26:0a:06:c1:d6" # <- wlan0 MAC address is set to em0 device MAC address
ifconfig_em0="up" # <- enable em0 (ethernet) device
cloned_interfaces="lagg0" # <- create cloned interface lagg0
ifconfig_lagg0="up laggproto failover laggport em0 laggport wlan0 DHCP" # <- configure lagg0 interface to act as a failover lagg protocol over em0 and wlan0
</code></pre>

<p>
  In practice, the preferred device is <code>em0</code>, or my ethernet NIC.
  FreeBSD will always try to use that first. If it's disconnected, such as when
  the laptop is removed from the dock, the wireless device (<code>wlan0</code>)
  will take over. This transition happens instantly, and without interrupting
  traffic; active transactions aren't cut short for example.
</p>