Using a Silicom Dual port Copper Ethernet PCI-E Intel based Bypass Server Adapter (PE2G2BPI) on Ubuntu 16.04

I recently inherited a Silicom PE2G2BPI (Dual port Copper Ethernet PCI-E Intel based Bypass Server Adapter) from a friend, and I wanted to get it working on my Ubuntu 16.04 Server to use as a non-critical firewall.

Here are the steps I took to get it working.

First, find out what it is. I had to look on the side of the card as lspci wasn't very informative.

lspci
01:00.0 Ethernet controller: Silicom Ltd. Silicom Dual port Copper Ethernet PCI-E Intel based Bypass Server Adapter (rev 06)
01:00.1 Ethernet controller: Silicom Ltd. Silicom Dual port Copper Ethernet PCI-E Intel based Bypass Server Adapter (rev 06)

First step was to request access to http://www.silicom-usa.com/download-center/.

https://unix.stackexchange.com/questions/252513/my-ethernet-card-does-not-create-any-ethx-device-how-can-i-solve-it
stackexchange post also contained a set of credentials for access.

I then downloaded ftp://silicom.ftptoday.com/drivers/PxGxBP_Linux.zip, which contained the e1000bp driver I needed.

From there,

unzip PxGxBP_Linux.zip
cd PxGxBP_Linux/Linux/Drivers/Intel_e1000BPe/
tar zxvf e1000bpe-3.3.3.silc.5.60.9.tar.gz
cd e1000bpe-3.3.3.silc.5.60.9
cd src
make clean
make
sudo make install

Add the driver,

sudo modprobe e1000bpe

Now, generate a user-level executable to disable bypass

#Make the library
cd  PxGxBP_Linux/Linux/Libs/User
tar zxvf libbypass-9.0.6.tar.gz
cd libbypass-9.0.6
cd lib
make
sudo make install

#Install the executable
cd  PxGxBP_Linux/Linux/Samples/User
tar zxvf bpctl-9.0.2.tar.gz
cd bpctl-9.0.2
make
sudo make install

Now, get the interface name from /sbin/ifconfig, and disable bypass

bpctl enp1s0f0 set_bypass off

Optionally, re-enable it

bpctl enp1s0f0 set_bypass on

If you get "The interface is a slave interface or doesn't support Bypass.", try another interface on that card, e.g. enp1s0f1->enp1s0f0.

Now, lets make it disable the bypass on ethernet up.

sudo nano /bin/unbypass
#!/bin/bash

/bin/bpctl enp1s0f0 set_bypass off
sudo chmod +x /bin/unbypass

And now,

sudo nano /etc/network/interfaces
auto enp1s0f0
iface enp1s0f0 inet dhcp
pre-up /bin/unbypass

auto enp1s0f1
iface enp1s0f1 inet dhcp
pre-up /bin/unbypass

And now, try rebooting (the computer should boot in bypass mode), and the bypass should turn off when the interface starts.

I hope this helps someone save loads of time trying to get this card working!

As a sidenote, turned out my motherboard didn't have enough current capability in powered-off mode to keep the card happily powered, so there was a small pulsing clicking noise with the leds flashing on the card when the computer was turned off. I solved this by enabling ErP on my gigabyte motherboard which supposedly disables a lot of the on-when-powered-off peripherals and, completely solving my problem.