Complete UPF section with DBUF and PFCP agent instructions

Change-Id: Ic310a5991660a465889c936434d3dceac3ea7bbe
diff --git a/advanced/upf.rst b/advanced/upf.rst
index e92e831..f8a4d82 100644
--- a/advanced/upf.rst
+++ b/advanced/upf.rst
@@ -84,7 +84,7 @@
 protocol, such as message parsing, state machines, and other bookkeeping can be
 common to many different UPF realizations. For this reason, SD-Fabric relies on
 an implementation of the PFCP protocol realized as an external microservice
-named “PFCP-Agent”, which is provided by the SD-Core project.
+named “PFCP Agent”, which is provided by the SD-Core project.
 
 The UP4 App abstracts the whole fabric as one virtual big switch with UPF
 capabilities, we call this the One-Big-UPF abstraction. Such abstraction allows
@@ -112,7 +112,28 @@
 Downlink Buffering (DBUF)
 -------------------------
 
-TODO Carmelo: overview of DBUF
+A UPF is required to buffer packets when UEs are in idle-mode or during
+handovers, this is usually called *downlink buffering*, as it applies only to
+the downlink direction of traffic. Most switches provide buffering capabilities
+to handle congestion, they cannot hold packets indefinitely. For this reason, we
+provide DBUF, a microservice
+responsible for providing the downlink buffering capabilities to P4-UPF.
+
+.. image:: ../images/dbuf.png
+    :width: 400px
+
+When a UE goes idle and turns off its radio, or during handovers, the mobile
+core control plane uses PFCP to update the Forwarding Action Rules (FARs) for
+that UE to enter buffering* mode. When this happens, UP4 updates the switch rules to
+steer packets to DBUF using GTP-U tunnels.
+
+UP4 uses gRPC to communicate with DBUF. DBUF notifies UP4 about buffering
+events, which are relayed to the mobile core control plane as Downlink Data
+Notifications (DDN). When a UE becomes available again, UP4 triggers a buffer
+drain on DBUF and updates the switch rules to start sending traffic to the UE again.
+
+Deploying DBUF is optional (can be enabled in the SD-Fabric Helm Chart).
+DBUF feature requires SR-IOV and DHCP support on NICs and Kubernetes CNIs.
 
 ONOS Configuration
 ------------------
@@ -121,7 +142,7 @@
 independently to ONOS. Th first is used to configure the UP4 ONOS application
 and defines UPF-related information such as S1U Address, network devices
 implementing UPF etc. The second one, instead, is used to configure parameters
-related to the Downlink Buffering (DBUF) functionality.
+related to the DBUF functionality.
 
 Here's a list of fields that you can configure via the UPF Network Configuration
 for UP4:
@@ -174,14 +195,14 @@
 downlink buffering functionality. Here's a list of fields that you can
 configure:
 
-* ``serviceAddr``: The address DBUF service management interface in the form
-  IP:port. This address is used to communicate with the DBUF service via gRPC
-  (for example, to trigger the drain operation, or receive notification for
+* ``serviceAddr``: The address of the DBUF service management interface in the
+  form IP:port. This address is used to communicate with the DBUF service via
+  gRPC (for example, to trigger the drain operation, or receive notification for
   buffered packets).
 
 * ``dataplaneAddr``: The address of the DBUF service data plane interface in the
-  form IP:port. Packets sent to this address by the UPF will be buffered by
-  DBUF. The IP address must be a routable fabric address.
+  form IP:port. Packets sent to this address by the UPF switches will be
+  buffered by DBUF. The IP address must be a routable fabric address.
 
 Here is an example of netcfg for DBUF:
 
@@ -198,32 +219,21 @@
         }
     }
 
-SD-Core Configuration
----------------------
+.. note::
+    When deploying DBUF using the SD-Fabric Helm Chart you do **NOT** need to
+    provide the ``"dbuf"`` part of the UP4 config. That will be pushed
+    automatically by the DBUF Kubernetes pod.
 
-TODO Carmelo:
+PFCP Agent Configuration
+------------------------
 
-* Assuming SD-Core is already installed...
-* Instructions to install PFCP Agent for UP4
-* Reference for helm values configuration
+PFCP Agent can be deployed as part of the SD-Fabric Helm Chart.
 
-Should be similar to BESS install instructions (where the same helm chart
-installs both PFCP agent and BESS):
-https://docs.aetherproject.org/master/edge_deployment/bess_upf_deployment.html
-
-But using this helm chart (without BESS), just PFCP Agent:
-https://gerrit.opencord.org/plugins/gitiles/aether-helm-charts/+/refs/heads/master/omec/omec-upf-pfcp-agent/
+See the Helm Chart documentation for more information on the configuration
+parameters. Once deployed, use ``kubectl get services -n sdfabric`` to find out
+the exact UDP endpoint used to listen for PFCP connection requests.
 
 UP4 Troubleshooting
 -------------------
 
 See :ref:`troubleshooting_guide`.
-
-DBUF
-----
-
-
-``TODO Carmelo`` overview
-
-
-``TODO Hung-Wei`` deployment instructions (helm chart)