Commit 250ce616 authored by Rohan's avatar Rohan

initial commit

parent 727099f2
# * Unless required by applicable law or agreed to in writing, software
# * distributed under the License is distributed on an "AS IS" BASIS,
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# * See the License for the specific language governing permissions and
# * limitations under the License.
# *-------------------------------------------------------------------------------
# * For more information about the OpenAirInterface (OAI) Software Alliance:
# * contact@openairinterface.org
# */
#---------------------------------------------------------------------
#
# Dockerfile for the Open-Air-Interface AMF service
# Valid for Ubuntu-18.04 (bionic)
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# BUILDER IMAGE
#---------------------------------------------------------------------
FROM ubuntu:18.04 AS vpp-upf-builder
ARG NEEDED_GIT_PROXY
LABEL name="upf" \
version="u18" \
description="Image for travelping upf based on VPP"
# Installing hyperscan library for upf plugin
RUN apt update && apt install git sudo wget make build-essential -y
RUN wget http://archive.ubuntu.com/ubuntu/pool/universe/h/hyperscan/libhyperscan4_4.7.0-1_amd64.deb \
http://archive.ubuntu.com/ubuntu/pool/universe/h/hyperscan/libhyperscan-dev_4.7.0-1_amd64.deb
RUN dpkg -i *.deb
# Some GIT configuration commands quite useful
RUN /bin/bash -c "if [[ -v NEEDED_GIT_PROXY ]]; then git config --global http.proxy $NEEDED_GIT_PROXY; fi"
RUN git config --global https.postBuffer 123289600
RUN git config --global http.sslverify false
# Installing and configuring vpp
RUN git clone -b downstream https://github.com/travelping/vpp.git upf
COPY docker/patches patches/
RUN patch -p1 -d upf < patches/werror_disable.patch
RUN git clone https://github.com/travelping/upg-vpp.git
RUN mv upg-vpp/upf/ upf/src/plugins/
RUN patch -p1 -d upf < patches/0008-Follow-symlinks-while-checking-timestamps-during-bui.patch
RUN patch -p1 -d upf < patches/0008-vlib-decrement-counters.patch
RUN patch -p1 -d upf < patches/0009-sparse-vector-fix-leak.patch
RUN rm *.deb -r upg-vpp/
RUN touch /etc/apt/apt.conf.d/90forceyes
RUN echo "APT::Get::Assume-Yes "true";" >> /etc/apt/apt.conf.d/90forceyes
RUN echo "APT::Get::force-yes "true";" >> /etc/apt/apt.conf.d/90forceyes
RUN make install-dep build -C upf/
RUN make install-ext-dep build -C upf/
#---------------------------------------------------------------------
# TARGET IMAGE
#---------------------------------------------------------------------
FROM ubuntu:bionic as vpp_upg
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Europe
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes && DEBIAN_FRONTEND=noninteractive apt-get install --yes \
net-tools \
tshark \
openssl \
libhyperscan-dev \
iproute2 \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /openair-upf/bin/
COPY --from=vpp-upf-builder /upf/build-root/install-vpp_debug-native/vpp/bin/vpp .
COPY --from=vpp-upf-builder /upf/build-root/install-vpp_debug-native/vpp/bin/vppctl .
COPY docker/configs .
WORKDIR /openair-upf/scripts
COPY docker/scripts .
WORKDIR /usr/lib/x86_64-linux-gnu/
COPY --from=vpp-upf-builder /upf/build-root/install-vpp_debug-native/vpp/lib/ .
RUN ldconfig
RUN groupadd vpp
WORKDIR /openair-upf/bin
#/*
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
# * contributor license agreements. See the NOTICE file distributed with
# * this work for additional information regarding copyright ownership.
# * The OpenAirInterface Software Alliance licenses this file to You under
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
# * except in compliance with the License.
# * You may obtain a copy of the License at
# *
# * http://www.openairinterface.org/?page_id=698
# *
# * Unless required by applicable law or agreed to in writing, software
# * distributed under the License is distributed on an "AS IS" BASIS,
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# * See the License for the specific language governing permissions and
# * limitations under the License.
# *-------------------------------------------------------------------------------
# * For more information about the OpenAirInterface (OAI) Software Alliance:
# * contact@openairinterface.org
# */
#---------------------------------------------------------------------
#
# Dockerfile for the Open-Air-Interface AMF service
# Valid for RHEL 8.2
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# BUILDER IMAGE
#---------------------------------------------------------------------
FROM registry.access.redhat.com/ubi8/ubi:latest AS oai-upf-builder
ARG NEEDED_GIT_PROXY
COPY tmp/ca/redhat-uep.pem /etc/rhsm/ca
COPY tmp/entitlement/*.pem /etc/pki/entitlement
#ENV DEBIAN_FRONTEND=noninteractive
#ENV TZ=Europe
#RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN rm -f /etc/rhsm-host && \
yum repolist --disablerepo=* && \
subscription-manager repos --enable codeready-builder-for-rhel-8-x86_64-rpms && \
yum update -y && \
yum install -y \
psmisc \
git \
make \
patch \
sudo \
python3 \
yum-utils \
wget &&\
rm -rf /var/lib/apt/lists/*
RUN yum groupinstall -y 'Development Tools'
# Some GIT configuration command quite useful
RUN /bin/bash -c "if [[ -v NEEDED_GIT_PROXY ]]; then git config --global http.proxy $NEEDED_GIT_PROXY; fi"
RUN git config --global https.postBuffer 123289600
RUN git config --global http.sslverify false
RUN wget https://download-ib01.fedoraproject.org/pub/epel/8/Everything/x86_64/Packages/h/hyperscan-5.3.0-5.el8.x86_64.rpm
RUN rpm -i *.rpm
# Installing and configuring vpp
RUN git clone -b downstream https://github.com/travelping/vpp.git upf
# WORKDIR /upf
COPY docker/patches patches/
RUN patch -p1 -d upf < patches/werror_disable.patch
RUN git clone https://github.com/travelping/upg-vpp.git
RUN mv upg-vpp/upf/ upf/src/plugins/
RUN patch -p1 -d upf < patches/0008-Follow-symlinks-while-checking-timestamps-during-bui.patch
RUN patch -p1 -d upf < patches/0008-vlib-decrement-counters.patch
RUN patch -p1 -d upf < patches/0009-sparse-vector-fix-leak.patch
#RUN yum-config-manager --enable rhel-server-rhscl-8-rpms
#RUN rm *.deb -r upg-vpp/
#RUN make install-dep build -C upf/
#RUN make install-ext-dep build -C upf/
#---------------------------------------------------------------------
# TARGET IMAGE
#---------------------------------------------------------------------
#FROM FROM registry.access.redhat.com/ubi8/ubi:latest as oai-upf
# We install some debug tools for the moment in addition of mandatory libraries
#RUN yum update -y && \
# yum install -y --enablerepo="ubi-8-codeready-builder" \
# psmisc \
# net-tools \
# tshark \
# openssl \
# iproute2 \
# && rm -rf /var/lib/apt/lists/*
#RUN wget http://repo.openfusion.net/centos7-x86_64/hyperscan-5.3.0-1.of.el7.x86_64.rpm
#RUN rpm -i hyperscan-5.3.0-1.of.el7.x86_64.rpm
#
#WORKDIR /openair-upf/bin/
#COPY --from=vpp-upf-builder /upf/build-root/install-vpp_debug-native/vpp/bin/vpp .
#COPY --from=vpp-upf-builder /upf/build-root/install-vpp_debug-native/vpp/bin/vppctl .
#COPY docker/configs .
#WORKDIR /openair-upf/scripts
#COPY docker/scripts .
#WORKDIR /usr/lib/x86_64-linux-gnu/
#COPY --from=vpp-upf-builder /upf/build-root/install-vpp_debug-native/vpp/lib/ .
#RUN ldconfig
#RUN groupadd vpp
#WORKDIR /openair-upf/bin
#ENTRYPOINT ["/openair-upf/bin/entrypoint.sh"]
ip table add 1
ip table add 2
create host-interface name sgi
set interface mac address host-sgi 00:0c:29:46:1f:53
set interface mtu 1500 host-sgi
set interface ip table host-sgi 1
set interface ip address host-sgi 192.168.64.201/26
set interface state host-sgi up
create host-interface name core
set interface mac address host-core 00:0c:29:46:1f:54
set interface mtu 1500 host-core
set interface ip table host-core 0
set interface ip address host-core 192.168.63.201/26
set interface state host-core up
create host-interface name access
set interface mac address host-access 00:0c:29:46:1f:55
set interface mtu 1500 host-access
set interface ip table host-access 2
set interface ip address host-access 192.168.62.201/26
set interface state host-access up
ip route add 0.0.0.0/0 table 2 via 192.168.62.210 host-access
ip route add 0.0.0.0/0 table 0 via 192.168.63.196 host-core
ip route add 0.0.0.0/0 table 1 via 192.168.64.194 host-sgi
upf pfcp endpoint ip 192.168.63.201 vrf 0
upf nwi name core vrf 0
upf nwi name access vrf 2
upf nwi name sgi vrf 1
upf node-id ip4 192.168.63.201
upf specification release 16
trace add af-packet-input 100
upf gtpu endpoint ip 192.168.62.201 nwi access teid 0x000004d2/2
#!/bin/sh -x
if [ $(id -u) -ne 0 ]; then
exec sudo -E "$0" "$@"
fi
base=$(dirname $0)
APP="/openair-upf/bin/vpp"
ARGS="-c /openair-upf/bin/startup_debug.conf"
USAGE="Usage: run.sh [-r] [ debug ]
debug: executes vpp under gdb"
while getopts ":r" opt; do
case $opt in
r)
APP="/openair-upf/bin/vpp"
ARGS="-c $base/startup.conf"
;;
\?)
echo "Invalid option: -$OPTARG\n" >&2
echo "$USAGE" >&2
exit 1
;;
esac
done
shift $((OPTIND-1))
if test -z "$1"; then
$APP $ARGS
elif test "$1" = "debug"; then
shift
gdb -ex 'set print pretty on' -ex 'run' --args $APP $ARGS $@
else
echo "$USAGE" >&2
exit 1
fi
unix {
nodaemon
log /tmp/vpp.log
full-coredump
gid vpp
interactive
cli-listen localhost:5002
exec init.conf
}
api-trace {
on
}
api-segment {
gid vpp
}
plugins {
path /usr/lib/x86_64-linux-gnu/vpp_plugins/
plugin dpdk_plugin.so { disable }
plugin gtpu_plugin.so { disable }
plugin upf_plugin.so { enable }
}
From d9fa03eb175bde1066f8c14249d8bb487d8800e4 Mon Sep 17 00:00:00 2001
From: Andreas Schultz <andreas.schultz@travelping.com>
Date: Mon, 16 Mar 2020 17:00:29 +0100
Subject: [PATCH 1/7] CI and build infrastructure adjustments
---
Makefile | 5 +++++
build/external/Makefile | 2 +-
build/external/packages/dpdk.mk | 4 ++--
src/pkg/debian/control.in | 6 ++++--
4 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/Makefile b/Makefile
index cf4cfadec..a2eab953a 100644
--- a/Makefile
+++ b/Makefile
@@ -67,9 +67,12 @@ DEB_DEPENDS += libconfuse-dev git-review exuberant-ctags cscope pkg-config
DEB_DEPENDS += lcov chrpath autoconf indent clang-format libnuma-dev
DEB_DEPENDS += python3-all python3-setuptools check
DEB_DEPENDS += libboost-all-dev libffi-dev python3-ply libmbedtls-dev
+DEB_DEPENDS += liburcu-dev
DEB_DEPENDS += cmake ninja-build uuid-dev python3-jsonschema python3-yaml
+DEB_DEPENDS += cmake ninja-build uuid-dev python3-jsonschema python3-yaml yamllint
DEB_DEPENDS += python3-venv # ensurepip
DEB_DEPENDS += python3-dev # needed for python3 -m pip install psutil
+DEB_DEPENDS += libhyperscan-dev
# python3.6 on 16.04 requires python36-dev
LIBFFI=libffi6 # works on all but 20.04
@@ -141,6 +144,7 @@ endif
# +ganglia-devel if building the ganglia plugin
+RPM_DEPENDS += hyperscan-devel
RPM_DEPENDS += chrpath libffi-devel rpm-build
RPM_DEPENDS_DEBUG = glibc-debuginfo e2fsprogs-debuginfo
@@ -155,6 +159,7 @@ RPM_SUSE_BUILDTOOLS_DEPS += clang cmake indent libtool make ninja python3-ply
RPM_SUSE_DEVEL_DEPS = glibc-devel-static libnuma-devel
RPM_SUSE_DEVEL_DEPS += libopenssl-devel openssl-devel mbedtls-devel libuuid-devel
+RPM_SUSE_DEVEL_DEPS += hyperscan-devel
RPM_SUSE_PYTHON_DEPS = python-devel python3-devel python-pip python3-pip
RPM_SUSE_PYTHON_DEPS += python-rpm-macros python3-rpm-macros
diff --git a/build/external/Makefile b/build/external/Makefile
index b0e3cee4f..c2d94e5bd 100644
--- a/build/external/Makefile
+++ b/build/external/Makefile
@@ -20,7 +20,7 @@ MAKE_ARGS ?= -j
BUILD_DIR ?= $(CURDIR)/_build
INSTALL_DIR ?= $(CURDIR)/_install
PKG_VERSION ?= $(shell git describe --abbrev=0 | cut -d- -f1 | cut -dv -f2 | cut -d. -f1,2)
-PKG_SUFFIX ?= $(shell git log --oneline v$(PKG_VERSION)-rc0.. . | wc -l)
+PKG_SUFFIX ?= $(shell git log --oneline v$(PKG_VERSION)-rc0.. -- . | wc -l)
JOBS := $(if $(shell [ -f /proc/cpuinfo ] && head /proc/cpuinfo),\
$(shell grep -c ^processor /proc/cpuinfo), 2)
diff --git a/build/external/packages/dpdk.mk b/build/external/packages/dpdk.mk
index beabf48e9..99a5d9f14 100644
--- a/build/external/packages/dpdk.mk
+++ b/build/external/packages/dpdk.mk
@@ -202,11 +202,12 @@ $(B)/custom-config: $(B)/.dpdk-patch.ok Makefile
$(call set,RTE_LIBRTE_PMD_TAP,$(DPDK_TAP_PMD))
$(call set,RTE_LIBRTE_GSO,$(DPDK_TAP_PMD))
$(call set,RTE_LIBRTE_PMD_FAILSAFE,$(DPDK_FAILSAFE_PMD))
+ @# required for UPF
+ $(call set,RTE_LIBRTE_ACL,y)
@# not needed
$(call set,RTE_ETHDEV_RXTX_CALLBACKS,n)
$(call set,RTE_LIBRTE_CFGFILE,n)
$(call set,RTE_LIBRTE_LPM,n)
- $(call set,RTE_LIBRTE_ACL,n)
$(call set,RTE_LIBRTE_JOBSTATS,n)
$(call set,RTE_LIBRTE_EFD,n)
$(call set,RTE_LIBRTE_MEMBER,n)
@@ -219,7 +220,6 @@ $(B)/custom-config: $(B)/.dpdk-patch.ok Makefile
$(call set,RTE_LIBRTE_PIPELINE,n)
$(call set,RTE_LIBRTE_PMD_SOFTNIC,n)
$(call set,RTE_LIBRTE_FLOW_CLASSIFY,n)
- $(call set,RTE_LIBRTE_ACL,n)
$(call set,RTE_LIBRTE_GRO,n)
$(call set,RTE_LIBRTE_KNI,n)
$(call set,RTE_LIBRTE_BPF,n)
diff --git a/src/pkg/debian/control.in b/src/pkg/debian/control.in
index 0b0c621e5..2addf900e 100644
--- a/src/pkg/debian/control.in
+++ b/src/pkg/debian/control.in
@@ -51,7 +51,8 @@ Description: Vector Packet Processing--runtime libraries
Package: vpp-plugin-core
Architecture: any
Depends: vpp (= ${source:Version}),
- ${shlibs:Depends}
+ ${shlibs:Depends},
+ ${misc:Depends}
Description: Vector Packet Processing--runtime core plugins
This package contains VPP core plugins
.
@@ -59,7 +60,8 @@ Description: Vector Packet Processing--runtime core plugins
Package: vpp-plugin-dpdk
Architecture: any
Depends: vpp (= ${source:Version}),
- ${shlibs:Depends}
+ ${shlibs:Depends},
+ ${misc:Depends}
Description: Vector Packet Processing--runtime dpdk plugin
This package contains the VPP dpdk plugin
.
--
2.28.0
--- a/src/plugins/upf/upf_pfcp_api.c 2020-12-18 15:41:33.250549473 +0000
+++ b/src/plugins/upf/upf_pfcp_api.c 2020-12-18 15:49:12.653515878 +0000
@@ -286,8 +286,11 @@
SET_BIT (resp.grp.fields, ASSOCIATION_SETUP_RESPONSE_RECOVERY_TIME_STAMP);
resp.recovery_time_stamp = psm->start_time;
- SET_BIT (resp.grp.fields, ASSOCIATION_SETUP_RESPONSE_TP_BUILD_ID);
- vec_add (resp.tp_build_id, vpe_version_string, strlen (vpe_version_string));
+ // SET_BIT (resp.grp.fields, ASSOCIATION_SETUP_RESPONSE_TP_BUILD_ID);
+ // vec_add (resp.tp_build_id, vpe_version_string, strlen (vpe_version_string));
+
+ SET_BIT (resp.grp.fields, ASSOCIATION_SETUP_RESPONSE_NODE_ID);
+ resp.response.node_id.ip = req->lcl.address;
n = pfcp_get_association (&msg->request.node_id);
if (n)
@@ -571,15 +574,52 @@
#define OPT(MSG,FIELD,VALUE,DEFAULT) \
((ISSET_BIT((MSG)->grp.fields, (FIELD))) ? MSG->VALUE : (DEFAULT))
+/**
+ * Translate "foo.com" into "0x3 f o o 0x3 c o m 0x0"
+ * A historical / hysterical micro-TLV scheme. DGMS.
+ */
+static u8 *
+upf_nwi_name_to_labels (u8 * name)
+{
+ int i;
+ int last_label_index;
+ u8 *rv;
+
+ rv = vec_dup (name);
+
+ /* punch in space for the first length */
+ vec_insert (rv, 1, 0);
+ last_label_index = 0;
+ i = 1;
+
+ while (i < vec_len (rv))
+ {
+ if (rv[i] == '.')
+ {
+ rv[last_label_index] = (i - last_label_index) - 1;
+ if ((i - last_label_index) > 63)
+ clib_warning ("stupid name, label length %d",
+ i - last_label_index);
+ last_label_index = i;
+ rv[i] = 0;
+ }
+ i++;
+ }
+ /* Set the last real label length */
+ rv[last_label_index] = (i - last_label_index) - 1;
+
+ return rv;
+}
static upf_nwi_t *
lookup_nwi (u8 * name)
{
upf_main_t *gtm = &upf_main;
uword *p;
-
+
assert (name);
+ name = upf_nwi_name_to_labels(name);
if (pool_elts (gtm->nwis) == 0)
From 3daf9fc66400b566f60626ac8aa1c0f0a8f3d35a Mon Sep 17 00:00:00 2001
From: Andreas Schultz <andreas.schultz@travelping.com>
Date: Mon, 20 Apr 2020 09:45:24 +0200
Subject: [PATCH 2/7] Only install hyperscan on amd64
Hyperscan is only supported on Intel. Keep it simple and
test only for x86_64 (who is still using 32bit anyway?)
Change-Id: I73707d33860820e4cee0b95575c11756236466a4
---
Makefile | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/Makefile b/Makefile
index a2eab953a..841eb3bdf 100644
--- a/Makefile
+++ b/Makefile
@@ -72,7 +72,9 @@ DEB_DEPENDS += cmake ninja-build uuid-dev python3-jsonschema python3-yaml
DEB_DEPENDS += cmake ninja-build uuid-dev python3-jsonschema python3-yaml yamllint
DEB_DEPENDS += python3-venv # ensurepip
DEB_DEPENDS += python3-dev # needed for python3 -m pip install psutil
+ifeq ($(MACHINE),x86_64)
DEB_DEPENDS += libhyperscan-dev
+endif
# python3.6 on 16.04 requires python36-dev
LIBFFI=libffi6 # works on all but 20.04
@@ -144,7 +146,9 @@ endif
# +ganglia-devel if building the ganglia plugin
+ifeq ($(MACHINE),x86_64)
RPM_DEPENDS += hyperscan-devel
+endif
RPM_DEPENDS += chrpath libffi-devel rpm-build
RPM_DEPENDS_DEBUG = glibc-debuginfo e2fsprogs-debuginfo
@@ -159,7 +163,9 @@ RPM_SUSE_BUILDTOOLS_DEPS += clang cmake indent libtool make ninja python3-ply
RPM_SUSE_DEVEL_DEPS = glibc-devel-static libnuma-devel
RPM_SUSE_DEVEL_DEPS += libopenssl-devel openssl-devel mbedtls-devel libuuid-devel
+ifeq ($(MACHINE),x86_64)
RPM_SUSE_DEVEL_DEPS += hyperscan-devel
+endif
RPM_SUSE_PYTHON_DEPS = python-devel python3-devel python-pip python3-pip
RPM_SUSE_PYTHON_DEPS += python-rpm-macros python3-rpm-macros
--
2.28.0
From 24692e761d7ac74b4ef7d370b374b982740ad072 Mon Sep 17 00:00:00 2001
From: Ivan Shvedunov <ivan4th@gmail.com>
Date: Fri, 5 Jun 2020 01:41:55 +0300
Subject: [PATCH 3/7] Fix bad format_time_float usage
Was causing crashes with CLIB_DEBUG > 1
---
src/vlib/log.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/vlib/log.c b/src/vlib/log.c
index 342c0d25c..0cfdd2020 100644
--- a/src/vlib/log.c
+++ b/src/vlib/log.c
@@ -252,7 +252,7 @@ vlib_log_init (vlib_main_t * vm)
vec_validate (lm->entries, lm->size);
lm->log_class = vlib_log_register_class ("log", 0);
- u8 *tmp = format (NULL, "%U %-10U %-10U ", format_time_float, 0, (f64) 0,
+ u8 *tmp = format (NULL, "%U %-10U %-10U ", format_time_float, NULL, (f64) 0,
format_white_space, 255, format_white_space, 255);
log_main.indent = vec_len (tmp);
vec_free (tmp);
@@ -280,7 +280,7 @@ show_log (vlib_main_t * vm,
{
e = vec_elt_at_index (lm->entries, i);
vlib_cli_output (vm, "%U %-10U %-14U %v",
- format_time_float, 0, e->timestamp + time_offset,
+ format_time_float, NULL, e->timestamp + time_offset,
format_vlib_log_level, e->level,
format_vlib_log_class, e->class, e->string);
i = (i + 1) % lm->size;
--
2.28.0
From 03aa160f4e60bcf6e08fa2e00ed828d1a3ec5806 Mon Sep 17 00:00:00 2001
From: Ivan Shvedunov <ivan4th@gmail.com>
Date: Wed, 5 Aug 2020 16:44:28 +0300
Subject: [PATCH 4/7] [TEMP] Increase reassembly limit
This is an interim solution till we implement a proper CLI command
---
src/vnet/ip/reass/ip4_full_reass.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/vnet/ip/reass/ip4_full_reass.c b/src/vnet/ip/reass/ip4_full_reass.c
index 4d578c5ce..713e95629 100644
--- a/src/vnet/ip/reass/ip4_full_reass.c
+++ b/src/vnet/ip/reass/ip4_full_reass.c
@@ -32,7 +32,7 @@
#define IP4_REASS_TIMEOUT_DEFAULT_MS 100
#define IP4_REASS_EXPIRE_WALK_INTERVAL_DEFAULT_MS 10000 // 10 seconds default
#define IP4_REASS_MAX_REASSEMBLIES_DEFAULT 1024
-#define IP4_REASS_MAX_REASSEMBLY_LENGTH_DEFAULT 3
+#define IP4_REASS_MAX_REASSEMBLY_LENGTH_DEFAULT 8
#define IP4_REASS_HT_LOAD_FACTOR (0.75)
#define IP4_REASS_DEBUG_BUFFERS 0
--
2.28.0
From 1c1e42525ae28dfa7d8a145f6f78d10c3c4e6fa4 Mon Sep 17 00:00:00 2001
From: Ivan Shvedunov <ivan4th@gmail.com>
Date: Mon, 21 Sep 2020 19:13:15 +0300
Subject: [PATCH 5/7] Bump scapy to v2.4.4
---
test/requirements-2.txt | 4 ++--
test/requirements-3.txt | 4 ++--
test/requirements.txt | 2 +-
test/test_span.py | 3 ++-
4 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/test/requirements-2.txt b/test/requirements-2.txt
index 1f8b2bc3b..5c64bfc2a 100644
--- a/test/requirements-2.txt
+++ b/test/requirements-2.txt
@@ -265,8 +265,8 @@ scandir==1.10.0 \
--hash=sha256:b24086f2375c4a094a6b51e78b4cf7ca16c721dcee2eddd7aa6494b42d6d519d \
--hash=sha256:cb925555f43060a1745d0a321cca94bcea927c50114b623d73179189a4e100ac \
# via pathlib2
-scapy==2.4.3 ; python_version >= "2.7" or python_version >= "3.4" \
- --hash=sha256:e2f8d11f6a941c14a789ae8b236b27bd634681f1b29b5e893861e284d234f6b0 \
+scapy==2.4.4 ; python_version >= "2.7" or python_version >= "3.4" \
+ --hash=sha256:ecfd7a14cd9c3ef0eb08d28d5bb71d97219edff1454ccbdff229f676b27900ee \
# via -r requirements.txt
six==1.15.0 \
--hash=sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259 \
diff --git a/test/requirements-3.txt b/test/requirements-3.txt
index f955f37c4..9bc56a570 100644
--- a/test/requirements-3.txt
+++ b/test/requirements-3.txt
@@ -220,8 +220,8 @@ requests==2.23.0 \
--hash=sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee \
--hash=sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6 \
# via sphinx
-scapy==2.4.3 ; python_version >= "2.7" or python_version >= "3.4" \
- --hash=sha256:e2f8d11f6a941c14a789ae8b236b27bd634681f1b29b5e893861e284d234f6b0 \
+scapy==2.4.4 ; python_version >= "2.7" or python_version >= "3.4" \
+ --hash=sha256:ecfd7a14cd9c3ef0eb08d28d5bb71d97219edff1454ccbdff229f676b27900ee \
# via -r requirements.txt
six==1.15.0 \
--hash=sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259 \
diff --git a/test/requirements.txt b/test/requirements.txt
index e934bc042..23a7827d0 100644
--- a/test/requirements.txt
+++ b/test/requirements.txt
@@ -11,7 +11,7 @@ parameterized>=0.6.1 # BSD
pexpect # ISC
psutil # BSD
pycodestyle # MIT (Expat license) https://pypi.org/project/pycodestyle/
-scapy==2.4.3; python_version >= '2.7' or python_version >= '3.4' # GPL2 https://github.com/secdev/scapy/blob/master/LICENSE
+scapy==2.4.4; python_version >= '2.7' or python_version >= '3.4' # GPL2 https://github.com/secdev/scapy/blob/master/LICENSE
six # MIT
subprocess32 # PSF
syslog_rfc5424_parser>=0.3.1 # ISC
diff --git a/test/test_span.py b/test/test_span.py
index ecefe1537..d4918c21a 100644
--- a/test/test_span.py
+++ b/test/test_span.py
@@ -3,9 +3,10 @@
import unittest
from scapy.packet import Raw
-from scapy.layers.l2 import Ether, Dot1Q, GRE, ERSPAN
+from scapy.layers.l2 import Ether, Dot1Q, GRE
from scapy.layers.inet import IP, UDP
from scapy.layers.vxlan import VXLAN
+from scapy.contrib.erspan import ERSPAN
from framework import VppTestCase, VppTestRunner
from util import Host, ppp
--
2.28.0
From 7ff117b5df1f520e2d1d2d2a3dc3734c1b5c6d81 Mon Sep 17 00:00:00 2001
From: Ivan Shvedunov <ivan4th@gmail.com>
Date: Tue, 22 Sep 2020 01:28:37 +0300
Subject: [PATCH 6/7] Add downstream marker
---
.downstream-marker | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 .downstream-marker
diff --git a/.downstream-marker b/.downstream-marker
new file mode 100644
index 000000000..e69de29bb
--
2.28.0
From b9fc3c3bd35a6fa9f1c122c8a7a8aa56a1efdb35 Mon Sep 17 00:00:00 2001
From: Ivan Shvedunov <ivan4th@gmail.com>
Date: Thu, 15 Oct 2020 13:19:35 +0300
Subject: [PATCH 7/7] ethernet: fix Ethernet DMAC checks
Type: fix
Due to confusion between ethernet flags and hw interface flags, DMAC
filtering was not happening, most of the time.
Signed-off-by: Ivan Shvedunov <ivan4th@gmail.com>
Change-Id: I95209e1ea0f95f9be0b1a82ec9fcbc80955428d2
---
src/vnet/ethernet/node.c | 19 ++++++++++++-------
1 file changed, 12 insertions(+), 7 deletions(-)
diff --git a/src/vnet/ethernet/node.c b/src/vnet/ethernet/node.c
index 551754dca..73e9eec71 100644
--- a/src/vnet/ethernet/node.c
+++ b/src/vnet/ethernet/node.c
@@ -204,7 +204,8 @@ ethernet_input_inline_dmac_check (vnet_hw_interface_t * hi,
// vlan table lookups and vlan header parsing. Check the most specific
// matches first.
static_always_inline void
-identify_subint (vnet_hw_interface_t * hi,
+identify_subint (ethernet_main_t * em,
+ vnet_hw_interface_t * hi,
vlib_buffer_t * b0,
u32 match_flags,
main_intf_t * main_intf,
@@ -213,6 +214,7 @@ identify_subint (vnet_hw_interface_t * hi,
u32 * new_sw_if_index, u8 * error0, u32 * is_l2)
{
u32 matched;
+ ethernet_interface_t *ei = ethernet_get_interface (em, hi->hw_if_index);
matched = eth_identify_subint (hi, match_flags, main_intf, vlan_intf,
qinq_intf, new_sw_if_index, error0, is_l2);
@@ -223,7 +225,7 @@ identify_subint (vnet_hw_interface_t * hi,
// A unicast packet arriving on an L3 interface must have a dmac
// matching the interface mac. If interface has STATUS_L3 bit set
// mac filter is already done.
- if (!(*is_l2 || (hi->flags & ETHERNET_INTERFACE_FLAG_STATUS_L3)))
+ if (!(*is_l2 || (ei->flags & ETHERNET_INTERFACE_FLAG_STATUS_L3)))
{
u64 dmacs[2];
u8 dmacs_bad[2];
@@ -1331,7 +1333,7 @@ ethernet_input_inline (vlib_main_t * vm,
}
else
{
- if (hi->flags & ETHERNET_INTERFACE_FLAG_STATUS_L3)
+ if (ei->flags & ETHERNET_INTERFACE_FLAG_STATUS_L3)
goto skip_dmac_check01;
dmacs[0] = *(u64 *) e0;
@@ -1399,14 +1401,16 @@ ethernet_input_inline (vlib_main_t * vm,
&hi1,
&main_intf1, &vlan_intf1, &qinq_intf1);
- identify_subint (hi0,
+ identify_subint (em,
+ hi0,
b0,
match_flags0,
main_intf0,
vlan_intf0,
qinq_intf0, &new_sw_if_index0, &error0, &is_l20);
- identify_subint (hi1,
+ identify_subint (em,
+ hi1,
b1,
match_flags1,
main_intf1,
@@ -1573,7 +1577,7 @@ ethernet_input_inline (vlib_main_t * vm,
}
else
{
- if (hi->flags & ETHERNET_INTERFACE_FLAG_STATUS_L3)
+ if (ei->flags & ETHERNET_INTERFACE_FLAG_STATUS_L3)
goto skip_dmac_check0;
dmacs[0] = *(u64 *) e0;
@@ -1619,7 +1623,8 @@ ethernet_input_inline (vlib_main_t * vm,
&hi0,
&main_intf0, &vlan_intf0, &qinq_intf0);
- identify_subint (hi0,
+ identify_subint (em,
+ hi0,
b0,
match_flags0,
main_intf0,
--
2.28.0
From e04f4cd4790a9a3ae09e54ad0ac2bee1346cf26c Mon Sep 17 00:00:00 2001
From: Ivan Shvedunov <ivan.shvedunov@travelping.com>
Date: Thu, 19 Nov 2020 12:27:37 +0300
Subject: [PATCH] Follow symlinks while checking timestamps during builds
---
build-root/Makefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/build-root/Makefile b/build-root/Makefile
index e5db8b8fe..dba405f96 100644
--- a/build-root/Makefile
+++ b/build-root/Makefile
@@ -416,7 +416,7 @@ find_filter += -and -not -path '*/.mu_build_*'
find_newer_filtered_fn = \
(! -f $(1) \
|| -n $(call find_newer_files_fn,$(1),$(3)) \
- || -n "`find -H $(2) \
+ || -n "`find -L $(2) \
-type f \
-and -newer $(1) \
-and \( $(4) \) \
--
2.28.0
From 34262d4d56295b0872ad4e9a4a4791953f3fa444 Mon Sep 17 00:00:00 2001
From: Sergey Matov <sergey.matov@travelping.com>
Date: Tue, 15 Sep 2020 13:40:55 +0400
Subject: [PATCH] vlib: add decrement counter method
Currently there is no way to decrease simple counter. To extend
counters API new method allows to decrement counter by given value.
This might be useful in implementation of statistics stored in stats
segment.
Type: improvement
Change-Id: I7c08c62bffa6a2d50e9e2cf884f7b2d48538f34b
Signed-off-by: Sergey Matov <sergey.matov@travelping.com>
Signed-off-by: Dave Barach <dave@barachs.net>
---
diff --git a/src/vlib/counter.h b/src/vlib/counter.h
index 8a5aed4..04ab837 100644
--- a/src/vlib/counter.h
+++ b/src/vlib/counter.h
@@ -84,6 +84,25 @@
my_counters[index] += increment;
}
+/** Decrement a simple counter
+ @param cm - (vlib_simple_counter_main_t *) simple counter main pointer
+ @param thread_index - (u32) the current cpu index
+ @param index - (u32) index of the counter to increment
+ @param increment - (u64) quantitiy remove from the counter value
+*/
+always_inline void
+vlib_decrement_simple_counter (vlib_simple_counter_main_t * cm,
+ u32 thread_index, u32 index, u64 decrement)
+{
+ counter_t *my_counters;
+
+ my_counters = cm->counters[thread_index];
+
+ ASSERT (my_counters[index] >= decrement);
+
+ my_counters[index] -= decrement;
+}
+
/** Set a simple counter
@param cm - (vlib_simple_counter_main_t *) simple counter main pointer
@param thread_index - (u32) the current cpu index
From aa44336575dcf97bb9ce8277b045b96cafd67c3d Mon Sep 17 00:00:00 2001
From: Sergey Matov <sergey.matov@travelping.com>
Date: Mon, 23 Nov 2020 21:35:28 +0400
Subject: [PATCH] vppinfra: Refactor sparse_vec_free
Freeing of sparse vector does not flush header's specific
entities. This may result to a leak.
This commit improves vec_free logic for sparsed
vector cleanup.
Type: improvement
Change-Id: Ied161a4408447d57cade5266cad4e1660e967a88
Signed-off-by: Sergey Matov <sergey.matov@travelping.com>
---
diff --git a/src/vppinfra/sparse_vec.h b/src/vppinfra/sparse_vec.h
index 54a92ce..7fd1aff 100644
--- a/src/vppinfra/sparse_vec.h
+++ b/src/vppinfra/sparse_vec.h
@@ -223,7 +223,18 @@
*i1_return = is_member1 + d1;
}
-#define sparse_vec_free(v) vec_free(v)
+always_inline void
+sparse_vec_free (void *v) {
+ sparse_vec_header_t *h;
+
+ if (!v)
+ return;
+
+ h = sparse_vec_header (v);
+ vec_free (h->is_member_bitmap);
+ vec_free (h->member_counts);
+ vec_free_h (v, sizeof (h[0]));
+}
#define sparse_vec_elt_at_index(v,i) \
vec_elt_at_index ((v), sparse_vec_index ((v), (i)))
--- a/startup_debug.conf 2020-04-12 19:33:54.390008000 +0000
+++ b/startup_debug.conf 2020-04-12 19:45:16.742809000 +0000
@@ -17,7 +17,7 @@
}
plugins {
- path /usr/src/vpp/build-root/install-vpp_debug-native/vpp/lib/vpp_plugins/
+ path /upf/build-root/install-vpp_debug-native/vpp/lib/vpp_plugins/
plugin dpdk_plugin.so { disable }
plugin gtpu_plugin.so { disable }
plugin upf_plugin.so { enable }
From d9fa03eb175bde1066f8c14249d8bb487d8800e4 Mon Sep 17 00:00:00 2001
From: Andreas Schultz <andreas.schultz@travelping.com>
Date: Mon, 16 Mar 2020 17:00:29 +0100
Subject: [PATCH 1/7] CI and build infrastructure adjustments
---
Makefile | 5 +++++
build/external/Makefile | 2 +-
build/external/packages/dpdk.mk | 4 ++--
src/pkg/debian/control.in | 6 ++++--
4 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/Makefile b/Makefile
index cf4cfadec..a2eab953a 100644
--- a/Makefile
+++ b/Makefile
@@ -67,9 +67,12 @@ DEB_DEPENDS += libconfuse-dev git-review exuberant-ctags cscope pkg-config
DEB_DEPENDS += lcov chrpath autoconf indent clang-format libnuma-dev
DEB_DEPENDS += python3-all python3-setuptools check
DEB_DEPENDS += libboost-all-dev libffi-dev python3-ply libmbedtls-dev
+DEB_DEPENDS += liburcu-dev
DEB_DEPENDS += cmake ninja-build uuid-dev python3-jsonschema python3-yaml
+DEB_DEPENDS += cmake ninja-build uuid-dev python3-jsonschema python3-yaml yamllint
DEB_DEPENDS += python3-venv # ensurepip
DEB_DEPENDS += python3-dev # needed for python3 -m pip install psutil
+DEB_DEPENDS += libhyperscan-dev
# python3.6 on 16.04 requires python36-dev
LIBFFI=libffi6 # works on all but 20.04
@@ -141,6 +144,7 @@ endif
# +ganglia-devel if building the ganglia plugin
+RPM_DEPENDS += hyperscan-devel
RPM_DEPENDS += chrpath libffi-devel rpm-build
RPM_DEPENDS_DEBUG = glibc-debuginfo e2fsprogs-debuginfo
@@ -155,6 +159,7 @@ RPM_SUSE_BUILDTOOLS_DEPS += clang cmake indent libtool make ninja python3-ply
RPM_SUSE_DEVEL_DEPS = glibc-devel-static libnuma-devel
RPM_SUSE_DEVEL_DEPS += libopenssl-devel openssl-devel mbedtls-devel libuuid-devel
+RPM_SUSE_DEVEL_DEPS += hyperscan-devel
RPM_SUSE_PYTHON_DEPS = python-devel python3-devel python-pip python3-pip
RPM_SUSE_PYTHON_DEPS += python-rpm-macros python3-rpm-macros
diff --git a/build/external/Makefile b/build/external/Makefile
index b0e3cee4f..c2d94e5bd 100644
--- a/build/external/Makefile
+++ b/build/external/Makefile
@@ -20,7 +20,7 @@ MAKE_ARGS ?= -j
BUILD_DIR ?= $(CURDIR)/_build
INSTALL_DIR ?= $(CURDIR)/_install
PKG_VERSION ?= $(shell git describe --abbrev=0 | cut -d- -f1 | cut -dv -f2 | cut -d. -f1,2)
-PKG_SUFFIX ?= $(shell git log --oneline v$(PKG_VERSION)-rc0.. . | wc -l)
+PKG_SUFFIX ?= $(shell git log --oneline v$(PKG_VERSION)-rc0.. -- . | wc -l)
JOBS := $(if $(shell [ -f /proc/cpuinfo ] && head /proc/cpuinfo),\
$(shell grep -c ^processor /proc/cpuinfo), 2)
diff --git a/build/external/packages/dpdk.mk b/build/external/packages/dpdk.mk
index beabf48e9..99a5d9f14 100644
--- a/build/external/packages/dpdk.mk
+++ b/build/external/packages/dpdk.mk
@@ -202,11 +202,12 @@ $(B)/custom-config: $(B)/.dpdk-patch.ok Makefile
$(call set,RTE_LIBRTE_PMD_TAP,$(DPDK_TAP_PMD))
$(call set,RTE_LIBRTE_GSO,$(DPDK_TAP_PMD))
$(call set,RTE_LIBRTE_PMD_FAILSAFE,$(DPDK_FAILSAFE_PMD))
+ @# required for UPF
+ $(call set,RTE_LIBRTE_ACL,y)
@# not needed
$(call set,RTE_ETHDEV_RXTX_CALLBACKS,n)
$(call set,RTE_LIBRTE_CFGFILE,n)
$(call set,RTE_LIBRTE_LPM,n)
- $(call set,RTE_LIBRTE_ACL,n)
$(call set,RTE_LIBRTE_JOBSTATS,n)
$(call set,RTE_LIBRTE_EFD,n)
$(call set,RTE_LIBRTE_MEMBER,n)
@@ -219,7 +220,6 @@ $(B)/custom-config: $(B)/.dpdk-patch.ok Makefile
$(call set,RTE_LIBRTE_PIPELINE,n)
$(call set,RTE_LIBRTE_PMD_SOFTNIC,n)
$(call set,RTE_LIBRTE_FLOW_CLASSIFY,n)
- $(call set,RTE_LIBRTE_ACL,n)
$(call set,RTE_LIBRTE_GRO,n)
$(call set,RTE_LIBRTE_KNI,n)
$(call set,RTE_LIBRTE_BPF,n)
diff --git a/src/pkg/debian/control.in b/src/pkg/debian/control.in
index 0b0c621e5..2addf900e 100644
--- a/src/pkg/debian/control.in
+++ b/src/pkg/debian/control.in
@@ -51,7 +51,8 @@ Description: Vector Packet Processing--runtime libraries
Package: vpp-plugin-core
Architecture: any
Depends: vpp (= ${source:Version}),
- ${shlibs:Depends}
+ ${shlibs:Depends},
+ ${misc:Depends}
Description: Vector Packet Processing--runtime core plugins
This package contains VPP core plugins
.
@@ -59,7 +60,8 @@ Description: Vector Packet Processing--runtime core plugins
Package: vpp-plugin-dpdk
Architecture: any
Depends: vpp (= ${source:Version}),
- ${shlibs:Depends}
+ ${shlibs:Depends},
+ ${misc:Depends}
Description: Vector Packet Processing--runtime dpdk plugin
This package contains the VPP dpdk plugin
.
--
2.28.0
From 3daf9fc66400b566f60626ac8aa1c0f0a8f3d35a Mon Sep 17 00:00:00 2001
From: Andreas Schultz <andreas.schultz@travelping.com>
Date: Mon, 20 Apr 2020 09:45:24 +0200
Subject: [PATCH 2/7] Only install hyperscan on amd64
Hyperscan is only supported on Intel. Keep it simple and
test only for x86_64 (who is still using 32bit anyway?)
Change-Id: I73707d33860820e4cee0b95575c11756236466a4
---
Makefile | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/Makefile b/Makefile
index a2eab953a..841eb3bdf 100644
--- a/Makefile
+++ b/Makefile
@@ -72,7 +72,9 @@ DEB_DEPENDS += cmake ninja-build uuid-dev python3-jsonschema python3-yaml
DEB_DEPENDS += cmake ninja-build uuid-dev python3-jsonschema python3-yaml yamllint
DEB_DEPENDS += python3-venv # ensurepip
DEB_DEPENDS += python3-dev # needed for python3 -m pip install psutil
+ifeq ($(MACHINE),x86_64)
DEB_DEPENDS += libhyperscan-dev
+endif
# python3.6 on 16.04 requires python36-dev
LIBFFI=libffi6 # works on all but 20.04
@@ -144,7 +146,9 @@ endif
# +ganglia-devel if building the ganglia plugin
+ifeq ($(MACHINE),x86_64)
RPM_DEPENDS += hyperscan-devel
+endif
RPM_DEPENDS += chrpath libffi-devel rpm-build
RPM_DEPENDS_DEBUG = glibc-debuginfo e2fsprogs-debuginfo
@@ -159,7 +163,9 @@ RPM_SUSE_BUILDTOOLS_DEPS += clang cmake indent libtool make ninja python3-ply
RPM_SUSE_DEVEL_DEPS = glibc-devel-static libnuma-devel
RPM_SUSE_DEVEL_DEPS += libopenssl-devel openssl-devel mbedtls-devel libuuid-devel
+ifeq ($(MACHINE),x86_64)
RPM_SUSE_DEVEL_DEPS += hyperscan-devel
+endif
RPM_SUSE_PYTHON_DEPS = python-devel python3-devel python-pip python3-pip
RPM_SUSE_PYTHON_DEPS += python-rpm-macros python3-rpm-macros
--
2.28.0
From 24692e761d7ac74b4ef7d370b374b982740ad072 Mon Sep 17 00:00:00 2001
From: Ivan Shvedunov <ivan4th@gmail.com>
Date: Fri, 5 Jun 2020 01:41:55 +0300
Subject: [PATCH 3/7] Fix bad format_time_float usage
Was causing crashes with CLIB_DEBUG > 1
---
src/vlib/log.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/vlib/log.c b/src/vlib/log.c
index 342c0d25c..0cfdd2020 100644
--- a/src/vlib/log.c
+++ b/src/vlib/log.c
@@ -252,7 +252,7 @@ vlib_log_init (vlib_main_t * vm)
vec_validate (lm->entries, lm->size);
lm->log_class = vlib_log_register_class ("log", 0);
- u8 *tmp = format (NULL, "%U %-10U %-10U ", format_time_float, 0, (f64) 0,
+ u8 *tmp = format (NULL, "%U %-10U %-10U ", format_time_float, NULL, (f64) 0,
format_white_space, 255, format_white_space, 255);
log_main.indent = vec_len (tmp);
vec_free (tmp);
@@ -280,7 +280,7 @@ show_log (vlib_main_t * vm,
{
e = vec_elt_at_index (lm->entries, i);
vlib_cli_output (vm, "%U %-10U %-14U %v",
- format_time_float, 0, e->timestamp + time_offset,
+ format_time_float, NULL, e->timestamp + time_offset,
format_vlib_log_level, e->level,
format_vlib_log_class, e->class, e->string);
i = (i + 1) % lm->size;
--
2.28.0
From 03aa160f4e60bcf6e08fa2e00ed828d1a3ec5806 Mon Sep 17 00:00:00 2001
From: Ivan Shvedunov <ivan4th@gmail.com>
Date: Wed, 5 Aug 2020 16:44:28 +0300
Subject: [PATCH 4/7] [TEMP] Increase reassembly limit
This is an interim solution till we implement a proper CLI command
---
src/vnet/ip/reass/ip4_full_reass.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/vnet/ip/reass/ip4_full_reass.c b/src/vnet/ip/reass/ip4_full_reass.c
index 4d578c5ce..713e95629 100644
--- a/src/vnet/ip/reass/ip4_full_reass.c
+++ b/src/vnet/ip/reass/ip4_full_reass.c
@@ -32,7 +32,7 @@
#define IP4_REASS_TIMEOUT_DEFAULT_MS 100
#define IP4_REASS_EXPIRE_WALK_INTERVAL_DEFAULT_MS 10000 // 10 seconds default
#define IP4_REASS_MAX_REASSEMBLIES_DEFAULT 1024
-#define IP4_REASS_MAX_REASSEMBLY_LENGTH_DEFAULT 3
+#define IP4_REASS_MAX_REASSEMBLY_LENGTH_DEFAULT 8
#define IP4_REASS_HT_LOAD_FACTOR (0.75)
#define IP4_REASS_DEBUG_BUFFERS 0
--
2.28.0
From 1c1e42525ae28dfa7d8a145f6f78d10c3c4e6fa4 Mon Sep 17 00:00:00 2001
From: Ivan Shvedunov <ivan4th@gmail.com>
Date: Mon, 21 Sep 2020 19:13:15 +0300
Subject: [PATCH 5/7] Bump scapy to v2.4.4
---
test/requirements-2.txt | 4 ++--
test/requirements-3.txt | 4 ++--
test/requirements.txt | 2 +-
test/test_span.py | 3 ++-
4 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/test/requirements-2.txt b/test/requirements-2.txt
index 1f8b2bc3b..5c64bfc2a 100644
--- a/test/requirements-2.txt
+++ b/test/requirements-2.txt
@@ -265,8 +265,8 @@ scandir==1.10.0 \
--hash=sha256:b24086f2375c4a094a6b51e78b4cf7ca16c721dcee2eddd7aa6494b42d6d519d \
--hash=sha256:cb925555f43060a1745d0a321cca94bcea927c50114b623d73179189a4e100ac \
# via pathlib2
-scapy==2.4.3 ; python_version >= "2.7" or python_version >= "3.4" \
- --hash=sha256:e2f8d11f6a941c14a789ae8b236b27bd634681f1b29b5e893861e284d234f6b0 \
+scapy==2.4.4 ; python_version >= "2.7" or python_version >= "3.4" \
+ --hash=sha256:ecfd7a14cd9c3ef0eb08d28d5bb71d97219edff1454ccbdff229f676b27900ee \
# via -r requirements.txt
six==1.15.0 \
--hash=sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259 \
diff --git a/test/requirements-3.txt b/test/requirements-3.txt
index f955f37c4..9bc56a570 100644
--- a/test/requirements-3.txt
+++ b/test/requirements-3.txt
@@ -220,8 +220,8 @@ requests==2.23.0 \
--hash=sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee \
--hash=sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6 \
# via sphinx
-scapy==2.4.3 ; python_version >= "2.7" or python_version >= "3.4" \
- --hash=sha256:e2f8d11f6a941c14a789ae8b236b27bd634681f1b29b5e893861e284d234f6b0 \
+scapy==2.4.4 ; python_version >= "2.7" or python_version >= "3.4" \
+ --hash=sha256:ecfd7a14cd9c3ef0eb08d28d5bb71d97219edff1454ccbdff229f676b27900ee \
# via -r requirements.txt
six==1.15.0 \
--hash=sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259 \
diff --git a/test/requirements.txt b/test/requirements.txt
index e934bc042..23a7827d0 100644
--- a/test/requirements.txt
+++ b/test/requirements.txt
@@ -11,7 +11,7 @@ parameterized>=0.6.1 # BSD
pexpect # ISC
psutil # BSD
pycodestyle # MIT (Expat license) https://pypi.org/project/pycodestyle/
-scapy==2.4.3; python_version >= '2.7' or python_version >= '3.4' # GPL2 https://github.com/secdev/scapy/blob/master/LICENSE
+scapy==2.4.4; python_version >= '2.7' or python_version >= '3.4' # GPL2 https://github.com/secdev/scapy/blob/master/LICENSE
six # MIT
subprocess32 # PSF
syslog_rfc5424_parser>=0.3.1 # ISC
diff --git a/test/test_span.py b/test/test_span.py
index ecefe1537..d4918c21a 100644
--- a/test/test_span.py
+++ b/test/test_span.py
@@ -3,9 +3,10 @@
import unittest
from scapy.packet import Raw
-from scapy.layers.l2 import Ether, Dot1Q, GRE, ERSPAN
+from scapy.layers.l2 import Ether, Dot1Q, GRE
from scapy.layers.inet import IP, UDP
from scapy.layers.vxlan import VXLAN
+from scapy.contrib.erspan import ERSPAN
from framework import VppTestCase, VppTestRunner
from util import Host, ppp
--
2.28.0
From 7ff117b5df1f520e2d1d2d2a3dc3734c1b5c6d81 Mon Sep 17 00:00:00 2001
From: Ivan Shvedunov <ivan4th@gmail.com>
Date: Tue, 22 Sep 2020 01:28:37 +0300
Subject: [PATCH 6/7] Add downstream marker
---
.downstream-marker | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 .downstream-marker
diff --git a/.downstream-marker b/.downstream-marker
new file mode 100644
index 000000000..e69de29bb
--
2.28.0
From b9fc3c3bd35a6fa9f1c122c8a7a8aa56a1efdb35 Mon Sep 17 00:00:00 2001
From: Ivan Shvedunov <ivan4th@gmail.com>
Date: Thu, 15 Oct 2020 13:19:35 +0300
Subject: [PATCH 7/7] ethernet: fix Ethernet DMAC checks
Type: fix
Due to confusion between ethernet flags and hw interface flags, DMAC
filtering was not happening, most of the time.
Signed-off-by: Ivan Shvedunov <ivan4th@gmail.com>
Change-Id: I95209e1ea0f95f9be0b1a82ec9fcbc80955428d2
---
src/vnet/ethernet/node.c | 19 ++++++++++++-------
1 file changed, 12 insertions(+), 7 deletions(-)
diff --git a/src/vnet/ethernet/node.c b/src/vnet/ethernet/node.c
index 551754dca..73e9eec71 100644
--- a/src/vnet/ethernet/node.c
+++ b/src/vnet/ethernet/node.c
@@ -204,7 +204,8 @@ ethernet_input_inline_dmac_check (vnet_hw_interface_t * hi,
// vlan table lookups and vlan header parsing. Check the most specific
// matches first.
static_always_inline void
-identify_subint (vnet_hw_interface_t * hi,
+identify_subint (ethernet_main_t * em,
+ vnet_hw_interface_t * hi,
vlib_buffer_t * b0,
u32 match_flags,
main_intf_t * main_intf,
@@ -213,6 +214,7 @@ identify_subint (vnet_hw_interface_t * hi,
u32 * new_sw_if_index, u8 * error0, u32 * is_l2)
{
u32 matched;
+ ethernet_interface_t *ei = ethernet_get_interface (em, hi->hw_if_index);
matched = eth_identify_subint (hi, match_flags, main_intf, vlan_intf,
qinq_intf, new_sw_if_index, error0, is_l2);
@@ -223,7 +225,7 @@ identify_subint (vnet_hw_interface_t * hi,
// A unicast packet arriving on an L3 interface must have a dmac
// matching the interface mac. If interface has STATUS_L3 bit set
// mac filter is already done.
- if (!(*is_l2 || (hi->flags & ETHERNET_INTERFACE_FLAG_STATUS_L3)))
+ if (!(*is_l2 || (ei->flags & ETHERNET_INTERFACE_FLAG_STATUS_L3)))
{
u64 dmacs[2];
u8 dmacs_bad[2];
@@ -1331,7 +1333,7 @@ ethernet_input_inline (vlib_main_t * vm,
}
else
{
- if (hi->flags & ETHERNET_INTERFACE_FLAG_STATUS_L3)
+ if (ei->flags & ETHERNET_INTERFACE_FLAG_STATUS_L3)
goto skip_dmac_check01;
dmacs[0] = *(u64 *) e0;
@@ -1399,14 +1401,16 @@ ethernet_input_inline (vlib_main_t * vm,
&hi1,
&main_intf1, &vlan_intf1, &qinq_intf1);
- identify_subint (hi0,
+ identify_subint (em,
+ hi0,
b0,
match_flags0,
main_intf0,
vlan_intf0,
qinq_intf0, &new_sw_if_index0, &error0, &is_l20);
- identify_subint (hi1,
+ identify_subint (em,
+ hi1,
b1,
match_flags1,
main_intf1,
@@ -1573,7 +1577,7 @@ ethernet_input_inline (vlib_main_t * vm,
}
else
{
- if (hi->flags & ETHERNET_INTERFACE_FLAG_STATUS_L3)
+ if (ei->flags & ETHERNET_INTERFACE_FLAG_STATUS_L3)
goto skip_dmac_check0;
dmacs[0] = *(u64 *) e0;
@@ -1619,7 +1623,8 @@ ethernet_input_inline (vlib_main_t * vm,
&hi0,
&main_intf0, &vlan_intf0, &qinq_intf0);
- identify_subint (hi0,
+ identify_subint (em,
+ hi0,
b0,
match_flags0,
main_intf0,
--
2.28.0
From e04f4cd4790a9a3ae09e54ad0ac2bee1346cf26c Mon Sep 17 00:00:00 2001
From: Ivan Shvedunov <ivan.shvedunov@travelping.com>
Date: Thu, 19 Nov 2020 12:27:37 +0300
Subject: [PATCH] Follow symlinks while checking timestamps during builds
---
build-root/Makefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/build-root/Makefile b/build-root/Makefile
index e5db8b8fe..dba405f96 100644
--- a/build-root/Makefile
+++ b/build-root/Makefile
@@ -416,7 +416,7 @@ find_filter += -and -not -path '*/.mu_build_*'
find_newer_filtered_fn = \
(! -f $(1) \
|| -n $(call find_newer_files_fn,$(1),$(3)) \
- || -n "`find -H $(2) \
+ || -n "`find -L $(2) \
-type f \
-and -newer $(1) \
-and \( $(4) \) \
--
2.28.0
From 34262d4d56295b0872ad4e9a4a4791953f3fa444 Mon Sep 17 00:00:00 2001
From: Sergey Matov <sergey.matov@travelping.com>
Date: Tue, 15 Sep 2020 13:40:55 +0400
Subject: [PATCH] vlib: add decrement counter method
Currently there is no way to decrease simple counter. To extend
counters API new method allows to decrement counter by given value.
This might be useful in implementation of statistics stored in stats
segment.
Type: improvement
Change-Id: I7c08c62bffa6a2d50e9e2cf884f7b2d48538f34b
Signed-off-by: Sergey Matov <sergey.matov@travelping.com>
Signed-off-by: Dave Barach <dave@barachs.net>
---
diff --git a/src/vlib/counter.h b/src/vlib/counter.h
index 8a5aed4..04ab837 100644
--- a/src/vlib/counter.h
+++ b/src/vlib/counter.h
@@ -84,6 +84,25 @@
my_counters[index] += increment;
}
+/** Decrement a simple counter
+ @param cm - (vlib_simple_counter_main_t *) simple counter main pointer
+ @param thread_index - (u32) the current cpu index
+ @param index - (u32) index of the counter to increment
+ @param increment - (u64) quantitiy remove from the counter value
+*/
+always_inline void
+vlib_decrement_simple_counter (vlib_simple_counter_main_t * cm,
+ u32 thread_index, u32 index, u64 decrement)
+{
+ counter_t *my_counters;
+
+ my_counters = cm->counters[thread_index];
+
+ ASSERT (my_counters[index] >= decrement);
+
+ my_counters[index] -= decrement;
+}
+
/** Set a simple counter
@param cm - (vlib_simple_counter_main_t *) simple counter main pointer
@param thread_index - (u32) the current cpu index
From aa44336575dcf97bb9ce8277b045b96cafd67c3d Mon Sep 17 00:00:00 2001
From: Sergey Matov <sergey.matov@travelping.com>
Date: Mon, 23 Nov 2020 21:35:28 +0400
Subject: [PATCH] vppinfra: Refactor sparse_vec_free
Freeing of sparse vector does not flush header's specific
entities. This may result to a leak.
This commit improves vec_free logic for sparsed
vector cleanup.
Type: improvement
Change-Id: Ied161a4408447d57cade5266cad4e1660e967a88
Signed-off-by: Sergey Matov <sergey.matov@travelping.com>
---
diff --git a/src/vppinfra/sparse_vec.h b/src/vppinfra/sparse_vec.h
index 54a92ce..7fd1aff 100644
--- a/src/vppinfra/sparse_vec.h
+++ b/src/vppinfra/sparse_vec.h
@@ -223,7 +223,18 @@
*i1_return = is_member1 + d1;
}
-#define sparse_vec_free(v) vec_free(v)
+always_inline void
+sparse_vec_free (void *v) {
+ sparse_vec_header_t *h;
+
+ if (!v)
+ return;
+
+ h = sparse_vec_header (v);
+ vec_free (h->is_member_bitmap);
+ vec_free (h->member_counts);
+ vec_free_h (v, sizeof (h[0]));
+}
#define sparse_vec_elt_at_index(v,i) \
vec_elt_at_index ((v), sparse_vec_index ((v), (i)))
--- a/src/CMakeLists.txt 2020-04-12 19:33:54.160008000 +0000
+++ b/src/CMakeLists.txt 2020-04-12 19:35:51.608027000 +0000
@@ -53,7 +53,7 @@
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
if (CMAKE_BUILD_TYPE)
- set(CMAKE_C_FLAGS "-g -fPIC -Werror -Wall ${CMAKE_C_FLAGS}")
+ set(CMAKE_C_FLAGS "-g -fPIC -Wall ${CMAKE_C_FLAGS}")
endif()
if (compiler_flag_no_address_of_packed_member)
from scapy.all import *
from scapy.contrib.gtp import GTP_U_Header
data= "OpenairInterface Software Alliance - downlink"
sendp(Ether(src="02:42:c0:a8:40:c6",dst="00:0c:29:46:1f:53")/
IP(src="192.168.64.198",dst="20.20.20.20",version=4)/
UDP()/data, iface="sgi")
ip table add 1
ip table add 2
create host-interface name sgi
set interface mac address host-sgi 00:0c:29:46:1f:53
set interface mtu 1500 host-sgi
set interface ip table host-sgi 1
set interface ip address host-sgi 192.168.64.201/26
set interface state host-sgi up
create host-interface name core
set interface mac address host-core 00:0c:29:46:1f:54
set interface mtu 1500 host-core
set interface ip table host-core 0
set interface ip address host-core 192.168.63.201/26
set interface state host-core up
create host-interface name access
set interface mac address host-access 00:0c:29:46:1f:55
set interface mtu 1500 host-access
set interface ip table host-access 2
set interface ip address host-access 192.168.62.201/26
set interface state host-access up
ip route add 0.0.0.0/0 table 2 via 192.168.62.210 host-access
ip route add 0.0.0.0/0 table 0 via 192.168.63.196 host-core
ip route add 0.0.0.0/0 table 1 via 192.168.64.194 host-sgi
upf pfcp endpoint ip 192.168.63.201 vrf 0
upf nwi name core vrf 0
upf nwi name access vrf 2
upf nwi name sgi vrf 1
upf node-id ip4 192.168.63.201
upf specification release 16
trace add af-packet-input 100
upf gtpu endpoint ip 192.168.62.201 nwi access teid 0x000004d2/2
from scapy.all import *
from scapy.contrib.gtp import GTP_U_Header
data= "OpenairInterface Software Alliance"
sendp(Ether(src="02:42:c0:a8:3e:c6",dst="00:0c:29:46:1f:55")/
IP(src="192.168.62.198",dst="192.168.62.201")/
UDP(dport=2152)/GTP_U_Header(teid=9689)/
IP(src="10.10.10.10",dst="192.168.64.198",version=4)/
UDP()/data, iface="access")
## 1. Build vpp-upf
```git clone -b vpp-upf https://gitlab.eurecom.fr/oai/cn5g/oai-cn5g-upf-vpp.git```
```cd oai-cn5g-upf-vpp```
```docker build --tag vpp-upg:latest --file docker/Dockerfile .
<table style="border-collapse: collapse; border: none;">
<tr style="border-collapse: collapse; border: none;">
<td style="border-collapse: collapse; border: none;">
<a href="http://www.openairinterface.org/">
<img src="./images/oai_final_logo.png" alt="" border=3 height=50 width=150>
</img>
</a>
</td>
<td style="border-collapse: collapse; border: none; vertical-align: center;">
<b><font size = "5">OpenAirInterface Core Network Docker Deployment Home Page</font></b>
</td>
</tr>
</table>
**Table of Contents**
1. [Pre-requisites](./DEPLOY_PRE_REQUESITES.md)
2. [Building the Docker Images](./BUILD_IMAGE.md)
version: '3.8'
services:
mysql:
image: mysql:latest
container_name: mysql
networks:
public_net:
ipv4_address: 192.168.61.200
environment:
MYSQL_ROOT_PASSWORD: 'linux'
volumes:
- ./oai_db.sql:/oai_db.sql
oai_smf:
image: oai-smf:latest
container_name: oai-smf
privileged: true
networks:
public_net:
ipv4_address: 192.168.61.196
environment:
INSTANCE: 1
PID_DIRECTORY: /var/run
SMF_INTERFACE_NAME_FOR_N4: eth0
SMF_INTERFACE_NAME_FOR_SBI: eth0
SMF_INTERFACE_PORT_FOR_SBI: 80
SMF_INTERFACE_HTTP2_PORT_FOR_SBI: 8080
SMF_API_VERSION: v1
DEFAULT_DNS_IPV4_ADDRESS: 8.8.8.8
DEFAULT_DNS_SEC_IPV4_ADDRESS: 8.8.4.4
AMF_IPV4_ADDRESS: 192.168.61.195
AMF_PORT: 80
AMF_API_VERSION: v1
UDM_IPV4_ADDRESS: 192.168.61.194
UDM_PORT: 80
UDM_API_VERSION: v1
UPF_IPV4_ADDRESS: '192.168.61.201'
entrypoint: /bin/bash -c \
"./bin/entrypoint.sh; ./bin/oai_smf -o -c etc/smf.conf; sleep infinity"
healthcheck:
test: /bin/bash -c "pgrep oai_smf"
interval: 10s
timeout: 5s
retries: 5
oai_amf:
image: oai-amf:latest
container_name: oai-amf
privileged: true
networks:
public_net:
ipv4_address: 192.168.61.195
environment:
INSTANCE: 1
PID_DIRECTORY: /var/run
MCC: '208'
MNC: '95'
REGION_ID: '128'
AMF_SET_ID: 1
SERVED_GUAMI_MCC_0: '208'
SERVED_GUAMI_MCC_1: '460'
SERVED_GUAMI_MNC_0: '95'
SERVED_GUAMI_MNC_1: '11'
SERVED_GUAMI_REGION_ID_0: '95'
SERVED_GUAMI_REGION_ID_1: '11'
SERVED_GUAMI_AMF_SET_ID_0: '1'
SERVED_GUAMI_AMF_SET_ID_1: '1'
PLMN_SUPPORT_MCC: '208'
PLMN_SUPPORT_MNC: '95'
PLMN_SUPPORT_TAC: '0xa000'
SST_0: '222'
SST_1: '1'
SD_0: '123'
SD_1: '12'
SMF_INSTANCE_ID_0: 1
SMF_INSTANCE_ID_1: 2
SMF_IPV4_ADDR_0: 192.168.61.196
SMF_IPV4_ADDR_1: 127.0.0.1
SMF_HTTP_VERSION_0: v1
SMF_HTTP_VERSION_1: v1
AMF_INTERFACE_NAME_FOR_NGAP: eth0
AMF_INTERFACE_NAME_FOR_N11: eth0
AUSF_IPV4_ADDRESS: 192.168.61.205
AUSF_API_VERSION: 'v1'
AUSF_PORT: 80
NRF_IPV4_ADDRESS: 192.168.61.206
NRF_API_VERSION: 'v1'
NRF_PORT: 80
MYSQL_SERVER: 192.168.61.200
MYSQL_USER: 'root'
MYSQL_PASS: 'linux'
MYSQL_DB: 'oai_db'
OPERATOR_KEY: '63bfa50ee6523365ff14c1f45f88737d'
entrypoint: /bin/bash -c \
"./bin/entrypoint.sh; ./bin/oai_amf -o -c etc/amf.conf; sleep infinity"
healthcheck:
test: /bin/bash -c "pgrep oai_smf"
interval: 10s
timeout: 5s
retries: 5
oai-vpp:
image: vpp-upg:latest
privileged: true
container_name: oai-spgwu
networks:
public_net_access:
ipv4_address: 192.168.62.197
public_net:
ipv4_address: 192.168.61.197
public_net_sgi_lan:
ipv4_address: 192.168.63.197
volumes:
- ./upf_conf/init.conf:/openair-upf/bin/init.conf
- ./upf_conf/rc.local:/openair-upf/bin/rc.local
- ./upf_conf/startup_debug.conf:/openair-upf/bin/startup_debug.conf
entrypoint: /bin/bash -c \
"./rc.local; ./run.sh; sleep infinity"
oai_nat:
image: ubuntu:bionic
privileged: true
container_name: oai-nat
networks:
public_net_sgi_lan:
ipv4_address: 192.168.63.194
entrypoint: /bin/bash -c \
"apt update; apt install -y iptables iproute2;"\
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
"ip route add 12.1.1.0/24 via 192.168.63.197 dev eth0; sleep infinity"
networks:
public_net:
name: oai-public-net
ipam:
config:
- subnet: 192.168.61.192/26
public_net_access:
name: oai-public-access
ipam:
config:
- subnet: 192.168.62.192/26
public_net_sgi_lan:
name: oai-public-sgi-lan
ipam:
config:
- subnet: 192.168.63.192/26
This diff is collapsed.
ip table add 1
ip table add 2
create host-interface name sgi
set interface mac address host-sgi 00:0c:29:46:1f:53
set interface mtu 1500 host-sgi
set interface ip table host-sgi 1
set interface ip address host-sgi 192.168.63.201/26
set interface state host-sgi up
create host-interface name core
set interface mac address host-core 00:0c:29:46:1f:54
set interface mtu 1500 host-core
set interface ip table host-core 0
set interface ip address host-core 192.168.61.201/26
set interface state host-core up
create host-interface name access
set interface mac address host-access 00:0c:29:46:1f:55
set interface mtu 1500 host-access
set interface ip table host-access 2
set interface ip address host-access 192.168.62.201/26
set interface state host-access up
ip route add 0.0.0.0/0 table 2 via 192.168.62.210 host-access
ip route add 0.0.0.0/0 table 0 via 192.168.61.196 host-core
ip route add 0.0.0.0/0 table 1 via 192.168.63.194 host-sgi
upf pfcp endpoint ip 192.168.61.201 vrf 0
upf nwi name core vrf 0
upf nwi name access vrf 2
upf nwi name sgi vrf 1
upf specification release 16
trace add af-packet-input 100
upf gtpu endpoint ip 192.168.62.201 nwi access teid 0x000004d2/2
ip link set eth0 down
ip link set eth0 name access
ip link set access up
ip link set eth1 down
ip link set eth1 name core
ip link set core up
ip link set eth2 down
ip link set eth2 name sgi
ip link set sgi up
ip route add 10.10.10.0/24 via 192.168.63.198 dev sgi
ip route add 192.168.62.0/24 dev access
ip route add 192.168.61/24 dev core
ip route add 192.168.63.0/24 dev sgi
unix {
nodaemon
log /tmp/vpp.log
full-coredump
gid vpp
interactive
cli-listen /run/vpp/cli.sock
exec init.conf
}
api-trace {
on
}
api-segment {
gid vpp
}
plugins {
path /usr/lib/x86_64-linux-gnu/vpp_plugins/
plugin dpdk_plugin.so { disable }
plugin gtpu_plugin.so { disable }
plugin upf_plugin.so { enable }
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment