| {{/* |
| Copyright 2018-present Open Networking Foundation |
| Copyright 2018 Intel Corporation |
| |
| Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 |
| |
| 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. |
| */}} |
| --- |
| apiVersion: v1 |
| kind: ServiceAccount |
| metadata: |
| name: spgwc |
| labels: |
| {{ tuple "spgwc" . | include "omec-control-plane.metadata_labels" | indent 4 }} |
| --- |
| kind: Role |
| apiVersion: rbac.authorization.k8s.io/v1 |
| metadata: |
| name: spgwc |
| labels: |
| {{ tuple "spgwc" . | include "omec-control-plane.metadata_labels" | indent 4 }} |
| rules: |
| - apiGroups: [""] |
| resources: ["pods"] |
| verbs: ["get"] |
| --- |
| kind: RoleBinding |
| apiVersion: rbac.authorization.k8s.io/v1 |
| metadata: |
| name: spgwc |
| labels: |
| {{ tuple "spgwc" . | include "omec-control-plane.metadata_labels" | indent 4 }} |
| roleRef: |
| apiGroup: rbac.authorization.k8s.io |
| kind: Role |
| name: spgwc |
| subjects: |
| - kind: ServiceAccount |
| name: spgwc |
| --- |
| apiVersion: v1 |
| kind: ConfigMap |
| metadata: |
| name: spgwc |
| labels: |
| {{ tuple "spgwc" . | include "omec-control-plane.metadata_labels" | indent 4 }} |
| data: |
| launch.sh: | |
| #!/bin/bash -xe |
| |
| RUN_DIR=${RUN_DIR:-"/opt/cp"} |
| mkdir -p $RUN_DIR/config |
| cd $RUN_DIR/config |
| cp /etc/cp/config/{adc_rules.cfg,cp_config.cfg,interface.cfg,meter_profile.cfg,pcc_rules.cfg,sdf_rules.cfg} . |
| sed -i "s/CP_ADDR/$CP_ADDR/g" interface.cfg |
| sed -i "s/DP_ADDR/$DP_ADDR/g" interface.cfg |
| sed -i "s/DP_PORT/$DP_PORT/g" interface.cfg |
| . cp_config.cfg |
| ngic_controlplane $EAL_ARGS -- $APP_ARGS |
| cp_config.cfg: | |
| if [ ! -d "/dev/hugepages" ]; then |
| MEMORY="--no-huge -m $((MEM_LIMIT-1024))" |
| fi |
| SHARED_DIR="/opt/cp/config/shared" |
| if [ -d ${SHARED_DIR} ]; then |
| while [ ! -f ${SHARED_DIR}/SGW_S1U_IP ]; do echo "Waiting for SGW_S1U_IP"; sleep 2; done |
| SGW_S1U_IP=$(cat ${SHARED_DIR}/SGW_S1U_IP) |
| fi |
| until dig +short ${MME_S11_IP} | grep -v -e '^$' > /dev/null; do |
| echo "Waiting for MME"; |
| sleep 5; |
| done |
| |
| MGMT_INFO="-s ${CP_ADDR} -m ${MME_S11_IP} -w ${SGW_S1U_IP}" |
| APN_INFO="-i ${IP_POOL_IP} -p ${IP_POOL_MASK} -a ${APN}" |
| SPGW_CFG="-d 03 -l 2 -r 7.7.7.7 -g 6.6.6.6 -v 4.4.4.4 -u 5.5.5.5" |
| APP_ARGS="${MGMT_INFO} ${APN_INFO} ${SPGW_CFG} ${TEID_INFO}" |
| |
| CORES="-c $(taskset -p $$ | awk '{print $NF}')" |
| DEVICES="--no-pci" |
| EAL_ARGS="${CORES} ${MEMORY} ${DEVICES}" |
| interface.cfg: | |
| [0] |
| dp_comm_ip = DP_ADDR |
| dp_comm_port = DP_PORT |
| cp_comm_ip = CP_ADDR |
| cp_comm_port = 21 |
| adc_rules.cfg: | |
| [GLOBAL] |
| NUM_ADC_RULES = 5 |
| |
| ;FORMAT :: |
| ;ADC_TYPE : [ DOMAIN = 0 | IP = 1 | IP PREFIX =2 ] |
| ; |
| ;if ADC_TYPE = 0 |
| ; DOMAIN |
| ;elseif ADC_TYPE = 1 |
| ; IP |
| ;elseif ADC_TYPE = 2 |
| ; IP |
| ; PREFIX |
| ;else |
| ; NONE |
| ; |
| ;NOTE : |
| ;Rules defined first have a higher priority, unless DROP is specified |
| ;(i.e. multiple rules for the same IP). |
| ;When specifying DROP with an IP address, use a prefix of 32 to prevent DNS |
| ;results from overwriting rule. |
| |
| |
| [ADC_RULE_1] |
| ADC_TYPE = 1 |
| IP = 13.1.1.111 |
| |
| [ADC_RULE_2] |
| ADC_TYPE = 2 |
| IP = 13.1.1.0 |
| PREFIX = 24 |
| |
| [ADC_RULE_3] |
| ADC_TYPE = 1 |
| IP = 13.1.1.112 |
| PREFIX = 24 |
| |
| [ADC_RULE_4] |
| ADC_TYPE = 0 |
| DOMAIN = www.example.gov |
| |
| [ADC_RULE_5] |
| ADC_TYPE = 0 |
| DOMAIN = www.drop_example.com |
| meter_profile.cfg: | |
| [GLOBAL] |
| NUM_OF_IDX = 7 |
| |
| [ENTRY_1] |
| ;Committed Information Rate (CIR). Measured in bytes per second. |
| ;MBR is mapped into CIR, convert MBR from bits to Bytes and set CIR. |
| CIR = 2342400 |
| ;Committed Burst Size unit = Bytes |
| CBS = 5856 |
| ;Excess Burst Size unit = Bytes |
| EBS = 11712 |
| ;Meter profile index. Refer this index in static_pcc.cfg to set AMBR/MBR |
| MTR_PROFILE_IDX = 3 |
| |
| [ENTRY_2] |
| ;1200 = 1756800 |
| ;1400 = 2049600 |
| ;1600 = 2342400 |
| CIR = 2342400 |
| CBS = 5856 |
| EBS = 11712 |
| MTR_PROFILE_IDX = 4 |
| |
| [ENTRY_3] |
| ; QCI5,QCI7 15.571kbps = 1947 B |
| CIR = 2342400 |
| CBS = 5856 |
| EBS = 11712 |
| MTR_PROFILE_IDX = 5 |
| |
| [ENTRY_4] |
| ; QCI1, 44kbps = 5500 B |
| CIR = 2342400 |
| CBS = 5856 |
| EBS = 11712 |
| MTR_PROFILE_IDX = 6 |
| |
| [ENTRY_5] |
| ; QCI9, 31.143kbps = 3893 B |
| CIR = 2342400 |
| CBS = 5856 |
| EBS = 11712 |
| MTR_PROFILE_IDX = 7 |
| |
| [ENTRY_6] |
| ; 128B, 7pps |
| CIR = 2342400 |
| CBS = 512 |
| EBS = 1024 |
| MTR_PROFILE_IDX = 8 |
| |
| [ENTRY_7] |
| ; 128B, 2pps |
| CIR = 2342400 |
| CBS = 512 |
| EBS = 1024 |
| MTR_PROFILE_IDX = 9 |
| |
| pcc_rules.cfg: | |
| [GLOBAL] |
| NUM_PCC_FILTERS = 9 |
| ;To config AMBR/MBR values refer meter_profile.cfg. specify only the |
| ;meter profile index to be set here. |
| UL_AMBR_MTR_PROFILE_IDX = 3 |
| DL_AMBR_MTR_PROFILE_IDX = 4 |
| |
| ;default filter - must be first for now (until DP doesn't install any filters) |
| ;associated with default adc rule |
| [PCC_FILTER_1] |
| RULE_NAME = DefaultRule |
| RATING_GROUP = 9 |
| SERVICE_ID = 0 |
| RULE_STATUS = 0 |
| GATE_STATUS = 1 |
| SESSION_CONT = 0 |
| REPORT_LEVEL = 1 |
| CHARGING_MODE = 0 |
| METERING_METHOD = 0 |
| MUTE_NOTIFY = 0 |
| MONITORING_KEY = 0 |
| SPONSOR_ID = 0 |
| REDIRECT_INFO = 0 |
| PRECEDENCE = 254 |
| DROP_PKT_COUNT = 0 |
| ;Specify the meter profile index from meter_profile.cfg |
| UL_MBR_MTR_PROFILE_IDX = 7 |
| DL_MBR_MTR_PROFILE_IDX = 7 |
| ;List of ADC filter indices |
| SDF_FILTER_IDX = 99998 |
| |
| [PCC_FILTER_2] |
| RULE_NAME = sdf_rule_1 |
| RATING_GROUP = 5 |
| SERVICE_ID = 0 |
| RULE_STATUS = 0 |
| GATE_STATUS = 1 |
| SESSION_CONT = 0 |
| REPORT_LEVEL = 2 |
| CHARGING_MODE = 0 |
| METERING_METHOD = 0 |
| MUTE_NOTIFY = 0 |
| MONITORING_KEY = 0 |
| SPONSOR_ID = 0 |
| REDIRECT_INFO = 0 |
| PRECEDENCE = 1 |
| DROP_PKT_COUNT = 0 |
| UL_MBR_MTR_PROFILE_IDX = 5 |
| DL_MBR_MTR_PROFILE_IDX = 5 |
| ;List of SDF filter indices |
| SDF_FILTER_IDX = 1 |
| |
| [PCC_FILTER_3] |
| RULE_NAME = sdf_rule_2 |
| RATING_GROUP = 1 |
| SERVICE_ID = 0 |
| RULE_STATUS = 0 |
| GATE_STATUS = 1 |
| SESSION_CONT = 0 |
| REPORT_LEVEL = 3 |
| CHARGING_MODE = 0 |
| METERING_METHOD = 0 |
| MUTE_NOTIFY = 0 |
| MONITORING_KEY = 0 |
| SPONSOR_ID = 0 |
| REDIRECT_INFO = 0 |
| PRECEDENCE = 18 |
| DROP_PKT_COUNT = 0 |
| UL_MBR_MTR_PROFILE_IDX = 6 |
| DL_MBR_MTR_PROFILE_IDX = 6 |
| ;List of SDF filter indices |
| SDF_FILTER_IDX = 2 |
| |
| [PCC_FILTER_4] |
| RULE_NAME = adc_rule_1 |
| RATING_GROUP = Zero-Rate |
| SERVICE_ID = Internet |
| RULE_STATUS = 0 |
| GATE_STATUS = 1 |
| SESSION_CONT = 0 |
| REPORT_LEVEL = 8 |
| CHARGING_MODE = 0 |
| METERING_METHOD = 0 |
| MUTE_NOTIFY = 0 |
| MONITORING_KEY = 0 |
| REDIRECT_INFO = 0 |
| SPONSOR_ID = Example |
| PRECEDENCE = 15 |
| DROP_PKT_COUNT = 0 |
| UL_MBR_MTR_PROFILE_IDX = 7 |
| DL_MBR_MTR_PROFILE_IDX = 7 |
| ;List of SDF filter indices |
| ADC_FILTER_IDX = 1 |
| |
| [PCC_FILTER_5] |
| RULE_NAME = adc_rule_2 |
| RATING_GROUP = 0 |
| SERVICE_ID = CIPA |
| RULE_STATUS = 0 |
| GATE_STATUS = 1 |
| SESSION_CONT = 0 |
| REPORT_LEVEL = 9 |
| CHARGING_MODE = 0 |
| METERING_METHOD = 0 |
| MUTE_NOTIFY = 0 |
| MONITORING_KEY = 0 |
| SPONSOR_ID = Example |
| REDIRECT_INFO = 0 |
| SPONSOR_ID = Example |
| REDIRECT_INFO = 0 |
| PRECEDENCE = 4 |
| DROP_PKT_COUNT = 0 |
| UL_MBR_MTR_PROFILE_IDX = 0 |
| DL_MBR_MTR_PROFILE_IDX = 0 |
| ;List of SDF filter indices |
| ADC_FILTER_IDX = 2 |
| |
| [PCC_FILTER_6] |
| RULE_NAME = sdf_rule_3 |
| RATING_GROUP = 7 |
| SERVICE_ID = 0 |
| RULE_STATUS = 0 |
| GATE_STATUS = 1 |
| SESSION_CONT = 0 |
| REPORT_LEVEL = 4 |
| CHARGING_MODE = 0 |
| METERING_METHOD = 0 |
| MUTE_NOTIFY = 0 |
| MONITORING_KEY = 0 |
| SPONSOR_ID = 0 |
| REDIRECT_INFO = 0 |
| PRECEDENCE = 17 |
| DROP_PKT_COUNT = 0 |
| UL_MBR_MTR_PROFILE_IDX = 5 |
| DL_MBR_MTR_PROFILE_IDX = 5 |
| ;List of SDF filter indices |
| SDF_FILTER_IDX = 3 |
| |
| [PCC_FILTER_7] |
| RULE_NAME = adc_rule_3 |
| RATING_GROUP = Zero-Rate |
| SERVICE_ID = Internet |
| RULE_STATUS = 0 |
| GATE_STATUS = 1 |
| SESSION_CONT = 0 |
| REPORT_LEVEL = 5 |
| CHARGING_MODE = 0 |
| METERING_METHOD = 0 |
| MUTE_NOTIFY = 0 |
| MONITORING_KEY = 0 |
| SPONSOR_ID = Example |
| REDIRECT_INFO = 0 |
| PRECEDENCE = 210 |
| DROP_PKT_COUNT = 0 |
| UL_MBR_MTR_PROFILE_IDX = 7 |
| DL_MBR_MTR_PROFILE_IDX = 7 |
| ;List of SDF filter indices |
| ADC_FILTER_IDX = 4 |
| |
| [PCC_FILTER_8] |
| RULE_NAME = adc_rule_4 |
| RATING_GROUP = Zero-Rate |
| SERVICE_ID = Management |
| RULE_STATUS = 0 |
| GATE_STATUS = 1 |
| SESSION_CONT = 0 |
| REPORT_LEVEL = 6 |
| CHARGING_MODE = 0 |
| METERING_METHOD = 0 |
| MUTE_NOTIFY = 0 |
| MONITORING_KEY = 0 |
| SPONSOR_ID = Example |
| REDIRECT_INFO = 0 |
| PRECEDENCE = 200 |
| DROP_PKT_COUNT = 0 |
| UL_MBR_MTR_PROFILE_IDX = 7 |
| DL_MBR_MTR_PROFILE_IDX = 7 |
| ;List of SDF filter indices |
| ADC_FILTER_IDX = 12 |
| |
| [PCC_FILTER_9] |
| RULE_NAME = adc_rule_5 |
| RATING_GROUP = Zero-Rate |
| SERVICE_ID = Provisioning |
| RULE_STATUS = 0 |
| GATE_STATUS = 1 |
| SESSION_CONT = 0 |
| REPORT_LEVEL = 7 |
| CHARGING_MODE = 0 |
| METERING_METHOD = 0 |
| MUTE_NOTIFY = 0 |
| MONITORING_KEY = 0 |
| SPONSOR_ID = Example |
| REDIRECT_INFO = 0 |
| PRECEDENCE = 220 |
| DROP_PKT_COUNT = 0 |
| UL_MBR_MTR_PROFILE_IDX = 7 |
| DL_MBR_MTR_PROFILE_IDX = 7 |
| ;List of SDF filter indices |
| ADC_FILTER_IDX = 3 |
| sdf_rules.cfg: | |
| [GLOBAL] |
| NUM_SDF_FILTERS = 4 |
| |
| [SDF_FILTER_1] |
| DIRECTION = downlink_only |
| IPV4_REMOTE = 13.2.1.113 |
| IPV4_REMOTE_MASK = 255.255.255.0 |
| PROTOCOL = 17 |
| LOCAL_LOW_LIMIT_PORT = 0 |
| LOCAL_HIGH_LIMIT_PORT = 65535 |
| REMOTE_LOW_LIMIT_PORT = 0 |
| REMOTE_HIGH_LIMIT_PORT = 65535 |
| |
| [SDF_FILTER_2] |
| DIRECTION = uplink_only |
| IPV4_LOCAL = 16.255.255.0 |
| IPV4_LOCAL_MASK = 255.255.255.0 |
| PROTOCOL = 17 |
| LOCAL_LOW_LIMIT_PORT = 0 |
| LOCAL_HIGH_LIMIT_PORT = 65535 |
| REMOTE_LOW_LIMIT_PORT = 0 |
| REMOTE_HIGH_LIMIT_PORT = 65535 |
| |
| [SDF_FILTER_3] |
| DIRECTION = downlink_only |
| IPV4_REMOTE = 130.10.0.0 |
| IPV4_REMOTE_MASK = 255.255.0.0 |
| PROTOCOL = 17 |
| REMOTE_LOW_LIMIT_PORT = 5060 |
| REMOTE_HIGH_LIMIT_PORT = 5060 |
| |
| [SDF_FILTER_4] |
| DIRECTION = uplink_only |
| IPV4_REMOTE = 103.1.0.0 |
| IPV4_REMOTE_MASK = 255.255.0.0 |
| PROTOCOL = 17 |
| LOCAL_LOW_LIMIT_PORT = 17000 |
| LOCAL_HIGH_LIMIT_PORT = 17010 |
| --- |
| apiVersion: v1 |
| kind: Service |
| metadata: |
| name: spgwc |
| labels: |
| {{ tuple "spgwc" . | include "omec-control-plane.metadata_labels" | indent 4 }} |
| spec: |
| selector: |
| {{ tuple "spgwc" . | include "omec-control-plane.metadata_labels" | indent 4 }} |
| clusterIP: None |
| ports: |
| - name: s11 |
| port: 2123 |
| protocol: UDP |
| - name: cpdp |
| port: 21 |
| protocol: UDP |
| --- |
| apiVersion: apps/v1 |
| kind: StatefulSet |
| metadata: |
| name: spgwc |
| labels: |
| {{ tuple "spgwc" . | include "omec-control-plane.metadata_labels" | indent 4 }} |
| spec: |
| replicas: 1 |
| selector: |
| matchLabels: |
| {{ tuple "spgwc" . | include "omec-control-plane.metadata_labels" | indent 6 }} |
| serviceName: spgwc |
| template: |
| metadata: |
| labels: |
| {{ tuple "spgwc" . | include "omec-control-plane.metadata_labels" | indent 8 }} |
| spec: |
| {{- if .Values.nodeSelectors.enabled }} |
| nodeSelector: |
| {{ .Values.nodeSelectors.spgwc.label }}: {{ .Values.nodeSelectors.spgwc.value }} |
| {{- end }} |
| serviceAccountName: spgwc |
| initContainers: |
| - name: init-spgwc |
| image: {{ .Values.images.tags.init }} |
| command: ["/bin/sh", "-co", "pipefail"] |
| args: |
| - until $(kubectl get pod -ojson spgwu-0 2>/dev/null | jq -r '.metadata.annotations["k8s.v1.cni.cncf.io/networks-status"]' | jq -r '.[] | select(.name=="s1u-net") | .ips[0]' > /opt/cp/config/shared/SGW_S1U_IP | [ -s /opt/cp/config/shared/SGW_S1U_IP ]); |
| do echo "waiting for SPGWU"; sleep 2; done |
| volumeMounts: |
| - name: shared-data |
| mountPath: /opt/cp/config/shared |
| containers: |
| - name: spgwc |
| image: {{ .Values.images.tags.spgwc }} |
| imagePullPolicy: {{ .Values.images.pullPolicy }} |
| stdin: true |
| tty: true |
| command: ["/opt/cp/scripts/launch.sh"] |
| env: |
| - name: MEM_LIMIT |
| valueFrom: |
| resourceFieldRef: |
| containerName: spgwc |
| resource: limits.memory |
| divisor: 1Mi |
| - name: CP_ADDR |
| valueFrom: |
| fieldRef: |
| fieldPath: status.podIP |
| - name: DP_ADDR |
| value: {{ .Values.config.spgwc.spgwu.addr | quote }} |
| - name: DP_PORT |
| value: {{ .Values.config.spgwc.spgwu.port | quote }} |
| - name: MME_S11_IP |
| value: {{ tuple "mme" "identity" . | include "omec-control-plane.endpoint_lookup" | quote }} |
| - name: APN |
| value: apn1 |
| - name: IP_POOL_IP |
| value: "16.0.0.0" |
| - name: IP_POOL_MASK |
| value: "255.0.0.0" |
| {{- if .Values.resources.enabled }} |
| resources: |
| {{ toYaml .Values.resources.spgwc | indent 10 }} |
| {{- end }} |
| volumeMounts: |
| - name: cp-script |
| mountPath: /opt/cp/scripts/launch.sh |
| subPath: launch.sh |
| - name: cp-config |
| mountPath: /etc/cp/config |
| - name: shared-data |
| mountPath: /opt/cp/config/shared |
| volumes: |
| - name: cp-script |
| configMap: |
| name: spgwc |
| defaultMode: 493 |
| - name: cp-config |
| configMap: |
| name: spgwc |
| defaultMode: 420 |
| - name: shared-data |
| emptyDir: {} |