blob: 3f09c5668689bea901014c05eeec6486a4389315 [file] [log] [blame]
.. vim: syntax=rst
Aether-in-a-Box on Hardware Radios
==================================
This document describes how to set up an Aether-in-a-Box (AiaB) with
a Sercomm eNodeB and connect real devices (e.g., 4G phones). It assumes that
you are already familiar with running AiaB with emulated eNodeB/UE. AiaB on Hardware
Radios is suitable for laboratory experiments and proof-of-concept deployments.
Its goals are to demonstrate how to configure a real eNodeB to work with Aether,
and to provide an easy-to-install environment where Aether's features can be
explored with real devices. To create this setup you will need the following equipment:
* Server for running AiaB (SD-CORE / UPF / ROC)
* Haswell CPU family or newer
* At least 4 CPUs and 12GB RAM
* Internet connection
* 4G or 5G small cell eNodeB
* Example: :ref:`Sercomm CBRS LTE small cell eNodeB <edge_deployment/overview:eNB Radio>`
* SIM card writer and blank SIM cards
**IMPORTANT**: AiaB is for simple deployment scenarios and so makes some simplifying assumptions:
* AiaB assumes either 4G or 5G SD-CORE is deployed. Running both 4G and 5G SD-CORE simultaneously in AiaB
is currently not supported. However, running both 4G and 5G SD-CORE simultaneously is supported by Aether.
* Performance and scalability are not goals. AiaB does not support I/O acceleration (e.g., with SR-IOV). However,
performance and scalability are goals of the Aether project.
* AiaB assumes that the server and the eNodeB are connected to the **same LAN** and
share the **same IP subnet**; in other words they can reach each other in a single hop and
there is no IP router between them. This simplifies communication between the eNodeB and the UPF,
which is running inside a container and has a private IP address that is not necessarily routable
on the local network. However, this is not a requirement for all Aether deployments.
* AiaB also assumes that the AiaB server's network is configured
using *systemd-networkd*, which is the default for Ubuntu, and copies some files into `/etc/systemd/network`;
the reason for this is to enable persistence of AiaB's networking configuration across server reboots.
This configuration method is specific to AiaB.
Preparation
-----------
Create SIM cards by following the instructions for your SIM card writer.
Of course you are free to use any values for IMSI, etc. that you choose,
but these are the values that will work with the rest of the configuration
in this document:
* IMSI: each one is unique, matching pattern ``315010*********`` (15 digits)
* OPc: ``69d5c2eb2e2e624750541d3bbc692ba5``
* Transport Key: ``000102030405060708090a0b0c0d0e0f``
If you choose different values for your SIM cards, you will need to
modify subsequent configuration steps appropriately.
Insert the SIM cards in devices that you wish to be able to connect to the Aether network.
Server setup
------------
The server will run Aether-in-a-Box. The eNodeB will connect to the server over the local network.
Perform these steps to prepare the server for the AiaB install:
* Connect the server to the local network
* Perform a clean install of Ubuntu 18.04 or Ubuntu 20.04 on the server
* Verify that systemd-networkd is being used to configure networking
(e.g., run ``systemctl status systemd-networkd.service``)
* Set up password-less sudo for the user that will install Aether-in-a-Box
After the steps above have been completed, install Aether-in-a-Box as follows::
sudo apt install git make
git clone "https://gerrit.opencord.org/aether-in-a-box"
cd aether-in-a-box
Next, modify the file *sd-core-4g-values.yaml*. Under ``subscribers``,
add an IMSI range for the SIM cards you created, with the Transport Key
and OPc values you used earlier. For example, the following will add
IMSIs between 315010999912301 and 315010999912303::
subscribers:
- ueId-start: 315010999912301
ueId-end: 315010999912303
plmnId: 315010
opc: 69d5c2eb2e2e624750541d3bbc692ba5
key: 000102030405060708090a0b0c0d0e0f
sequenceNumber: 135
Determine which is the interface that has L3 connectivity to the
eNodeB -- this will be ``DATA_IFACE`` in the configuration later. If
the eNodeB will also be connected to the local network, then this is just the
server's primary interface. If the eNodeB will be connected via an
isolated L2/L3 network segment, then ``DATA_IFACE`` refers to the server
interface on that network. Remember this interface for later.
Option 1: Configure Aether with ROC
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The Aether ROC provides a GUI and API for dynamically configuring
Aether. If you don't wish to use the ROC to configure AiaB, you
can skip to the next section.
Install AiaB as follows (specifying ``DATA_IFACE`` from above)::
ENABLE_OAISIM=false DATA_IFACE=<iface> CHARTS=latest make roc-4g-models 4g-core
Next, use the ROC to add information about your SIM cards.
The ROC GUI is available at `http://<server-ip>:31194`.
Choose ``Configuration > Site`` from the drop-down at top right and edit
the ``AiaB site``. Change the following values and click ``Update``:
* MCC: 315
* MNC: 010
Choose ``Sim Cards`` from the drop-down at top right. Edit the
existing entries to reflect the SIM cards you are adding to devices
by replacing their IMSI values. Click ``Update`` after each edit.
If you want to connect more than two devices, consult the :ref:`ROC
documentation <operations/subscriber:Configure Connectivity Service for a new Device>`.
Finally, click the Basket icon at top right and click the ``Commit`` button.
Now jump to the `Verifying the AiaB installation`_ section.
Option 2: Configure Aether without ROC
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
It is possible to configure Aether without the ROC,
using static YAML files and the SimApp service. If you have already
installed the ROC, you should skip this section.
Edit *sd-core-4g-values.yaml*. Change ``mcc`` and ``mnc`` as follows::
plmn:
mcc: "315"
mnc: "010"
Also add the IMSIs of your devices under ``imsis``, for example::
device-groups:
- name: "4g-oaisim-user"
imsis:
- "315010999912301"
- "315010999912302"
- "315010999912303"
Install AiaB as follows (specifying ``DATA_IFACE`` from above)::
ENABLE_OAISIM=false DATA_IFACE=<iface> CHARTS=latest make 4g-core
Verifying the AiaB installation
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Installing AiaB will take about 20 minutes with a fast Internet
connection. If you see any errors / timeouts, try running the ``make``
command again. The build will finish with a message:
“Your MME IP address is… ” This is just the IP address assigned to
the ``DATA_IFACE``. Remember this for the eNodeB setup.
When the install is complete, check that the 4G SD-CORE is running
as follows::
$ kubectl -n omec get pod
NAME READY STATUS RESTARTS AGE
cassandra-0 1/1 Running 0 7m27s
config4g-0 1/1 Running 0 7m27s
hss-0 1/1 Running 0 7m27s
mme-0 4/4 Running 0 7m27s
pcrf-0 1/1 Running 0 7m27s
simapp-65dc44b9d-stx6q 1/1 Running 0 7m27s
spgwc-0 2/2 Running 0 7m27s
upf-0 5/5 Running 0 7m27s
You should see all pods in Running status.
If you have installed the ROC, check that all its pods are running
as follows::
$ kubectl -n aether-roc get pod
NAME READY STATUS RESTARTS AGE
aether-roc-api-78cc548bb9-7vjs2 1/1 Running 0 4m16s
aether-roc-gui-v2-6d674fd446-tttb5 1/1 Running 0 4m16s
aether-roc-umbrella-grafana-74f8489c8f-s9p45 2/2 Running 0 4m16s
aether-roc-websocket-855d64549b-44fnc 1/1 Running 0 4m16s
onos-cli-5d448ff6c4-stq5t 1/1 Running 0 4m16s
onos-config-7f4df96b88-vtp5s 6/6 Running 0 4m16s
onos-consensus-store-0 1/1 Running 0 4m15s
onos-topo-585c7c8976-6jq7b 3/3 Running 0 4m16s
sdcore-adapter-v2-5646d455b9-2d6zl 1/1 Running 0 4m15s
You should see all pods in Running status.
The UPF pod connects to the ``DATA_IFACE`` specified above using macvlan networks called
``core`` and ``access``. Next, check that these have been successfully created, e.g. using
``ifconfig``::
$ ifconfig core
core: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.250.1 netmask 255.255.255.0 broadcast 192.168.250.255
ether 16:9d:c1:0f:19:3a txqueuelen 1000 (Ethernet)
RX packets 513797 bytes 48400525 (48.4 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 102996 bytes 26530538 (26.5 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
$ ifconfig access
access: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.252.1 netmask 255.255.255.0 broadcast 192.168.252.255
ether 7a:9f:38:c0:18:15 txqueuelen 1000 (Ethernet)
RX packets 558162 bytes 64064410 (64.0 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 99553 bytes 16646682 (16.6 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Understanding AiaB networking
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Why does AiaB create the ``core`` and ``access`` interfaces? These are necessary to enable
the UPF to exchange packets with the eNodeB (access) and Internet (core); they correspond to
the last two network interfaces below inside the UPF's `bessd` container::
$ kubectl -n omec exec -ti upf-0 bessd -- ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
3: eth0@if30: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
link/ether 8a:e2:64:10:4e:be brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.84.19/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::88e2:64ff:fe10:4ebe/64 scope link
valid_lft forever preferred_lft forever
4: access@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 82:b4:ea:00:50:3e brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.252.3/24 brd 192.168.252.255 scope global access
valid_lft forever preferred_lft forever
inet6 fe80::80b4:eaff:fe00:503e/64 scope link
valid_lft forever preferred_lft forever
5: core@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 4e:ac:69:31:a3:88 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.250.3/24 brd 192.168.250.255 scope global core
valid_lft forever preferred_lft forever
inet6 fe80::4cac:69ff:fe31:a388/64 scope link
valid_lft forever preferred_lft forever
In other words, there are interfaces named ``access`` and ``core`` **both inside and outside** the UPF. All four
are MACVLAN interfaces
bridged with DATA_IFACE. There are two subnets on this bridge: the two ``access`` interfaces are on 192.168.252.0/24
and the two ``core`` interfaces are on 192.168.250.0/24. It is helpful to think of two links, called
``access`` and ``core``, connecting the AiaB host and UPF. AiaB sets up IP routes on the AiaB host and inside the UPF
to forward packets into and out of the UPF as explained below.
The ``access`` interface **inside the UPF** has an IP address of 192.168.252.3; this is the destination IP address
of GTP-encapsulated data plane packets from the eNodeB. In order for these packets to actually find their way
to the UPF, they must arrive on the DATA_IFACE interface and then be forwarded on the ``access`` interface
**outside the UPF**.
The next section describes how to configure a static route on the eNodeB in order to send the GTP packets to
DATA_IFACE. Forwarding the packets to the ``access`` interface is done by the following kernel route on the
AiaB host (which should be present if your AiaB installation was successful)::
$ route -n | grep "Iface\|access"
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.252.0 0.0.0.0 255.255.255.0 U 0 0 0 access
The high-level behavior of the UPF is to forward packets between its ``access`` to ``core`` interfaces, while
at the same time removing/adding GTP encapsulation on the ``access`` side. Upstream packets
arriving on the ``access`` side from a UE have their GTP headers removed and the raw IP packets are
forwarded to the ``core`` interface. The routes inside the UPF's `bessd` container will look something
like this::
$ kubectl -n omec exec -ti upf-0 -c bessd -- ip route
default via 169.254.1.1 dev eth0
default via 192.168.250.1 dev core metric 110
128.105.144.0/22 via 192.168.252.1 dev access
128.105.145.141 via 169.254.1.1 dev eth0
169.254.1.1 dev eth0 scope link
192.168.250.0/24 dev core proto kernel scope link src 192.168.250.3
192.168.252.0/24 dev access proto kernel scope link src 192.168.252.3
The default route via 192.168.250.1 is directing upstream packets to the Internet via the ``core`` interface,
with a next hop of the ``core`` interface **outside the UPF**.
These packets undergo source NAT in the kernel (also configured by AiaB) and are sent to the IP destination
in the packet. The return (downstream) packets undergo reverse NAT and now have a destination IP address of the UE.
They are forwarded by the kernel to the ``core`` interface by these rules on the AiaB host::
$ route -n | grep "Iface\|core"
Destination Gateway Genmask Flags Metric Ref Use Iface
172.250.0.0 192.168.250.3 255.255.0.0 UG 0 0 0 core
192.168.250.0 0.0.0.0 255.255.255.0 U 0 0 0 core
The first rule above matches packets to the UEs (on 172.250.0.0/16 subnet). The next hop for these
packets is the ``core`` IP address **inside the UPF**. The second rule says that next hop address is
reachable on the ``core`` interface **outside the UPF**. As a result the downstream packets arrive in the
UPF where they
are GTP-encapsulated with the IP address of the eNodeB. Inside the UPF these packets will match a route
like this one (see above; 128.105.144.0/22 in this case is the DATA_IFACE subnet)::
128.105.144.0/22 via 192.168.252.1 dev access
These packets are forwarded to the ``access`` interface **outside the UPF** and out DATA_IFACE to the eNodeB.
Recall that AiaB assumes that the eNodeB is on the same subnet as DATA_IFACE, so in this case it also has an
IP address in the 128.105.144.0/22 range.
Manual Sercomm eNodeB setup
---------------------------
The instructions in this section describe a basic configuration of
the eNodeB. For a more comprehensive guide to
eNodeB configuration see `eNB Installation <https://docs.aetherproject.org/master/edge_deployment/enb_installation.html>`_.
The Sercomm eNodeB has two Ethernet ports: WAN and LAN. We will use
the LAN port for configuration of the eNodeB and the WAN port for
normal operation. Connect the eNodeB WAN port to the local network.
Connect the eNodeB LAN port to a free Ethernet port on a Linux machine
(say, a laptop) that will be used for the initial configuration of
the eNodeB. On that machine run ``dhclient`` on the interface corresponding
to the Ethernet port, for example::
sudo dhclient eth1
The interface should receive an IP address from the Sercomm eNodeB on
the 11.11.11.0/24 subnet. Check this using ``ifconfig``::
$ ifconfig eth1
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 11.11.11.100 netmask 255.255.255.0 broadcast 11.11.11.255
inet6 fe80::2e0:4cff:fe68:2f76 prefixlen 64 scopeid 0x20<link>
ether 00:e0:4c:68:2f:76 txqueuelen 1000 (Ethernet)
RX packets 264652 bytes 216094312 (216.0 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 183978 bytes 36528580 (36.5 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
The eNodeB IP address should be 11.11.11.188 on that link. Verify
this using ping::
$ ping 11.11.11.188
To access the Sercomm eNodeB admin page, you can run a Web browser on
the laptop and direct it to `https://11.11.11.188`. Login to the admin
interface as user: ``sc_femto`` and password: ``scHt3pp``.
Click the ``NetWork set`` menu at the top. In the first section
``IP Address``, set *Connect type: DHCP* (assuming this is supported on
your local network, otherwise set up a static IP address).
Click the blue ``Save`` button at the bottom.
Next, click the ``Manage`` menu at the top and then click the
``LTE Basic Setting`` tab. Change these parameters and click ``Save``:
* Carrier Number: 2
* Carrier Aggregation: Unset
* BandWidth: 20
* FrequencyBand: 48,48
* EARFCN: 55440,55640
* CellIdentity: 2,1
* PCI: 100,101
* TxPower: 20
* Tunnel Type: IPv4
* MME IP Address: <MME IP address from AiaB installation>
* PLMNID: 315010
* TAC: 1
* Sync Source: FREE_RUNNING
* Enable CWMP: Unset
Click the ``SAS Configuration`` tab. In the ``Location Configuration``
section, enter these values and click “Save”:
* Location: Indoor
* Location Source: Manual
* Latitude: 0
* Longitude: 0
* Elevation: -18000
Next we need to add a static route to the UPF address, 192.168.252.3,
on the eNodeB. Click on ``TR098`` menu and then click on ``IP`` tab.
Scroll down to ``Device.Routing.Router.`` section. Click ``View List``.
Add this info on the blank line:
* Enable: Set
* StaticRoute: Set
* DestIPAddress: 192.168.252.0
* DestSubnetMask: 255.255.255.0
* GatewayIPAddress: <Use MME IP address from AiaB installation>
* Interface: Device.IP.Interface.1.
Then click the ``Add`` button at the far right.
Finally click the ``FAPService`` menu and then go to the ``FAPControl``
tab. Check the box next to ``AdminState`` in the first section and
click ``Save``.
After these changes are made, reboot the eNodeB by clicking the red
``power button`` square at top right and selecting ``Reboot``. When the
eNodeB comes back up, it should have an IP address on the network
(via the WAN port), and the admin page should now be available on
`https://<endoeb-ip>`.
Test connectivity from the eNodeB to the MME and the UPF running on
the server as follows. Login to the eNodeB admin interface, click
the “Manage” menu at the top, and click the ``IP Diagnose`` tab. Under
``Ping and Traceroute``, select ``ping``, and then type the following IP
addresses into the box to the right and click ``Run``:
* <MME IP address from AiaB installation>
* 192.168.251.1
* 192.168.252.3
If all of these are working, then you are ready to try to connect
devices to the network.
Automated Sercomm eNodeB Setup (experimental)
---------------------------------------------
The eNodeB service is used to provide the automatic configuration of the eNodeB device.
It can be installed by the following command::
make enodebd
The eNodeBD service will listen on port *31005* and you need to configure the management url of eNodeB device
to make eNodeB connect to the eNodeBD service.
By default, the eNodeBD service will configure the eNodeB with the pre-defined configuration, but you can also add
the customized configuration per serial number in the ``magma_config/serial_number/`` directory. For the example
configuration, please duplicate ``acs_common.yaml`` and rename it as the ``{serial_number}.yaml``.
The automated setup via eNodeBD won't configure the static route to UPF service, please follow
the UPF route setup step describes in **Manual Sercomm eNodeB setup** to add the static route.
Configuration and Validation
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
To configure the Sercomm eNodeB be managed by eNodeBD service, access the TR098 configuration page::
https://<enodeb_ip_address>/TR098_DevFeature.htm
The configuring path is: TR098 > MgmtServer > Device.ManagementServer.URL
1. Check the EnableCWMP option to enable the management function.
2. Fill the eNodeBD URL into Device.ManagementServer.URL field.
After you fill in the AiaB IP with eNodeBD service port as URL into the field, you need to restart the device.
And you will be able to see the eNodeBD log by the following command (the pod name may be different)::
kubectl -n aether-apps logs aether-enodebd-b46897745-fj5qj -f
Also, you can install the monitoring dashboard to view the eNodeB status on Grafana.
Connecting Devices
------------------
Documenting how to configure different types of devices to work
with Aether is work-in-progress, but here are some basic guidelines.
The values of IMSI, OPc, and Transport Key you have configured on your SIM cards
must be entered into the ``subscribers`` block under ``omec-sub-provision`` in the
``sd-core-4g-values.yaml`` file. If you are not using the ROC, the IMSIs must also be
added under ``device-groups``, and the relevant device group added under ``network-slices``.
If you are using the ROC, then your devices must be configured there and the associated
device group added to a slice. In either case it is necessary to configure the basic info
under ``subscribers``.
Be aware that not all phones support the CBRS frequency bands. AiaB is known to work
with recent iPhones (11 and greater) and Google Pixel phones (4 and up). CBRS may also be
supported by recent phones from Samsung, LG Electronics and Motorola Mobility, but these have
not been tested with AiaB. If you successfully test a phone on AiaB, please post details on
Slack so we can add it to the list.
The APN to configure on your phone is ``internet``.
Enable Monitoring
-----------------
To easily monitor your AiaB deployment, you can run the following command to
deploy the Prometheus/Grafana monitoring stack on your AiaB server::
make monitoring-4g
After this step, Grafana is available at `http://<server-ip>:30950`. You will see a number of system dashboards
for monitoring Kubernetes, as well as a simple AiaB dashboard that enables inspection of the local Aether state.
.. figure:: images/4g-aiab-grafana-dashboard.png
:align: center
:width: 100 %
*4G Grafana AiaB Dashboard*
The dashboard shows whether the eNodeB is connected to the core, how many active UEs there are, and the
uplink (Tx Bitrate) and downlink (Rx Bitrate) throughput at the UPF.
To create a new dashboard for Aether, you can login to Grafana as user `admin` with password `prom-operator`.
You can also modify an existing dashboard by making a copy of the dashboard and editing that. Note that any
dashboard changes will be lost if Grafana is restarted; if you want to make your dashboard more permanent, you can
save its JSON to a file, add the file to directory `aether-in-a-box/resources/4g-monitoring`, and edit
`kustomization.yaml` in that directory to add the file to the ConfigMapGenerator block. After these
steps, re-running `make monitoring-4g` should install the dashboard in a ConfigMap and Grafana should
automatically load it.
Troubleshooting
---------------
**NOTE: Running both 4G and 5G SD-CORE simultaneously in AiaB is currently not supported.**
"make" fails immediately
^^^^^^^^^^^^^^^^^^^^^^^^
AiaB connects macvlan networks to ``DATA_IFACE`` so that the UPF can communicate on the network.
To do this it assumes that the *systemd-networkd* service is installed and running, ``DATA_IFACE``
is under its control, and the systemd-networkd configuration file for ``DATA_IFACE`` ends with
``<DATA_IFACE>.network``, where ``<DATA_IFACE>`` stands for the actual interface name. It
tries to find this configuration file by looking in the standard paths. If it fails you'll see
a message like::
FATAL: Could not find systemd-networkd config for interface foobar, exiting now!
make: *** [Makefile:112: /users/acb/aether-in-a-box//build/milestones/interface-check] Error 1
In this case, you can specify a ``DATA_IFACE_PATH=<path to the config file>`` argument to ``make``
so that AiaB can find the systemd-networkd configuration file for ``DATA_IFACE``. It's also possible
that your system does not use systemd-networkd to configure network interfaces (more likely if you
are running in a VM), in which case AiaB is currently not able to install in your setup. You
can check that systemd-networkd is installed and running as follows::
$ systemctl status systemd-networkd.service
● systemd-networkd.service - Network Service
Loaded: loaded (/lib/systemd/system/systemd-networkd.service; disabled; vendor preset: enabled)
Active: active (running) since Tue 2022-07-12 13:42:18 CDT; 2h 26min ago
TriggeredBy: ● systemd-networkd.socket
Docs: man:systemd-networkd.service(8)
Main PID: 13777 (systemd-network)
Status: "Processing requests..."
Tasks: 1 (limit: 193212)
Memory: 6.4M
CGroup: /system.slice/systemd-networkd.service
└─13777 /lib/systemd/systemd-networkd
Data plane is not working
^^^^^^^^^^^^^^^^^^^^^^^^^
The first step is to read `Understanding AiaB networking`_, which gives a high level picture
of the AiaB data plane and how the pieces fit together. In order to debug the problem you will
need to figure out where data plane packets from the eNodeB are dropped. One way to do this is to
run ``tcpdump`` on (1) DATA_IFACE to ensure that the data plane packets are arriving, (2) the
``access`` interface to see that they make it to the UPF, and (3) the ``core`` to check that they
are forwarded upstream.
If the upstream packets don't make it to DATA_IFACE, you probably need to add the static route
on the eNodeB so packets to the UPF have a next hop of DATA_IFACE. You can see these upstream
packets by running::
tcpdump -i <data-iface> -n udp port 2152
If they don't make it to ``access`` you should check that the kernel routing table is forwarding
a packet with destination 192.158.252.3 to the ``access`` interface. You can see them by running::
tcpdump -i access -n udp port 2152
If they don't make it to ``core`` then they are being dropped by the UPF for some reason. This
may be a configuration issue with the state loaded in the ROC / SD-CORE -- the UPF is being told
to discard these packets. You should check that the device's IMSI is part of a slice and that
the slice's policy settings allow traffic to that destination. You can view them via the following::
tcpdump -i core -n net 172.250.0.0/16
That command will capture all packets to/from the UE subnet.
If you cannot figure out the issue, see `Getting Help`_.
Restarting the AiaB Server
--------------------------
AiaB should come up in a mostly working state if the AiaB server is rebooted. If any pods are
stuck in an Error or CrashLoopBackoff state they can be restarted using ``kubectl delete pod``.
It might also be necessary to power cycle the Sercomm eNodeB in order to get it to reconnect to
the SD-CORE.
Getting Help
------------
Please introduce yourself and post your questions to the `#aether-dev` channel on the ONF Community Slack.
Details about how to join this channel can be found on the `ONF Wiki <https://wiki.opennetworking.org/display/COM/Aether>`_.
In your introduction please state your institution and position, and describe why you are interested in Aether
and what is your end goal.
If you need help debugging your setup, please give as much detail as possible about
your environment: the OS version you have installed, are you running on bare metal or in a VM,
how much CPU and memory does your server have, are you installing behind a proxy, and so on. Also list the steps
you have performed so far, and post any error messages you have received. These details will aid the community
to understand where you are and how to help you make progress.