diff options
author | Johnson Li <johnson.li@intel.com> | 2017-09-13 15:14:36 +0800 |
---|---|---|
committer | root <rujun.li@intel.com> | 2017-09-14 18:21:20 +0800 |
commit | f667e12f3e030d3f71ca06a5d6c7320be4c44ea3 (patch) | |
tree | 13b8016538b7413b86a58cef3b8d25a252460f82 | |
parent | cfa92004069aa3b6cb667654351e7dd70ab0bc1e (diff) |
Add patch for BRG and scripts to set the NAT rule
Add Framework codes for the vCPE VNFs
Issue-ID: INT-80
Change-Id: I312aef9631636f0e2273f482f5db44ca93a55983
Signed-off-by: Johnson Li <johnson.li@intel.com>
Signed-off-by: root <rujun.li@intel.com>
20 files changed, 28146 insertions, 6 deletions
diff --git a/heat/vCPE/vbng/base_vcpe_vbng_rackspace.env b/heat/vCPE/vbng/base_vcpe_vbng_rackspace.env index e50d4834..cc391c49 100644 --- a/heat/vCPE/vbng/base_vcpe_vbng_rackspace.env +++ b/heat/vCPE/vbng/base_vcpe_vbng_rackspace.env @@ -13,7 +13,7 @@ cpe_signal_private_net_cidr: 10.4.0.0/24 vbng_private_ip_0: 10.3.0.1 vbng_private_ip_1: 10.0.101.10 - vbng_private_ip_2: 10.4.0.3
+ vbng_private_ip_2: 10.4.0.3 vbng_private_ip_3: 10.1.0.10 vbng_name_0: zdcpe1cpe01bng01 vnf_id: vCPE_Infrastructure_Metro_vBNG_demo_app @@ -27,3 +27,6 @@ key_name: vbng_key pub_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQXYJYYi3/OUZXUiCYWdtc7K0m5C0dJKVxPG0eI8EWZrEHYdfYe6WoTSDJCww+1qlBSpA5ac/Ba4Wn9vh+lR1vtUKkyIC/nrYb90ReUd385Glkgzrfh5HdR5y5S2cL/Frh86lAn9r6b3iWTJD8wBwXFyoe1S2nMTOIuG4RPNvfmyCTYVh8XTCCE8HPvh3xv2r4egawG1P4Q4UDwk+hDBXThY2KS8M5/8EMyxHV0ImpLbpYCTBA6KYDIRtqmgS6iKyy8v2D1aSY5mc9J0T5t9S2Gv+VZQNWQDDKNFnxqYaAo1uEoq/i1q63XC5AD3ckXb2VT6dp23BQMdDfbHyUWfJN cloud_env: rackspace + vpp_source_repo_url: https://gerrit.fd.io/r/vpp + vpp_source_repo_branch: stable/1704 + vpp_patch_url: https://gerrit.onap.org/r/#/c/11083/5/vnfs/vCPE/vpp-radius-client-for-vbng/src/patches/Vpp-Integrate-FreeRADIUS-Client-for-vBNG.patch diff --git a/heat/vCPE/vbng/base_vcpe_vbng_rackspace.yaml b/heat/vCPE/vbng/base_vcpe_vbng_rackspace.yaml index d5c0eed8..8a49e171 100644 --- a/heat/vCPE/vbng/base_vcpe_vbng_rackspace.yaml +++ b/heat/vCPE/vbng/base_vcpe_vbng_rackspace.yaml @@ -145,6 +145,18 @@ parameters: type: string label: Cloud environment description: Cloud environment (e.g., openstack, rackspace) + vpp_source_repo_url: + type: string + label: VPP Source Git Repo + description: URL for VPP source codes + vpp_source_repo_branch: + type: string + label: VPP Source Git Branch + description: Git Branch for the VPP source codes + vpp_patch_url: + type: string + label: VPP Patch URL + description: URL for VPP patch for vBNG ############# # # @@ -240,6 +252,9 @@ resources: __demo_artifacts_version__ : { get_param: demo_artifacts_version } __install_script_version__ : { get_param: install_script_version } __cloud_env__ : { get_param: cloud_env } + __vpp_source_repo_url__ : { get_param: vpp_source_repo_url } + __vpp_source_repo_branch__ : { get_param: vpp_source_repo_branch } + __vpp_patch_url__ : { get_param: vpp_patch_url } template: | #!/bin/bash @@ -260,6 +275,9 @@ resources: echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt echo "__install_script_version__" > /opt/config/install_script_version.txt echo "__cloud_env__" > /opt/config/cloud_env.txt + echo "__vpp_source_repo_url__" > /opt/config/vpp_source_repo_url.txt + echo "__vpp_source_repo_branch__" > /opt/config/vpp_source_repo_branch.txt + echo "__vpp_patch_url__" > /opt/config/vpp_patch_url.txt # Download and run install script curl -k __repo_url_blob__/org.onap.demo/vnfs/vcpe/__install_script_version__/v_bng_install.sh -o /opt/v_bng_install.sh diff --git a/heat/vCPE/vbrgemu/base_vcpe_vbrgemu_rackspace.env b/heat/vCPE/vbrgemu/base_vcpe_vbrgemu_rackspace.env index acfcfa59..719e7c9b 100644 --- a/heat/vCPE/vbrgemu/base_vcpe_vbrgemu_rackspace.env +++ b/heat/vCPE/vbrgemu/base_vcpe_vbrgemu_rackspace.env @@ -7,7 +7,8 @@ vbrgemu_bng_private_net_cidr: 10.3.0.0/24 vbrgemu_private_net_cidr: 192.168.1.0/24 vbrgemu_private_ip_0: 10.3.0.2 - vbrgemu_private_ip_1: 192.168.1.1
+ vbrgemu_private_ip_1: 192.168.1.1 + sdnc_ip: 10.0.7.1 vbrgemu_name_0: zdcpe1cpe01brgemu01 vnf_id: vCPE_Infrastructure_BGREMU_demo_app vf_module_id: vCPE_Customer_BRGEMU @@ -18,3 +19,8 @@ key_name: vbrgemu_key pub_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQXYJYYi3/OUZXUiCYWdtc7K0m5C0dJKVxPG0eI8EWZrEHYdfYe6WoTSDJCww+1qlBSpA5ac/Ba4Wn9vh+lR1vtUKkyIC/nrYb90ReUd385Glkgzrfh5HdR5y5S2cL/Frh86lAn9r6b3iWTJD8wBwXFyoe1S2nMTOIuG4RPNvfmyCTYVh8XTCCE8HPvh3xv2r4egawG1P4Q4UDwk+hDBXThY2KS8M5/8EMyxHV0ImpLbpYCTBA6KYDIRtqmgS6iKyy8v2D1aSY5mc9J0T5t9S2Gv+VZQNWQDDKNFnxqYaAo1uEoq/i1q63XC5AD3ckXb2VT6dp23BQMdDfbHyUWfJN cloud_env: rackspace + vpp_source_repo_url: https://gerrit.fd.io/r/vpp + vpp_source_repo_branch: stable/1704 + hc2vpp_source_repo_url: https://gerrit.fd.io/r/hc2vpp + hc2vpp_source_repo_branch: stable/1704 + vpp_patch_url: https://gerrit.onap.org/r/#/c/11083/5/vnfs/vCPE/vpp-option-82-for-vbrg/src/patches/VPP-Add-Option82-Nat-Filter-For-vBRG.patch diff --git a/heat/vCPE/vbrgemu/base_vcpe_vbrgemu_rackspace.yaml b/heat/vCPE/vbrgemu/base_vcpe_vbrgemu_rackspace.yaml index 6f926eb5..a6f42ba2 100644 --- a/heat/vCPE/vbrgemu/base_vcpe_vbrgemu_rackspace.yaml +++ b/heat/vCPE/vbrgemu/base_vcpe_vbrgemu_rackspace.yaml @@ -111,6 +111,26 @@ parameters: type: string label: Cloud environment description: Cloud environment (e.g., openstack, rackspace) + vpp_source_repo_url: + type: string + label: VPP Source Git Repo + description: URL for VPP source codes + vpp_source_repo_branch: + type: string + label: VPP Source Git Branch + description: Git Branch for the VPP source codes + hc2vpp_source_repo_url: + type: string + label: Honeycomb Source Git Repo + description: URL for Honeycomb source codes + hc2vpp_source_repo_branch: + type: string + label: Honeycomb Source Git Branch + description: Git Branch for the Honeycomb source codes + vpp_patch_url: + type: string + label: VPP Patch URL + description: URL for VPP patch for vBRG Emulator ############# # # @@ -187,6 +207,11 @@ resources: __demo_artifacts_version__ : { get_param: demo_artifacts_version } __install_script_version__ : { get_param: install_script_version } __cloud_env__ : { get_param: cloud_env } + __vpp_source_repo_url__ : { get_param: vpp_source_repo_url } + __vpp_source_repo_branch__ : { get_param: vpp_source_repo_branch } + __hc2vpp_source_repo_url__ : { get_param: hc2vpp_source_repo_url } + __hc2vpp_source_repo_branch__ : { get_param: hc2vpp_source_repo_branch } + __vpp_patch_url__ : { get_param: vpp_patch_url } template: | #!/bin/bash @@ -200,6 +225,12 @@ resources: echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt echo "__install_script_version__" > /opt/config/install_script_version.txt echo "__cloud_env__" > /opt/config/cloud_env.txt + echo "__vpp_source_repo_url__" > /opt/config/vpp_source_repo_url.txt + echo "__vpp_source_repo_branch__" > /opt/config/vpp_source_repo_branch.txt + echo "__hc2vpp_source_repo_url__" > /opt/config/hc2vpp_source_repo_url.txt + echo "__hc2vpp_source_repo_branch__" > /opt/config/hc2vpp_source_repo_branch.txt + echo "__vpp_patch_url__" > /opt/config/vpp_patch_url.txt + echo "__sdnc_ip__" > /opt/config/ip.txt # Download and run install script curl -k __repo_url_blob__/org.onap.demo/vnfs/vcpe/__install_script_version__/v_brgemu_install.sh -o /opt/v_brgemu_install.sh diff --git a/heat/vCPE/vgmux/base_vcpe_vgmux_rackspace.env b/heat/vCPE/vgmux/base_vcpe_vgmux_rackspace.env index c6b20f9c..de15d1b5 100644 --- a/heat/vCPE/vgmux/base_vcpe_vgmux_rackspace.env +++ b/heat/vCPE/vgmux/base_vcpe_vgmux_rackspace.env @@ -24,3 +24,9 @@ key_name: vbng_key pub_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQXYJYYi3/OUZXUiCYWdtc7K0m5C0dJKVxPG0eI8EWZrEHYdfYe6WoTSDJCww+1qlBSpA5ac/Ba4Wn9vh+lR1vtUKkyIC/nrYb90ReUd385Glkgzrfh5HdR5y5S2cL/Frh86lAn9r6b3iWTJD8wBwXFyoe1S2nMTOIuG4RPNvfmyCTYVh8XTCCE8HPvh3xv2r4egawG1P4Q4UDwk+hDBXThY2KS8M5/8EMyxHV0ImpLbpYCTBA6KYDIRtqmgS6iKyy8v2D1aSY5mc9J0T5t9S2Gv+VZQNWQDDKNFnxqYaAo1uEoq/i1q63XC5AD3ckXb2VT6dp23BQMdDfbHyUWfJN cloud_env: rackspace + vpp_source_repo_url: https://gerrit.fd.io/r/vpp + vpp_source_repo_branch: stable/1704 + hc2vpp_source_repo_url: https://gerrit.fd.io/r/hc2vpp + hc2vpp_source_repo_branch: stable/1704 + vpp_patch_url: https://gerrit.onap.org/r/#/c/11083/5/vnfs/vCPE/vpp-ves-agent-for-vgmux/src/patches/Vpp-Add-VES-agent-for-vG-MUX.patch + h2vpp_patch_url: https://gerrit.onap.org/r/#/c/11083/5/vnfs/vCPE/vpp-ves-agent-for-vgmux/src/patches/Hc2vpp-Add-VES-agent-for-vG-MUX.patch diff --git a/heat/vCPE/vgmux/base_vcpe_vgmux_rackspace.yaml b/heat/vCPE/vgmux/base_vcpe_vgmux_rackspace.yaml index b6e212a1..6cbaef11 100644 --- a/heat/vCPE/vgmux/base_vcpe_vgmux_rackspace.yaml +++ b/heat/vCPE/vgmux/base_vcpe_vgmux_rackspace.yaml @@ -133,6 +133,30 @@ parameters: type: string label: Cloud environment description: Cloud environment (e.g., openstack, rackspace) + vpp_source_repo_url: + type: string + label: VPP Source Git Repo + description: URL for VPP source codes + vpp_source_repo_branch: + type: string + label: VPP Source Git Branch + description: Git Branch for the VPP source codes + hc2vpp_source_repo_url: + type: string + label: Honeycomb Source Git Repo + description: URL for Honeycomb source codes + hc2vpp_source_repo_branch: + type: string + label: Honeycomb Source Git Branch + description: Git Branch for the Honeycomb source codes + vpp_patch_url: + type: string + label: VPP Patch URL + description: URL for VPP patch for vG-MUX + hc2vpp_patch_url: + type: string + label: Honeycomb Patch URL + description: URL for Honeycomb patch for vG-MUX ############# # # @@ -230,6 +254,12 @@ resources: __demo_artifacts_version__ : { get_param: demo_artifacts_version } __install_script_version__ : { get_param: install_script_version } __cloud_env__ : { get_param: cloud_env } + __vpp_source_repo_url__ : { get_param: vpp_source_repo_url } + __vpp_source_repo_branch__ : { get_param: vpp_source_repo_branch } + __hc2vpp_source_repo_url__ : { get_param: hc2vpp_source_repo_url } + __hc2vpp_source_repo_branch__ : { get_param: hc2vpp_source_repo_branch } + __vpp_patch_url__ : { get_param: vpp_patch_url } + __hc2vpp_patch_url__ : { get_param: hc2vpp_patch_url } template: | #!/bin/bash @@ -246,6 +276,12 @@ resources: echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt echo "__install_script_version__" > /opt/config/install_script_version.txt echo "__cloud_env__" > /opt/config/cloud_env.txt + echo "__vpp_source_repo_url__" > /opt/config/vpp_source_repo_url.txt + echo "__vpp_source_repo_branch__" > /opt/config/vpp_source_repo_branch.txt + echo "__vpp_patch_url__" > /opt/config/vpp_patch_url.txt + echo "__hc2vpp_source_repo_url__" > /opt/config/hc2vpp_source_repo_url.txt + echo "__hc2vpp_source_repo_branch__" > /opt/config/hc2vpp_source_repo_branch.txt + echo "__hc2vpp_patch_url__" > /opt/config/hc2vpp_patch_url.txt # Download and run install script curl -k __repo_url_blob__/org.onap.demo/vnfs/vcpe/__install_script_version__/v_gmux_install.sh -o /opt/v_gmux_install.sh diff --git a/heat/vCPE/vgw/base_vcpe_vgw_rackspace.env b/heat/vCPE/vgw/base_vcpe_vgw_rackspace.env index 93096f2d..c2a1b643 100644 --- a/heat/vCPE/vgw/base_vcpe_vgw_rackspace.env +++ b/heat/vCPE/vgw/base_vcpe_vgw_rackspace.env @@ -24,3 +24,7 @@ key_name: vgw_key pub_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQXYJYYi3/OUZXUiCYWdtc7K0m5C0dJKVxPG0eI8EWZrEHYdfYe6WoTSDJCww+1qlBSpA5ac/Ba4Wn9vh+lR1vtUKkyIC/nrYb90ReUd385Glkgzrfh5HdR5y5S2cL/Frh86lAn9r6b3iWTJD8wBwXFyoe1S2nMTOIuG4RPNvfmyCTYVh8XTCCE8HPvh3xv2r4egawG1P4Q4UDwk+hDBXThY2KS8M5/8EMyxHV0ImpLbpYCTBA6KYDIRtqmgS6iKyy8v2D1aSY5mc9J0T5t9S2Gv+VZQNWQDDKNFnxqYaAo1uEoq/i1q63XC5AD3ckXb2VT6dp23BQMdDfbHyUWfJN cloud_env: rackspace + vpp_source_repo_url: https://gerrit.fd.io/r/vpp + vpp_source_repo_branch: stable/1704 + hc2vpp_source_repo_url: https://gerrit.fd.io/r/hc2vpp + hc2vpp_source_repo_branch: stable/1704 diff --git a/heat/vCPE/vgw/base_vcpe_vgw_rackspace.yaml b/heat/vCPE/vgw/base_vcpe_vgw_rackspace.yaml index 0621556a..d8fe4cde 100644 --- a/heat/vCPE/vgw/base_vcpe_vgw_rackspace.yaml +++ b/heat/vCPE/vgw/base_vcpe_vgw_rackspace.yaml @@ -133,6 +133,22 @@ parameters: type: string label: Cloud environment description: Cloud environment (e.g., openstack, rackspace) + vpp_source_repo_url: + type: string + label: VPP Source Git Repo + description: URL for VPP source codes + vpp_source_repo_branch: + type: string + label: VPP Source Git Branch + description: Git Branch for the VPP source codes + hc2vpp_source_repo_url: + type: string + label: Honeycomb Source Git Repo + description: URL for Honeycomb source codes + hc2vpp_source_repo_branch: + type: string + label: Honeycomb Source Git Branch + description: Git Branch for the Honeycomb source codes ############# # # @@ -207,6 +223,10 @@ resources: __demo_artifacts_version__ : { get_param: demo_artifacts_version } __install_script_version__ : { get_param: install_script_version } __cloud_env__ : { get_param: cloud_env } + __vpp_source_repo_url__ : { get_param: vpp_source_repo_url } + __vpp_source_repo_branch__ : { get_param: vpp_source_repo_branch } + __hc2vpp_source_repo_url__ : { get_param: hc2vpp_source_repo_url } + __hc2vpp_source_repo_branch__ : { get_param: hc2vpp_source_repo_branch } template: | #!/bin/bash @@ -222,6 +242,10 @@ resources: echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt echo "__install_script_version__" > /opt/config/install_script_version.txt echo "__cloud_env__" > /opt/config/cloud_env.txt + echo "__vpp_source_repo_url__" > /opt/config/vpp_source_repo_url.txt + echo "__vpp_source_repo_branch__" > /opt/config/vpp_source_repo_branch.txt + echo "__hc2vpp_source_repo_url__" > /opt/config/hc2vpp_source_repo_url.txt + echo "__hc2vpp_source_repo_branch__" > /opt/config/hc2vpp_source_repo_branch.txt # Download and run install script curl -k __repo_url_blob__/org.onap.demo/vnfs/vcpe/__install_script_version__/v_gw_install.sh -o /opt/v_gw_install.sh diff --git a/vnfs/vCPE/scripts/v_bng_init.sh b/vnfs/vCPE/scripts/v_bng_init.sh index a9bf588e..6fb2eadc 100644 --- a/vnfs/vCPE/scripts/v_bng_init.sh +++ b/vnfs/vCPE/scripts/v_bng_init.sh @@ -1 +1,4 @@ #!/bin/bash + +systemctl start vpp + diff --git a/vnfs/vCPE/scripts/v_bng_install.sh b/vnfs/vCPE/scripts/v_bng_install.sh index 8f035b44..02025b2e 100644 --- a/vnfs/vCPE/scripts/v_bng_install.sh +++ b/vnfs/vCPE/scripts/v_bng_install.sh @@ -4,6 +4,9 @@ REPO_URL_BLOB=$(cat /opt/config/repo_url_blob.txt) REPO_URL_ARTIFACTS=$(cat /opt/config/repo_url_artifacts.txt) DEMO_ARTIFACTS_VERSION=$(cat /opt/config/demo_artifacts_version.txt) INSTALL_SCRIPT_VERSION=$(cat /opt/config/install_script_version.txt) +VPP_SOURCE_REPO_URL=$(cat /opt/config/vpp_source_repo_url.txt) +VPP_SOURCE_REPO_BRANCH=$(cat /opt/config/vpp_source_repo_branch.txt) +VPP_PATCH_URL=$(cat /opt/config/vpp_patch_url.txt) CLOUD_ENV=$(cat /opt/config/cloud_env.txt) # Convert Network CIDR to Netmask @@ -74,6 +77,274 @@ apt-get update apt-get install --allow-unauthenticated -y wget openjdk-8-jdk apt-transport-https ca-certificates g++ libcurl4-gnutls-dev sleep 1 +# Install the tools required for download codes +apt-get install -y expect git patch + +#Download and build the VPP codes +cd /opt +git clone ${VPP_SOURCE_REPO_URL} -b ${VPP_SOURCE_REPO_BRANCH} vpp +wget -O Vpp-Integrate-FreeRADIUS-Client-for-vBNG.patch ${VPP_PATCH_URL} + +cd vpp +patch -p1 < Vpp-Integrate-FreeRADIUS-Client-for-vBNG.patch +expect -c " + set timeout 60; + spawn make install-dep; + expect { + \"Do you want to continue?*\" {send \"Y\r\"; interact} + } +" + +cd build-root +./bootstrap.sh +make V=0 PLATFORM=vpp TAG=vpp install-deb + +# Install the FreeRADIUS client since we need the lib +cd /opt +git clone https://github.com/FreeRADIUS/freeradius-client.git +cd freeradius-client +./configure +make && make install +cd /usr/local/lib && ln -s -f libfreeradius-client.so.2.0.0 libfreeradiusclient.so +ldconfig + +# Install the VPP package +cd /opt/vpp/build-root +dpkg -i *.deb +systemctl stop vpp + +# Auto-start configuration for the VPP +cat > /etc/vpp/startup.conf << EOF + +unix { + nodaemon + log /tmp/vpp.log + full-coredump + cli-listen localhost:5002 + startup-config /etc/vpp/setup.gate +} + +api-trace { + on +} + +api-segment { + gid vpp +} + +cpu { + ## In the VPP there is one main thread and optionally the user can create worker(s) + ## The main thread and worker thread(s) can be pinned to CPU core(s) manually or automatically + + ## Manual pinning of thread(s) to CPU core(s) + + ## Set logical CPU core where main thread runs + # main-core 1 + + ## Set logical CPU core(s) where worker threads are running + # corelist-workers 2-3,18-19 + + ## Automatic pinning of thread(s) to CPU core(s) + + ## Sets number of CPU core(s) to be skipped (1 ... N-1) + ## Skipped CPU core(s) are not used for pinning main thread and working thread(s). + ## The main thread is automatically pinned to the first available CPU core and worker(s) + ## are pinned to next free CPU core(s) after core assigned to main thread + # skip-cores 4 + + ## Specify a number of workers to be created + ## Workers are pinned to N consecutive CPU cores while skipping "skip-cores" CPU core(s) + ## and main thread's CPU core + # workers 2 + + ## Set scheduling policy and priority of main and worker threads + + ## Scheduling policy options are: other (SCHED_OTHER), batch (SCHED_BATCH) + ## idle (SCHED_IDLE), fifo (SCHED_FIFO), rr (SCHED_RR) + # scheduler-policy fifo + + ## Scheduling priority is used only for "real-time policies (fifo and rr), + ## and has to be in the range of priorities supported for a particular policy + # scheduler-priority 50 +} + +# dpdk { + ## Change default settings for all intefaces + # dev default { + ## Number of receive queues, enables RSS + ## Default is 1 + # num-rx-queues 3 + + ## Number of transmit queues, Default is equal + ## to number of worker threads or 1 if no workers treads + # num-tx-queues 3 + + ## Number of descriptors in transmit and receive rings + ## increasing or reducing number can impact performance + ## Default is 1024 for both rx and tx + # num-rx-desc 512 + # num-tx-desc 512 + + ## VLAN strip offload mode for interface + ## Default is off + # vlan-strip-offload on + # } + + ## Whitelist specific interface by specifying PCI address + # dev 0000:02:00.0 + + ## Whitelist specific interface by specifying PCI address and in + ## addition specify custom parameters for this interface + # dev 0000:02:00.1 { + # num-rx-queues 2 + # } + + ## Change UIO driver used by VPP, Options are: igb_uio, vfio-pci + ## and uio_pci_generic (default) + # uio-driver vfio-pci + + ## Disable mutli-segment buffers, improves performance but + ## disables Jumbo MTU support + # no-multi-seg + + ## Increase number of buffers allocated, needed only in scenarios with + ## large number of interfaces and worker threads. Value is per CPU socket. + ## Default is 16384 + # num-mbufs 128000 + + ## Change hugepages allocation per-socket, needed only if there is need for + ## larger number of mbufs. Default is 256M on each detected CPU socket + # socket-mem 2048,2048 +# } + +EOF + +cat > /etc/vpp/setup.gate << EOF +set int state GigabitEthernet0/8/0 up +set interface ip address GigabitEthernet0/8/0 10.4.0.4/24 + +set int state GigabitEthernet0/9/0 up +set interface ip address GigabitEthernet0/9/0 10.4.0.3/24 + +set vbng dhcp4 remote 10.4.0.1 local 10.4.0.3 +set vbng aaa config /etc/vpp/vbng-aaa.cfg nas-port 5060 +EOF + +cat > /etc/vpp/vbng-aaa.cfg << EOF +# General settings + +# specify which authentication comes first respectively which +# authentication is used. possible values are: "radius" and "local". +# if you specify "radius,local" then the RADIUS server is asked +# first then the local one. if only one keyword is specified only +# this server is asked. +auth_order radius,local + +# maximum login tries a user has +login_tries 2 + +# timeout for all login tries +# if this time is exceeded the user is kicked out +login_timeout 5 + +# name of the nologin file which when it exists disables logins. +# it may be extended by the ttyname which will result in +# a terminal specific lock (e.g. /etc/nologin.ttyS2 will disable +# logins on /dev/ttyS2) +nologin /etc/nologin + +# name of the issue file. it's only display when no username is passed +# on the radlogin command line +issue /usr/local/etc/radiusclient/issue + +# RADIUS settings + +# RADIUS server to use for authentication requests. this config +# item can appear more then one time. if multiple servers are +# defined they are tried in a round robin fashion if one +# server is not answering. +# optionally you can specify a the port number on which is remote +# RADIUS listens separated by a colon from the hostname. if +# no port is specified /etc/services is consulted of the radius +# service. if this fails also a compiled in default is used. +#authserver 10.4.0.2 +authserver localhost + +# RADIUS server to use for accouting requests. All that I +# said for authserver applies, too. +# +#acctserver 10.4.0.2 +acctserver localhost + +# file holding shared secrets used for the communication +# between the RADIUS client and server +servers /usr/local/etc/radiusclient/servers + +# dictionary of allowed attributes and values +# just like in the normal RADIUS distributions +dictionary /usr/local/etc/radiusclient/dictionary + +# program to call for a RADIUS authenticated login +login_radius /usr/local/sbin/login.radius + +# file which holds sequence number for communication with the +# RADIUS server +seqfile /var/run/radius.seq + +# file which specifies mapping between ttyname and NAS-Port attribute +mapfile /usr/local/etc/radiusclient/port-id-map + +# default authentication realm to append to all usernames if no +# realm was explicitly specified by the user +# the radiusd directly form Livingston doesnt use any realms, so leave +# it blank then +default_realm + +# time to wait for a reply from the RADIUS server +radius_timeout 10 + +# resend request this many times before trying the next server +radius_retries 3 + +# The length of time in seconds that we skip a nonresponsive RADIUS +# server for transaction requests. Server(s) being in the "dead" state +# are tried only after all other non-dead servers have been tried and +# failed or timeouted. The deadtime interval starts when the server +# does not respond to an authentication/accounting request transmissions. +# When the interval expires, the "dead" server would be re-tried again, +# and if it's still down then it will be considered "dead" for another +# such interval and so on. This option is no-op if there is only one +# server in the list. Set to 0 in order to disable the feature. +radius_deadtime 0 + +# local address from which radius packets have to be sent +bindaddr * + +# LOCAL settings + +# program to execute for local login +# it must support the -f flag for preauthenticated login +login_local /bin/login +EOF + +cat >> /usr/local/etc/radiusclient/dictionary << EOF + +# +# DHCP Proxy/Relay attributes +# +ATTRIBUTE DHCP-Agent-Circuit-Id 82.1 integer +ATTRIBUTE DHCP-Agent-Remote-Id 82.2 string +ATTRIBUTE DHCP-Relay-Circuit-Id 82.1 integer +ATTRIBUTE DHCP-Relay-Remote-Id 82.2 string + +EOF + +cat >> /usr/local/etc/radiusclient/servers << EOF +10.4.0.2 testing123 +localhost/localhost testing123 + +EOF + # Download DHCP config files cd /opt wget $REPO_URL_BLOB/org.onap.demo/vnfs/vcpe/$INSTALL_SCRIPT_VERSION/v_bng_init.sh @@ -95,4 +366,4 @@ then reboot fi -./v_bng_init.sh
\ No newline at end of file +./v_bng_init.sh diff --git a/vnfs/vCPE/scripts/v_brgemu_init.sh b/vnfs/vCPE/scripts/v_brgemu_init.sh index a9bf588e..1bf8a500 100644 --- a/vnfs/vCPE/scripts/v_brgemu_init.sh +++ b/vnfs/vCPE/scripts/v_brgemu_init.sh @@ -1 +1,6 @@ #!/bin/bash + +systemctl start vpp +systemctl start honeycomb + +/opt/set_nat.sh diff --git a/vnfs/vCPE/scripts/v_brgemu_install.sh b/vnfs/vCPE/scripts/v_brgemu_install.sh index 71d9dffb..c4626a41 100644 --- a/vnfs/vCPE/scripts/v_brgemu_install.sh +++ b/vnfs/vCPE/scripts/v_brgemu_install.sh @@ -4,6 +4,11 @@ REPO_URL_BLOB=$(cat /opt/config/repo_url_blob.txt) REPO_URL_ARTIFACTS=$(cat /opt/config/repo_url_artifacts.txt) DEMO_ARTIFACTS_VERSION=$(cat /opt/config/demo_artifacts_version.txt) INSTALL_SCRIPT_VERSION=$(cat /opt/config/install_script_version.txt) +VPP_SOURCE_REPO_URL=$(cat /opt/config/vpp_source_repo_url.txt) +VPP_SOURCE_REPO_BRANCH=$(cat /opt/config/vpp_source_repo_branch.txt) +VPP_PATCH_URL=$(cat /opt/config/vpp_patch_url.txt) +HC2VPP_SOURCE_REPO_URL=$(cat /opt/config/hc2vpp_source_repo_url.txt) +HC2VPP_SOURCE_REPO_BRANCH=$(cat /opt/config/hc2vpp_source_repo_branch.txt) CLOUD_ENV=$(cat /opt/config/cloud_env.txt) # Convert Network CIDR to Netmask @@ -44,6 +49,341 @@ apt-get update apt-get install --allow-unauthenticated -y wget openjdk-8-jdk apt-transport-https ca-certificates g++ libcurl4-gnutls-dev sleep 1 +# Install the tools required for download codes +apt-get install -y expect git patch + +#Download and build the VPP codes +cd /opt +git clone ${VPP_SOURCE_REPO_URL} -b ${VPP_SOURCE_REPO_BRANCH} vpp +wget -O VPP-Add-Option82-Nat-Filter-For-vBRG.patch ${VPP_PATCH_URL} + +cd vpp +patch -p1 < ../VPP-Add-Option82-Nat-Filter-For-vBRG.patch +expect -c " + set timeout 60; + spawn make install-dep; + expect { + \"Do you want to continue?*\" {send \"Y\r\"; interact} + } +" + +cd build-root +./bootstrap.sh +make V=0 PLATFORM=vpp TAG=vpp install-deb + +# Install the VPP package +dpkg -i *.deb +systemctl stop vpp + +# Auto-start configuration for the VPP +cat > /etc/vpp/startup.conf << EOF + +unix { + nodaemon + log /tmp/vpp.log + full-coredump + cli-listen localhost:5002 + startup-config /etc/vpp/setup.gate +} + +api-trace { + on +} + +api-segment { + gid vpp +} + +cpu { + ## In the VPP there is one main thread and optionally the user can create worker(s) + ## The main thread and worker thread(s) can be pinned to CPU core(s) manually or automatically + + ## Manual pinning of thread(s) to CPU core(s) + + ## Set logical CPU core where main thread runs + # main-core 1 + + ## Set logical CPU core(s) where worker threads are running + # corelist-workers 2-3,18-19 + + ## Automatic pinning of thread(s) to CPU core(s) + + ## Sets number of CPU core(s) to be skipped (1 ... N-1) + ## Skipped CPU core(s) are not used for pinning main thread and working thread(s). + ## The main thread is automatically pinned to the first available CPU core and worker(s) + ## are pinned to next free CPU core(s) after core assigned to main thread + # skip-cores 4 + + ## Specify a number of workers to be created + ## Workers are pinned to N consecutive CPU cores while skipping "skip-cores" CPU core(s) + ## and main thread's CPU core + # workers 2 + + ## Set scheduling policy and priority of main and worker threads + + ## Scheduling policy options are: other (SCHED_OTHER), batch (SCHED_BATCH) + ## idle (SCHED_IDLE), fifo (SCHED_FIFO), rr (SCHED_RR) + # scheduler-policy fifo + + ## Scheduling priority is used only for "real-time policies (fifo and rr), + ## and has to be in the range of priorities supported for a particular policy + # scheduler-priority 50 +} + +# dpdk { + ## Change default settings for all intefaces + # dev default { + ## Number of receive queues, enables RSS + ## Default is 1 + # num-rx-queues 3 + + ## Number of transmit queues, Default is equal + ## to number of worker threads or 1 if no workers treads + # num-tx-queues 3 + + ## Number of descriptors in transmit and receive rings + ## increasing or reducing number can impact performance + ## Default is 1024 for both rx and tx + # num-rx-desc 512 + # num-tx-desc 512 + + ## VLAN strip offload mode for interface + ## Default is off + # vlan-strip-offload on + # } + + ## Whitelist specific interface by specifying PCI address + # dev 0000:02:00.0 + + ## Whitelist specific interface by specifying PCI address and in + ## addition specify custom parameters for this interface + # dev 0000:02:00.1 { + # num-rx-queues 2 + # } + + ## Change UIO driver used by VPP, Options are: igb_uio, vfio-pci + ## and uio_pci_generic (default) + # uio-driver vfio-pci + + ## Disable mutli-segment buffers, improves performance but + ## disables Jumbo MTU support + # no-multi-seg + + ## Increase number of buffers allocated, needed only in scenarios with + ## large number of interfaces and worker threads. Value is per CPU socket. + ## Default is 16384 + # num-mbufs 128000 + + ## Change hugepages allocation per-socket, needed only if there is need for + ## larger number of mbufs. Default is 256M on each detected CPU socket + # socket-mem 2048,2048 +# } + +EOF + +cat > /etc/vpp/setup.gate << EOF +set int state GigabitEthernet0/8/0 up +set dhcp client intfc GigabitEthernet0/8/0 hostname brg-emulator + +tap connect lstack +set int state tap-0 up + +set interface l2 bridge tap-0 10 0 +set bridge-domain arp term 10 +EOF + +cat >> /opt/config/ip.txt << EOF +hcip: 192.168.1.20 +EOF + +#set nat rule +cat > /opt/set_nat.sh << EOF +#! /bin/bash + +while : +do + if [[ ! $(ps -aux | grep [[:alnum:]]*/vpp/startup.conf | wc -l) = 2 ]]; then + #echo "vpp not running" + continue + fi + flag=0 + while read -r line + do + if [ flag = 0 ]; then + re=${line#*/[0-9]/[0-9]} + if [ "$line" != "$re" ]; then + flag=1 + else + flag=0 + continue + fi + else + ip=${line%/*} + if [[ $ip = *\.*\.*\.* ]]; then + #echo "ip address is $ip" + if [ ! -f /opt/config/ip.txt ]; then + echo "file /opt/config/ip.txt doesn't exists" + continue + fi + while read -r tap_ip + do + if [[ $tap_ip = hcip* ]]; then + tap_ip=${tap_ip#*" "} + echo "hc tap ip address is $tap_ip" + vppctl snat add static mapping local $tap_ip external $ip + exit 0 + fi + done < /opt/config/ip.txt + else + if [[ ! $ip = */[0-9] ]]; then + flag=0 + #echo "not correct" + fi + fi + fi + done < <(vppctl show int addr) + sleep 1 +done +EOF +# Download and install HC2VPP from source +cd /opt +git clone ${HC2VPP_SOURCE_REPO_URL} -b ${HC2VPP_SOURCE_REPO_BRANCH} hc2vpp + +apt-get install -y maven +cat > ~/.m2/settings.xml << EOF +<?xml version="1.0" encoding="UTF-8"?> +<!-- vi: set et smarttab sw=2 tabstop=2: --> +<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> + + <profiles> + <profile> + <id>fd.io-release</id> + <repositories> + <repository> + <id>fd.io-mirror</id> + <name>fd.io-mirror</name> + <url>https://nexus.fd.io/content/groups/public/</url> + <releases> + <enabled>true</enabled> + <updatePolicy>never</updatePolicy> + </releases> + <snapshots> + <enabled>false</enabled> + </snapshots> + </repository> + </repositories> + <pluginRepositories> + <pluginRepository> + <id>fd.io-mirror</id> + <name>fd.io-mirror</name> + <url>https://nexus.fd.io/content/repositories/public/</url> + <releases> + <enabled>true</enabled> + <updatePolicy>never</updatePolicy> + </releases> + <snapshots> + <enabled>false</enabled> + </snapshots> + </pluginRepository> + </pluginRepositories> + </profile> + + <profile> + <id>fd.io-snapshots</id> + <repositories> + <repository> + <id>fd.io-snapshot</id> + <name>fd.io-snapshot</name> + <url>https://nexus.fd.io/content/repositories/fd.io.snapshot/</url> + <releases> + <enabled>false</enabled> + </releases> + <snapshots> + <enabled>true</enabled> + </snapshots> + </repository> + </repositories> + <pluginRepositories> + <pluginRepository> + <id>fd.io-snapshot</id> + <name>fd.io-snapshot</name> + <url>https://nexus.fd.io/content/repositories/fd.io.snapshot/</url> + <releases> + <enabled>false</enabled> + </releases> + <snapshots> + <enabled>true</enabled> + </snapshots> + </pluginRepository> + </pluginRepositories> + </profile> + <profile> + <id>opendaylight-snapshots</id> + <repositories> + <repository> + <id>opendaylight-snapshot</id> + <name>opendaylight-snapshot</name> + <url>https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url> + <releases> + <enabled>false</enabled> + </releases> + <snapshots> + <enabled>true</enabled> + </snapshots> + </repository> + </repositories> + <pluginRepositories> + <pluginRepository> + <id>opendaylight-shapshot</id> + <name>opendaylight-snapshot</name> + <url>https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url> + <releases> + <enabled>false</enabled> + </releases> + <snapshots> + <enabled>true</enabled> + </snapshots> + </pluginRepository> + </pluginRepositories> + </profile> + </profiles> + + <activeProfiles> + <activeProfile>fd.io-release</activeProfile> + <activeProfile>fd.io-snapshots</activeProfile> + <activeProfile>opendaylight-snapshots</activeProfile> + </activeProfiles> +</settings> +EOF + +cd hc2vpp +mvn clean install +l_version=$(cat pom.xml | grep "<version>" | head -1) +l_version=$(echo "${l_version%<*}") +l_version=$(echo "${l_version#*>}") +mv vpp-integration/minimal-distribution/target/vpp-integration-distribution-${l_version}-hc/vpp-integration-distribution-${l_version} /opt/honeycomb +sed -i 's/127.0.0.1/0.0.0.0/g' /opt/honeycomb/config/honeycomb.json + +# Create systemctl service for Honeycomb +cat > /etc/systemd/system/honeycomb.service << EOF +[Unit] +Description=Honeycomb Agent for the VPP control plane +Documentation=https://wiki.fd.io/view/Honeycomb +Requires=vpp.service +After=vpp.service + +[Service] +ExecStart=/opt/honeycomb/honeycomb +Restart=always +RestartSec=10 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable /etc/systemd/system/honeycomb.service + # Download DHCP config files cd /opt wget $REPO_URL_BLOB/org.onap.demo/vnfs/vcpe/$INSTALL_SCRIPT_VERSION/v_brgemu_init.sh @@ -65,4 +405,4 @@ then reboot fi -./v_brgemu_init.sh
\ No newline at end of file +./v_brgemu_init.sh diff --git a/vnfs/vCPE/scripts/v_gmux_init.sh b/vnfs/vCPE/scripts/v_gmux_init.sh index a9bf588e..41730d3a 100644 --- a/vnfs/vCPE/scripts/v_gmux_init.sh +++ b/vnfs/vCPE/scripts/v_gmux_init.sh @@ -1 +1,6 @@ #!/bin/bash + +systemctl start vpp +systemctl start honeycomb +systemctl start autosave + diff --git a/vnfs/vCPE/scripts/v_gmux_install.sh b/vnfs/vCPE/scripts/v_gmux_install.sh index 23eaacba..e7d39377 100644 --- a/vnfs/vCPE/scripts/v_gmux_install.sh +++ b/vnfs/vCPE/scripts/v_gmux_install.sh @@ -4,6 +4,12 @@ REPO_URL_BLOB=$(cat /opt/config/repo_url_blob.txt) REPO_URL_ARTIFACTS=$(cat /opt/config/repo_url_artifacts.txt) DEMO_ARTIFACTS_VERSION=$(cat /opt/config/demo_artifacts_version.txt) INSTALL_SCRIPT_VERSION=$(cat /opt/config/install_script_version.txt) +VPP_SOURCE_REPO_URL=$(cat /opt/config/vpp_source_repo_url.txt) +VPP_SOURCE_REPO_BRANCH=$(cat /opt/config/vpp_source_repo_branch.txt) +VPP_PATCH_URL=$(cat /opt/config/vpp_patch_url.txt) +HC2VPP_SOURCE_REPO_URL=$(cat /opt/config/hc2vpp_source_repo_url.txt) +HC2VPP_SOURCE_REPO_BRANCH=$(cat /opt/config/hc2vpp_source_repo_branch.txt) +HC2VPP_PATCH_URL=$(cat /opt/config/hc2vpp_patch_url.txt) CLOUD_ENV=$(cat /opt/config/cloud_env.txt) # Convert Network CIDR to Netmask @@ -64,6 +70,469 @@ apt-get update apt-get install --allow-unauthenticated -y wget openjdk-8-jdk apt-transport-https ca-certificates g++ libcurl4-gnutls-dev sleep 1 +# Install the tools required for download codes +apt-get install -y expect git patch + +#Download and build the VPP codes +cd /opt +git clone ${VPP_SOURCE_REPO_URL} -b ${VPP_SOURCE_REPO_BRANCH} vpp +wget -O Vpp-Add-VES-agent-for-vG-MUX.patch ${VPP_PATCH_URL} + +cd vpp +patch -p1 < ../Vpp-Add-VES-agent-for-vG-MUX.patch +expect -c " + set timeout 60; + spawn make install-dep; + expect { + \"Do you want to continue?*\" {send \"Y\r\"; interact} + } +" + +cd build-root +./bootstrap.sh +make V=0 PLATFORM=vpp TAG=vpp install-deb + +# Install the evel-library first since we need the lib +cd /opt +apt-get install -y libcurl4-openssl-dev +git clone https://github.com/att/evel-library.git +cd evel-library/bldjobs +make +cp /opt/evel-library/libs/libevel.so /usr/lib +ldconfig + +# Install the VPP package +cd /opt/vpp/build-root +dpkg -i *.deb +systemctl stop vpp + +# Auto-start configuration for the VPP +cat > /etc/vpp/startup.conf << EOF + +unix { + nodaemon + log /tmp/vpp.log + full-coredump + cli-listen localhost:5002 + startup-config /etc/vpp/setup.gate +} + +api-trace { + on +} + +api-segment { + gid vpp +} + +cpu { + ## In the VPP there is one main thread and optionally the user can create worker(s) + ## The main thread and worker thread(s) can be pinned to CPU core(s) manually or automatically + + ## Manual pinning of thread(s) to CPU core(s) + + ## Set logical CPU core where main thread runs + # main-core 1 + + ## Set logical CPU core(s) where worker threads are running + # corelist-workers 2-3,18-19 + + ## Automatic pinning of thread(s) to CPU core(s) + + ## Sets number of CPU core(s) to be skipped (1 ... N-1) + ## Skipped CPU core(s) are not used for pinning main thread and working thread(s). + ## The main thread is automatically pinned to the first available CPU core and worker(s) + ## are pinned to next free CPU core(s) after core assigned to main thread + # skip-cores 4 + + ## Specify a number of workers to be created + ## Workers are pinned to N consecutive CPU cores while skipping "skip-cores" CPU core(s) + ## and main thread's CPU core + # workers 2 + + ## Set scheduling policy and priority of main and worker threads + + ## Scheduling policy options are: other (SCHED_OTHER), batch (SCHED_BATCH) + ## idle (SCHED_IDLE), fifo (SCHED_FIFO), rr (SCHED_RR) + # scheduler-policy fifo + + ## Scheduling priority is used only for "real-time policies (fifo and rr), + ## and has to be in the range of priorities supported for a particular policy + # scheduler-priority 50 +} + +# dpdk { + ## Change default settings for all intefaces + # dev default { + ## Number of receive queues, enables RSS + ## Default is 1 + # num-rx-queues 3 + + ## Number of transmit queues, Default is equal + ## to number of worker threads or 1 if no workers treads + # num-tx-queues 3 + + ## Number of descriptors in transmit and receive rings + ## increasing or reducing number can impact performance + ## Default is 1024 for both rx and tx + # num-rx-desc 512 + # num-tx-desc 512 + + ## VLAN strip offload mode for interface + ## Default is off + # vlan-strip-offload on + # } + + ## Whitelist specific interface by specifying PCI address + # dev 0000:02:00.0 + + ## Whitelist specific interface by specifying PCI address and in + ## addition specify custom parameters for this interface + # dev 0000:02:00.1 { + # num-rx-queues 2 + # } + + ## Change UIO driver used by VPP, Options are: igb_uio, vfio-pci + ## and uio_pci_generic (default) + # uio-driver vfio-pci + + ## Disable mutli-segment buffers, improves performance but + ## disables Jumbo MTU support + # no-multi-seg + + ## Increase number of buffers allocated, needed only in scenarios with + ## large number of interfaces and worker threads. Value is per CPU socket. + ## Default is 16384 + # num-mbufs 128000 + + ## Change hugepages allocation per-socket, needed only if there is need for + ## larger number of mbufs. Default is 256M on each detected CPU socket + # socket-mem 2048,2048 +# } + +EOF + +cat > /etc/vpp/setup.gate << EOF +set int state GigabitEthernet0/8/0 up +set int ip address GigabitEthernet0/8/0 10.1.0.20/24 + +set int state GigabitEthernet0/9/0 up +set int ip address GigabitEthernet0/9/0 10.5.0.20/24 + +create vxlan tunnel src 10.5.0.20 dst 10.5.0.21 vni 100 +EOF + +# Download and install HC2VPP from source +cd /opt +git clone ${HC2VPP_SOURCE_REPO_URL} -b ${HC2VPP_SOURCE_REPO_BRANCH} hc2vpp +wget -O Hc2vpp-Add-VES-agent-for-vG-MUX.patch ${HC2VPP_PATCH_URL} + +apt-get install -y maven +cat > ~/.m2/settings.xml << EOF +<?xml version="1.0" encoding="UTF-8"?> +<!-- vi: set et smarttab sw=2 tabstop=2: --> +<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> + + <profiles> + <profile> + <id>fd.io-release</id> + <repositories> + <repository> + <id>fd.io-mirror</id> + <name>fd.io-mirror</name> + <url>https://nexus.fd.io/content/groups/public/</url> + <releases> + <enabled>true</enabled> + <updatePolicy>never</updatePolicy> + </releases> + <snapshots> + <enabled>false</enabled> + </snapshots> + </repository> + </repositories> + <pluginRepositories> + <pluginRepository> + <id>fd.io-mirror</id> + <name>fd.io-mirror</name> + <url>https://nexus.fd.io/content/repositories/public/</url> + <releases> + <enabled>true</enabled> + <updatePolicy>never</updatePolicy> + </releases> + <snapshots> + <enabled>false</enabled> + </snapshots> + </pluginRepository> + </pluginRepositories> + </profile> + + <profile> + <id>fd.io-snapshots</id> + <repositories> + <repository> + <id>fd.io-snapshot</id> + <name>fd.io-snapshot</name> + <url>https://nexus.fd.io/content/repositories/fd.io.snapshot/</url> + <releases> + <enabled>false</enabled> + </releases> + <snapshots> + <enabled>true</enabled> + </snapshots> + </repository> + </repositories> + <pluginRepositories> + <pluginRepository> + <id>fd.io-snapshot</id> + <name>fd.io-snapshot</name> + <url>https://nexus.fd.io/content/repositories/fd.io.snapshot/</url> + <releases> + <enabled>false</enabled> + </releases> + <snapshots> + <enabled>true</enabled> + </snapshots> + </pluginRepository> + </pluginRepositories> + </profile> + <profile> + <id>opendaylight-snapshots</id> + <repositories> + <repository> + <id>opendaylight-snapshot</id> + <name>opendaylight-snapshot</name> + <url>https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url> + <releases> + <enabled>false</enabled> + </releases> + <snapshots> + <enabled>true</enabled> + </snapshots> + </repository> + </repositories> + <pluginRepositories> + <pluginRepository> + <id>opendaylight-shapshot</id> + <name>opendaylight-snapshot</name> + <url>https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url> + <releases> + <enabled>false</enabled> + </releases> + <snapshots> + <enabled>true</enabled> + </snapshots> + </pluginRepository> + </pluginRepositories> + </profile> + </profiles> + + <activeProfiles> + <activeProfile>fd.io-release</activeProfile> + <activeProfile>fd.io-snapshots</activeProfile> + <activeProfile>opendaylight-snapshots</activeProfile> + </activeProfiles> +</settings> +EOF + +cd hc2vpp +patch -p1 < ../Hc2vpp-Add-VES-agent-for-vG-MUX.patch +mvn clean install +l_version=$(cat pom.xml | grep "<version>" | head -1) +l_version=$(echo "${l_version%<*}") +l_version=$(echo "${l_version#*>}") +mv vpp-integration/minimal-distribution/target/vpp-integration-distribution-${l_version}-hc/vpp-integration-distribution-${l_version} /opt/honeycomb +sed -i 's/127.0.0.1/0.0.0.0/g' /opt/honeycomb/config/honeycomb.json + +# Create systemctl service for Honeycomb +cat > /etc/systemd/system/honeycomb.service << EOF +[Unit] +Description=Honeycomb Agent for the VPP control plane +Documentation=https://wiki.fd.io/view/Honeycomb +Requires=vpp.service +After=vpp.service + +[Service] +ExecStart=/opt/honeycomb/honeycomb +Restart=always +RestartSec=10 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable /etc/systemd/system/honeycomb.service + +#Create a systemd service for auto-save +cat > /usr/bin/save_config << EOF +#!/bin/bash + +######################################################################### +# +# Copyright (c) 2017 Intel and/or its affiliates. +# +# 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. +# +########################################################################## + +############################### Variables ################################ +VPP_SETUP_GATE=/etc/vpp/setup.gate + +############################### Functions ################################ + +# Write the commands to the startup scripts. +# +# We could set VPP configuration to the startup.conf. +# Write the configuration to the startup scripts so we could +# restore the system after rebooting. +# +write_startup_scripts() +{ + local cmd=${2} + local is_add=${1} + + if [[ ${is_add} == add ]] ;then + while read -r line + do + if [[ ${line} == ${cmd} ]] ;then + return 0 + fi + done < ${VPP_SETUP_GATE} + + echo "${cmd}" >> ${VPP_SETUP_GATE} + else + while read -r line + do + if [[ ${line} == ${cmd} ]] ;then + sed -i "/${line}/d" ${VPP_SETUP_GATE} + return 0 + fi + done < ${VPP_SETUP_GATE} + fi +} + +# Saves the VES agent configuration to the startup script. +# +# Get the current VES agent configuration from the bash command: +# $vppctl show ves agent +# Server Addr Server Port Interval Enabled +# 127.0.0.1 8080 10 True +# Set the VES agent configuration with the bash command: +# $vppctl set ves agent server 127.0.0.1 port 8080 intval 10 +# +save_ves_config() +{ + local server="" + local port="" + local intval="" + + local ves_config=`vppctl show ves agent | head -2 | tail -1` + if [ "${ves_config}" != "" ] ;then + server=`echo ${ves_config} | awk '{ print $1 }'` + port=`echo ${ves_config} | awk '{ print $2 }'` + intval=`echo ${ves_config} | awk '{ print $3 }'` + write_startup_scripts add "set ves agent server ${server} port ${port} intval ${intval}" + fi +} + +# Save the VxLAN Tunnel Configuration to the startup script. +# +# Get the current VxLAN tunnel configuration with bash command: +# $vppctl show vxlan tunnel +# [0] src 10.3.0.2 dst 10.1.0.20 vni 100 sw_if_index 1 encap_fib_index 0 fib_entry_index 7 decap_next l2 +# [1] src 10.5.0.20 dst 10.5.0.21 vni 100 sw_if_index 2 encap_fib_index 0 fib_entry_index 8 decap_next l2 +# Set the VxLAN Tunnel with the bash command: +# $vppctl create vxlan tunnel src 10.3.0.2 dst 10.1.0.20 vni 100 +# vxlan_tunnel0 +save_vxlan_tunnel() +{ + local src="" + local dst="" + local vni="" + + vppctl show vxlan tunnel | while read line + do + if [ "${line}" != "" ] ;then + src=`echo ${line} | awk '{ print $3 }'` + dst=`echo ${line} | awk '{ print $5 }'` + vni=`echo ${line} | awk '{ print $7 }'` + + write_startup_scripts add "create vxlan tunnel src ${src} dst ${dst} vni ${vni}" + fi + done +} + +# Save the VxLAN tunnel L2 xconnect configuration to the startup script. +# +# Get the Current L2 Address configuration with bash command: +# $vppctl show int addr +# local0 (dn): +# vxlan_tunnel0 (up): +# l2 xconnect vxlan_tunnel1 +# vxlan_tunnel1 (up): +# l2 xconnect vxlan_tunnel0 +# Save the VxLAN tunnel L2 xconnect configuration with bash command: +# $vppctl set interface l2 xconnect vxlan_tunnel0 vxlan_tunnel1 +# +save_vxlan_xconnect() +{ + local ingress="" + local egress="" + + vppctl show int addr | while read line + do + if [[ ${line} == vxlan_tunnel* ]] ;then + read next + while [[ ${next} != l2* ]] || [[ ${next} == "" ]] + do + line=`echo ${next}` + read next + done + if [[ ${next} == l2* ]] ;then + ingress=`echo ${line} | awk '{ print $1 }'` + egress=`echo ${next} | awk '{ print $3 }'` + write_startup_scripts add "set interface l2 xconnect ${ingress} ${egress}" + fi + fi + done +} + +################################# MAIN ################################### + +save_ves_config + +save_vxlan_tunnel + +save_vxlan_xconnect + +EOF +chmod a+x /usr/bin/save_config +cat > /etc/systemd/system/autosave.service << EOF +[Unit] +Description=Run Scripts at Start and Stop +Requires=vpp.service +After=vpp.service + +[Service] +Type=oneshot +RemainAfterExit=true +ExecStop=/usr/bin/save_config + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable /etc/systemd/system/autosave.service + # Download DHCP config files cd /opt wget $REPO_URL_BLOB/org.onap.demo/vnfs/vcpe/$INSTALL_SCRIPT_VERSION/v_gmux_init.sh @@ -85,4 +554,4 @@ then reboot fi -./v_gmux_init.sh
\ No newline at end of file +./v_gmux_init.sh diff --git a/vnfs/vCPE/scripts/v_gw_init.sh b/vnfs/vCPE/scripts/v_gw_init.sh index a9bf588e..344374d3 100644 --- a/vnfs/vCPE/scripts/v_gw_init.sh +++ b/vnfs/vCPE/scripts/v_gw_init.sh @@ -1 +1,5 @@ #!/bin/bash + +systemctl start vpp +systemctl start honeycomb + diff --git a/vnfs/vCPE/scripts/v_gw_install.sh b/vnfs/vCPE/scripts/v_gw_install.sh index 688bce13..3a12d7ed 100644 --- a/vnfs/vCPE/scripts/v_gw_install.sh +++ b/vnfs/vCPE/scripts/v_gw_install.sh @@ -4,6 +4,10 @@ REPO_URL_BLOB=$(cat /opt/config/repo_url_blob.txt) REPO_URL_ARTIFACTS=$(cat /opt/config/repo_url_artifacts.txt) DEMO_ARTIFACTS_VERSION=$(cat /opt/config/demo_artifacts_version.txt) INSTALL_SCRIPT_VERSION=$(cat /opt/config/install_script_version.txt) +VPP_SOURCE_REPO_URL=$(cat /opt/config/vpp_source_repo_url.txt) +VPP_SOURCE_REPO_BRANCH=$(cat /opt/config/vpp_source_repo_branch.txt) +HC2VPP_SOURCE_REPO_URL=$(cat /opt/config/hc2vpp_source_repo_url.txt) +HC2VPP_SOURCE_REPO_BRANCH=$(cat /opt/config/hc2vpp_source_repo_branch.txt) CLOUD_ENV=$(cat /opt/config/cloud_env.txt) # Convert Network CIDR to Netmask @@ -54,6 +58,308 @@ apt-get update apt-get install --allow-unauthenticated -y wget openjdk-8-jdk apt-transport-https ca-certificates g++ libcurl4-gnutls-dev sleep 1 +# Install the tools required for download codes +apt-get install -y expect git + +#Download and build the VPP codes +cd /opt +git clone ${VPP_SOURCE_REPO_URL} -b ${VPP_SOURCE_REPO_BRANCH} vpp + +cd vpp +expect -c " + set timeout 60; + spawn make install-dep; + expect { + \"Do you want to continue?*\" {send \"Y\r\"; interact} + } +" + +cd build-root +./bootstrap.sh +make V=0 PLATFORM=vpp TAG=vpp install-deb + +# Install the VPP package +dpkg -i *.deb +systemctl stop vpp + +# Auto-start configuration for the VPP +cat > /etc/vpp/startup.conf << EOF + +unix { + nodaemon + log /tmp/vpp.log + full-coredump + cli-listen localhost:5002 + startup-config /etc/vpp/setup.gate +} + +api-trace { + on +} + +api-segment { + gid vpp +} + +cpu { + ## In the VPP there is one main thread and optionally the user can create worker(s) + ## The main thread and worker thread(s) can be pinned to CPU core(s) manually or automatically + + ## Manual pinning of thread(s) to CPU core(s) + + ## Set logical CPU core where main thread runs + # main-core 1 + + ## Set logical CPU core(s) where worker threads are running + # corelist-workers 2-3,18-19 + + ## Automatic pinning of thread(s) to CPU core(s) + + ## Sets number of CPU core(s) to be skipped (1 ... N-1) + ## Skipped CPU core(s) are not used for pinning main thread and working thread(s). + ## The main thread is automatically pinned to the first available CPU core and worker(s) + ## are pinned to next free CPU core(s) after core assigned to main thread + # skip-cores 4 + + ## Specify a number of workers to be created + ## Workers are pinned to N consecutive CPU cores while skipping "skip-cores" CPU core(s) + ## and main thread's CPU core + # workers 2 + + ## Set scheduling policy and priority of main and worker threads + + ## Scheduling policy options are: other (SCHED_OTHER), batch (SCHED_BATCH) + ## idle (SCHED_IDLE), fifo (SCHED_FIFO), rr (SCHED_RR) + # scheduler-policy fifo + + ## Scheduling priority is used only for "real-time policies (fifo and rr), + ## and has to be in the range of priorities supported for a particular policy + # scheduler-priority 50 +} + +# dpdk { + ## Change default settings for all intefaces + # dev default { + ## Number of receive queues, enables RSS + ## Default is 1 + # num-rx-queues 3 + + ## Number of transmit queues, Default is equal + ## to number of worker threads or 1 if no workers treads + # num-tx-queues 3 + + ## Number of descriptors in transmit and receive rings + ## increasing or reducing number can impact performance + ## Default is 1024 for both rx and tx + # num-rx-desc 512 + # num-tx-desc 512 + + ## VLAN strip offload mode for interface + ## Default is off + # vlan-strip-offload on + # } + + ## Whitelist specific interface by specifying PCI address + # dev 0000:02:00.0 + + ## Whitelist specific interface by specifying PCI address and in + ## addition specify custom parameters for this interface + # dev 0000:02:00.1 { + # num-rx-queues 2 + # } + + ## Change UIO driver used by VPP, Options are: igb_uio, vfio-pci + ## and uio_pci_generic (default) + # uio-driver vfio-pci + + ## Disable mutli-segment buffers, improves performance but + ## disables Jumbo MTU support + # no-multi-seg + + ## Increase number of buffers allocated, needed only in scenarios with + ## large number of interfaces and worker threads. Value is per CPU socket. + ## Default is 16384 + # num-mbufs 128000 + + ## Change hugepages allocation per-socket, needed only if there is need for + ## larger number of mbufs. Default is 256M on each detected CPU socket + # socket-mem 2048,2048 +# } + +EOF + +cat > /etc/vpp/setup.gate << EOF +set int state GigabitEthernet0/8/0 up +set int ip address GigabitEthernet0/8/0 10.5.0.21/24 + +set int state GigabitEthernet0/9/0 up +set dhcp client intfc GigabitEthernet0/9/0 hostname vg-1 + +tap connect lstack address 192.168.1.1/24 +set int state tap-0 up + +create vxlan tunnel src 10.5.0.21 dst 10.5.0.20 vni 100 + +set interface l2 bridge tap-0 10 0 +set interface l2 bridge vxlan_tunnel0 10 1 +set bridge-domain arp term 10 + +set int ip address vxlan_tunnel0 192.168.1.254/24 +set interface snat in vxlan_tunnel0 out GigabitEthernet0/9/0 +EOF + +# Download and install HC2VPP from source +cd /opt +git clone ${HC2VPP_SOURCE_REPO_URL} -b ${HC2VPP_SOURCE_REPO_BRANCH} hc2vpp + +apt-get install -y maven +cat > ~/.m2/settings.xml << EOF +<?xml version="1.0" encoding="UTF-8"?> +<!-- vi: set et smarttab sw=2 tabstop=2: --> +<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> + + <profiles> + <profile> + <id>fd.io-release</id> + <repositories> + <repository> + <id>fd.io-mirror</id> + <name>fd.io-mirror</name> + <url>https://nexus.fd.io/content/groups/public/</url> + <releases> + <enabled>true</enabled> + <updatePolicy>never</updatePolicy> + </releases> + <snapshots> + <enabled>false</enabled> + </snapshots> + </repository> + </repositories> + <pluginRepositories> + <pluginRepository> + <id>fd.io-mirror</id> + <name>fd.io-mirror</name> + <url>https://nexus.fd.io/content/repositories/public/</url> + <releases> + <enabled>true</enabled> + <updatePolicy>never</updatePolicy> + </releases> + <snapshots> + <enabled>false</enabled> + </snapshots> + </pluginRepository> + </pluginRepositories> + </profile> + + <profile> + <id>fd.io-snapshots</id> + <repositories> + <repository> + <id>fd.io-snapshot</id> + <name>fd.io-snapshot</name> + <url>https://nexus.fd.io/content/repositories/fd.io.snapshot/</url> + <releases> + <enabled>false</enabled> + </releases> + <snapshots> + <enabled>true</enabled> + </snapshots> + </repository> + </repositories> + <pluginRepositories> + <pluginRepository> + <id>fd.io-snapshot</id> + <name>fd.io-snapshot</name> + <url>https://nexus.fd.io/content/repositories/fd.io.snapshot/</url> + <releases> + <enabled>false</enabled> + </releases> + <snapshots> + <enabled>true</enabled> + </snapshots> + </pluginRepository> + </pluginRepositories> + </profile> + <profile> + <id>opendaylight-snapshots</id> + <repositories> + <repository> + <id>opendaylight-snapshot</id> + <name>opendaylight-snapshot</name> + <url>https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url> + <releases> + <enabled>false</enabled> + </releases> + <snapshots> + <enabled>true</enabled> + </snapshots> + </repository> + </repositories> + <pluginRepositories> + <pluginRepository> + <id>opendaylight-shapshot</id> + <name>opendaylight-snapshot</name> + <url>https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url> + <releases> + <enabled>false</enabled> + </releases> + <snapshots> + <enabled>true</enabled> + </snapshots> + </pluginRepository> + </pluginRepositories> + </profile> + </profiles> + + <activeProfiles> + <activeProfile>fd.io-release</activeProfile> + <activeProfile>fd.io-snapshots</activeProfile> + <activeProfile>opendaylight-snapshots</activeProfile> + </activeProfiles> +</settings> +EOF + +cd hc2vpp +mvn clean install +l_version=$(cat pom.xml | grep "<version>" | head -1) +l_version=$(echo "${l_version%<*}") +l_version=$(echo "${l_version#*>}") +mv vpp-integration/minimal-distribution/target/vpp-integration-distribution-${l_version}-hc/vpp-integration-distribution-${l_version} /opt/honeycomb +sed -i 's/127.0.0.1/0.0.0.0/g' /opt/honeycomb/config/honeycomb.json + +# Create systemctl service for Honeycomb +cat > /etc/systemd/system/honeycomb.service << EOF +[Unit] +Description=Honeycomb Agent for the VPP control plane +Documentation=https://wiki.fd.io/view/Honeycomb +Requires=vpp.service +After=vpp.service + +[Service] +ExecStart=/opt/honeycomb/honeycomb +Restart=always +RestartSec=10 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable /etc/systemd/system/honeycomb.service + +# Install the DHCP server and config +apt-get install -y isc-dhcp-server +cat >> /etc/dhcp/dhcpd.conf << EOF +subnet 192.168.1.0 netmask 255.255.255.0 { + range 192.168.1.2 192.168.1.253; + option subnet-mask 255.255.255.0; + option routers 192.168.1.254; + option broadcast-address 192.168.1.255; + default-lease-time 600; + max-lease-time 7200; +} +EOF + # Download DHCP config files cd /opt wget $REPO_URL_BLOB/org.onap.demo/vnfs/vcpe/$INSTALL_SCRIPT_VERSION/v_gw_init.sh @@ -75,4 +381,4 @@ then reboot fi -./v_gw_init.sh
\ No newline at end of file +./v_gw_init.sh diff --git a/vnfs/vCPE/vpp-option-82-for-vbrg/src/patches/VPP-Add-Option82-Nat-Filter-For-vBRG.patch b/vnfs/vCPE/vpp-option-82-for-vbrg/src/patches/VPP-Add-Option82-Nat-Filter-For-vBRG.patch new file mode 100755 index 00000000..73b19150 --- /dev/null +++ b/vnfs/vCPE/vpp-option-82-for-vbrg/src/patches/VPP-Add-Option82-Nat-Filter-For-vBRG.patch @@ -0,0 +1,99 @@ +diff --git a/src/plugins/snat/out2in.c b/src/plugins/snat/out2in.c +index 5c12b47..f7c7caf 100644 +--- a/src/plugins/snat/out2in.c ++++ b/src/plugins/snat/out2in.c +@@ -1,3 +1,4 @@ ++ + /* + * Copyright (c) 2016 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); +@@ -658,6 +659,26 @@ snat_out2in_node_fn (vlib_main_t * vm, + n_left_from = frame->n_vectors; + next_index = node->cached_next_index; + ++ //FOR BRG ++ ip4_address_t * sdnc_addr = malloc(4); ++ char line_input[128]; ++ char * path = "/opt/config/ip.txt"; ++ FILE * f = fopen(path, "r"); ++ if (f == NULL) ++ printf("cannot open such file\n"); ++ ++ while (fgets(line_input, 128, f) != NULL){ ++ if (!strcmp(strtok(line_input, " "),"sdnc_ip:")){ ++ char * ip = strtok(NULL, " "); ++ char * num = strtok(ip, "."); ++ sdnc_addr->data[0] = atoi(num); ++ for (int i = 1; i < 4; i ++){ ++ num = strtok(NULL, "."); ++ sdnc_addr->data[i] = atoi(num); ++ } ++ } ++ } ++ + while (n_left_from > 0) + { + u32 n_left_to_next; +@@ -733,6 +754,13 @@ snat_out2in_node_fn (vlib_main_t * vm, + + proto0 = ip_proto_to_snat_proto (ip0->protocol); + ++ //for BRG ++ if (PREDICT_TRUE (ip0->src_address.data_u32 != sdnc_addr->data_u32)) ++ { ++ next0 = SNAT_OUT2IN_NEXT_LOOKUP; ++ goto trace0; ++ } ++ + if (PREDICT_FALSE (proto0 == ~0)) + { + snat_out2in_unknown_proto(sm, b0, ip0, rx_fib_index0); +@@ -871,6 +899,13 @@ snat_out2in_node_fn (vlib_main_t * vm, + + proto1 = ip_proto_to_snat_proto (ip1->protocol); + ++ //for BRG ++ if (PREDICT_TRUE (ip1->src_address.data_u32 != sdnc_addr->data_u32)) ++ { ++ next1 = SNAT_OUT2IN_NEXT_LOOKUP; ++ goto trace1; ++ } ++ + if (PREDICT_FALSE (proto1 == ~0)) + { + snat_out2in_unknown_proto(sm, b1, ip1, rx_fib_index1); +@@ -1033,6 +1068,13 @@ snat_out2in_node_fn (vlib_main_t * vm, + + proto0 = ip_proto_to_snat_proto (ip0->protocol); + ++ //for BRG ++ if (PREDICT_TRUE (ip0->src_address.data_u32 != sdnc_addr->data_u32)) ++ { ++ next0 = SNAT_OUT2IN_NEXT_LOOKUP; ++ goto trace00; ++ } ++ + if (PREDICT_FALSE (proto0 == ~0)) + { + snat_out2in_unknown_proto(sm, b0, ip0, rx_fib_index0); +diff --git a/src/vnet/dhcp/client.c b/src/vnet/dhcp/client.c +index 014f17a..296e1a7 100644 +--- a/src/vnet/dhcp/client.c ++++ b/src/vnet/dhcp/client.c +@@ -427,6 +427,16 @@ send_dhcp_pkt (dhcp_client_main_t * dcm, dhcp_client_t * c, + clib_memcpy (o->data, c->option_55_data, vec_len(c->option_55_data)); + o = (dhcp_option_t *) (((uword) o) + (o->length + 2)); + ++ /*send option 82*/ ++ u8 sub2_len = vec_len(hw->hw_address); ++ o->option = 82; ++ o->length = sub2_len + 2; ++ u8 sub_option = 2; ++ clib_memcpy (o->data, &sub_option, 1); ++ clib_memcpy (o->data + 1,&sub2_len, 1); ++ clib_memcpy (o->data + 2, hw->hw_address, vec_len(hw->hw_address)); ++ o = (dhcp_option_t *) (((uword) o) + (o->length +2)); ++ + /* End of list */ + o->option = 0xff; + o->length = 0; diff --git a/vnfs/vCPE/vpp-radius-client-for-vbng/src/patches/Vpp-Integrate-FreeRADIUS-Client-for-vBNG.patch b/vnfs/vCPE/vpp-radius-client-for-vbng/src/patches/Vpp-Integrate-FreeRADIUS-Client-for-vBNG.patch new file mode 100644 index 00000000..4a9218b2 --- /dev/null +++ b/vnfs/vCPE/vpp-radius-client-for-vbng/src/patches/Vpp-Integrate-FreeRADIUS-Client-for-vBNG.patch @@ -0,0 +1,13239 @@ +From 0a97fd92483349178a6750ec4a232fea4f9864df Mon Sep 17 00:00:00 2001 +From: Johnson Li <johnson.li@intel.com> +Date: Fri, 8 Sep 2017 17:09:58 +0800 +Subject: [PATCH] Integrate FreeRADIUS Client for vBNG + +Signed-off-by: Johnson Li <johnson.li@intel.com> + +diff --git a/src/configure.ac b/src/configure.ac +index fb2ead6d..ef5537da 100644 +--- a/src/configure.ac ++++ b/src/configure.ac +@@ -152,6 +152,7 @@ PLUGIN_ENABLED(ioam) + PLUGIN_ENABLED(ixge) + PLUGIN_ENABLED(lb) + PLUGIN_ENABLED(memif) ++PLUGIN_ENABLED(vbng) + PLUGIN_ENABLED(sixrd) + PLUGIN_ENABLED(snat) + +diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am +index 623892e7..d6f607fc 100644 +--- a/src/plugins/Makefile.am ++++ b/src/plugins/Makefile.am +@@ -61,6 +61,10 @@ if ENABLE_MEMIF_PLUGIN + include memif.am + endif + ++if ENABLE_VBNG_PLUGIN ++include vbng.am ++endif ++ + if ENABLE_SIXRD_PLUGIN + include sixrd.am + endif +diff --git a/src/plugins/vbng.am b/src/plugins/vbng.am +new file mode 100644 +index 00000000..99398f49 +--- /dev/null ++++ b/src/plugins/vbng.am +@@ -0,0 +1,32 @@ ++# Copyright (c) 2017 Intel and/or its affiliates. ++# 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. ++ ++vppplugins_LTLIBRARIES += vbng_plugin.la ++ ++vbng_plugin_la_LDFLAGS = $(AM_LDFLAGS) -lfreeradiusclient ++ ++vbng_plugin_la_SOURCES = vbng/vbng_dhcp4_node.c \ ++ vbng/vbng_dhcp4.c \ ++ vbng/vbng_api.c \ ++ vbng/vbng_aaa.c ++ ++BUILT_SOURCES += vbng/vbng.api.h \ ++ vbng/vbng.api.json ++ ++API_FILES += vbng/vbng.api ++ ++nobase_apiinclude_HEADERS += vbng/vbng_all_api_h.h \ ++ vbng/vbng_msg_enum.h \ ++ vbng/vbng.api.h ++ ++# vi:syntax=automake +diff --git a/src/plugins/vbng/etc/dictionary b/src/plugins/vbng/etc/dictionary +new file mode 100644 +index 00000000..45f4189c +--- /dev/null ++++ b/src/plugins/vbng/etc/dictionary +@@ -0,0 +1,274 @@ ++# ++# Updated 97/06/13 to livingston-radius-2.01 miquels@cistron.nl ++# ++# This file contains dictionary translations for parsing ++# requests and generating responses. All transactions are ++# composed of Attribute/Value Pairs. The value of each attribute ++# is specified as one of 4 data types. Valid data types are: ++# ++# string - 0-253 octets ++# ipaddr - 4 octets in network byte order ++# integer - 32 bit value in big endian order (high byte first) ++# date - 32 bit value in big endian order - seconds since ++# 00:00:00 GMT, Jan. 1, 1970 ++# ++# Enumerated values are stored in the user file with dictionary ++# VALUE translations for easy administration. ++# ++# Example: ++# ++# ATTRIBUTE VALUE ++# --------------- ----- ++# Framed-Protocol = PPP ++# 7 = 1 (integer encoding) ++# ++ ++# ++# Following are the proper new names. Use these. ++# ++ATTRIBUTE User-Name 1 string ++ATTRIBUTE Password 2 string ++ATTRIBUTE CHAP-Password 3 string ++ATTRIBUTE NAS-IP-Address 4 ipaddr ++ATTRIBUTE NAS-Port-Id 5 integer ++ATTRIBUTE Service-Type 6 integer ++ATTRIBUTE Framed-Protocol 7 integer ++ATTRIBUTE Framed-IP-Address 8 ipaddr ++ATTRIBUTE Framed-IP-Netmask 9 ipaddr ++ATTRIBUTE Framed-Routing 10 integer ++ATTRIBUTE Filter-Id 11 string ++ATTRIBUTE Framed-MTU 12 integer ++ATTRIBUTE Framed-Compression 13 integer ++ATTRIBUTE Login-IP-Host 14 ipaddr ++ATTRIBUTE Login-Service 15 integer ++ATTRIBUTE Login-TCP-Port 16 integer ++ATTRIBUTE Reply-Message 18 string ++ATTRIBUTE Callback-Number 19 string ++ATTRIBUTE Callback-Id 20 string ++ATTRIBUTE Framed-Route 22 string ++ATTRIBUTE Framed-IPX-Network 23 ipaddr ++ATTRIBUTE State 24 string ++ATTRIBUTE Class 25 string ++ATTRIBUTE Vendor-Specific 26 string ++ATTRIBUTE Session-Timeout 27 integer ++ATTRIBUTE Idle-Timeout 28 integer ++ATTRIBUTE Termination-Action 29 integer ++ATTRIBUTE Called-Station-Id 30 string ++ATTRIBUTE Calling-Station-Id 31 string ++ATTRIBUTE NAS-Identifier 32 string ++ATTRIBUTE Proxy-State 33 string ++ATTRIBUTE Login-LAT-Service 34 string ++ATTRIBUTE Login-LAT-Node 35 string ++ATTRIBUTE Login-LAT-Group 36 string ++ATTRIBUTE Framed-AppleTalk-Link 37 integer ++ATTRIBUTE Framed-AppleTalk-Network 38 integer ++ATTRIBUTE Framed-AppleTalk-Zone 39 string ++ATTRIBUTE Acct-Status-Type 40 integer ++ATTRIBUTE Acct-Delay-Time 41 integer ++ATTRIBUTE Acct-Input-Octets 42 integer ++ATTRIBUTE Acct-Output-Octets 43 integer ++ATTRIBUTE Acct-Session-Id 44 string ++ATTRIBUTE Acct-Authentic 45 integer ++ATTRIBUTE Acct-Session-Time 46 integer ++ATTRIBUTE Acct-Input-Packets 47 integer ++ATTRIBUTE Acct-Output-Packets 48 integer ++ATTRIBUTE Acct-Terminate-Cause 49 integer ++ATTRIBUTE Acct-Multi-Session-Id 50 string ++ATTRIBUTE Acct-Link-Count 51 integer ++ATTRIBUTE Acct-Input-Gigawords 52 integer ++ATTRIBUTE Acct-Output-Gigawords 53 integer ++ATTRIBUTE Event-Timestamp 55 integer ++ATTRIBUTE CHAP-Challenge 60 string ++ATTRIBUTE NAS-Port-Type 61 integer ++ATTRIBUTE Port-Limit 62 integer ++ATTRIBUTE Login-LAT-Port 63 integer ++ATTRIBUTE Connect-Info 77 string ++ ++# ++# RFC3162 IPv6 attributes ++# ++ATTRIBUTE NAS-IPv6-Address 95 string ++ATTRIBUTE Framed-Interface-Id 96 string ++ATTRIBUTE Framed-IPv6-Prefix 97 ipv6prefix ++ATTRIBUTE Login-IPv6-Host 98 string ++ATTRIBUTE Framed-IPv6-Route 99 string ++ATTRIBUTE Framed-IPv6-Pool 100 string ++ ++# ++# RFC6911 IPv6 attributes ++# ++ATTRIBUTE Framed-IPv6-Address 168 ipv6addr ++ATTRIBUTE DNS-Server-IPv6-Address 169 ipv6addr ++ATTRIBUTE Route-IPv6-Information 170 ipv6prefix ++ ++# ++# Experimental Non Protocol Attributes used by Cistron-Radiusd ++# ++ATTRIBUTE Huntgroup-Name 221 string ++ATTRIBUTE User-Category 1029 string ++ATTRIBUTE Group-Name 1030 string ++ATTRIBUTE Simultaneous-Use 1034 integer ++ATTRIBUTE Strip-User-Name 1035 integer ++ATTRIBUTE Fall-Through 1036 integer ++ATTRIBUTE Add-Port-To-IP-Address 1037 integer ++ATTRIBUTE Exec-Program 1038 string ++ATTRIBUTE Exec-Program-Wait 1039 string ++ATTRIBUTE Hint 1040 string ++ ++# ++# Non-Protocol Attributes ++# These attributes are used internally by the server ++# ++ATTRIBUTE Expiration 21 date ++ATTRIBUTE Auth-Type 1000 integer ++ATTRIBUTE Menu 1001 string ++ATTRIBUTE Termination-Menu 1002 string ++ATTRIBUTE Prefix 1003 string ++ATTRIBUTE Suffix 1004 string ++ATTRIBUTE Group 1005 string ++ATTRIBUTE Crypt-Password 1006 string ++ATTRIBUTE Connect-Rate 1007 integer ++ ++# ++# Integer Translations ++# ++ ++# User Types ++ ++VALUE Service-Type Login-User 1 ++VALUE Service-Type Framed-User 2 ++VALUE Service-Type Callback-Login-User 3 ++VALUE Service-Type Callback-Framed-User 4 ++VALUE Service-Type Outbound-User 5 ++VALUE Service-Type Administrative-User 6 ++VALUE Service-Type NAS-Prompt-User 7 ++VALUE Service-Type Authenticate-Only 8 ++VALUE Service-Type Callback-NAS-Prompt 9 ++VALUE Service-Type Call-Check 10 ++VALUE Service-Type Callback-Administrative 11 ++ ++# Framed Protocols ++ ++VALUE Framed-Protocol PPP 1 ++VALUE Framed-Protocol SLIP 2 ++VALUE Framed-Protocol ARAP 3 ++VALUE Framed-Protocol GANDALF-SLMLP 4 ++VALUE Framed-Protocol XYLOGICS-IPX-SLIP 5 ++VALUE Framed-Protocol X75 6 ++ ++# Framed Routing Values ++ ++VALUE Framed-Routing None 0 ++VALUE Framed-Routing Broadcast 1 ++VALUE Framed-Routing Listen 2 ++VALUE Framed-Routing Broadcast-Listen 3 ++ ++# Framed Compression Types ++ ++VALUE Framed-Compression None 0 ++VALUE Framed-Compression Van-Jacobson-TCP-IP 1 ++VALUE Framed-Compression IPX-Header 2 ++VALUE Framed-Compression Stac-LZS 3 ++ ++# Login Services ++ ++VALUE Login-Service Telnet 0 ++VALUE Login-Service Rlogin 1 ++VALUE Login-Service TCP-Clear 2 ++VALUE Login-Service PortMaster 3 ++VALUE Login-Service LAT 4 ++VALUE Login-Service X.25-PAD 5 ++VALUE Login-Service X.25-T3POS 6 ++VALUE Login-Service TCP-Clear-Quiet 8 ++ ++# Status Types ++ ++VALUE Acct-Status-Type Start 1 ++VALUE Acct-Status-Type Stop 2 ++VALUE Acct-Status-Type Alive 3 ++VALUE Acct-Status-Type Accounting-On 7 ++VALUE Acct-Status-Type Accounting-Off 8 ++ ++# Authentication Types ++ ++VALUE Acct-Authentic RADIUS 1 ++VALUE Acct-Authentic Local 2 ++VALUE Acct-Authentic Remote 3 ++ ++# Termination Options ++ ++VALUE Termination-Action Default 0 ++VALUE Termination-Action RADIUS-Request 1 ++ ++# NAS Port Types, available in 3.3.1 and later ++ ++VALUE NAS-Port-Type Async 0 ++VALUE NAS-Port-Type Sync 1 ++VALUE NAS-Port-Type ISDN 2 ++VALUE NAS-Port-Type ISDN-V120 3 ++VALUE NAS-Port-Type ISDN-V110 4 ++VALUE NAS-Port-Type Virtual 5 ++VALUE NAS-Port-Type PIAFS 6 ++VALUE NAS-Port-Type HDLC-Clear-Channel 7 ++VALUE NAS-Port-Type X.25 8 ++VALUE NAS-Port-Type X.75 9 ++VALUE NAS-Port-Type G.3-Fax 10 ++VALUE NAS-Port-Type SDSL 11 ++VALUE NAS-Port-Type ADSL-CAP 12 ++VALUE NAS-Port-Type ADSL-DMT 13 ++VALUE NAS-Port-Type IDSL 14 ++VALUE NAS-Port-Type Ethernet 15 ++ ++# Acct Terminate Causes, available in 3.3.2 and later ++ ++VALUE Acct-Terminate-Cause User-Request 1 ++VALUE Acct-Terminate-Cause Lost-Carrier 2 ++VALUE Acct-Terminate-Cause Lost-Service 3 ++VALUE Acct-Terminate-Cause Idle-Timeout 4 ++VALUE Acct-Terminate-Cause Session-Timeout 5 ++VALUE Acct-Terminate-Cause Admin-Reset 6 ++VALUE Acct-Terminate-Cause Admin-Reboot 7 ++VALUE Acct-Terminate-Cause Port-Error 8 ++VALUE Acct-Terminate-Cause NAS-Error 9 ++VALUE Acct-Terminate-Cause NAS-Request 10 ++VALUE Acct-Terminate-Cause NAS-Reboot 11 ++VALUE Acct-Terminate-Cause Port-Unneeded 12 ++VALUE Acct-Terminate-Cause Port-Preempted 13 ++VALUE Acct-Terminate-Cause Port-Suspended 14 ++VALUE Acct-Terminate-Cause Service-Unavailable 15 ++VALUE Acct-Terminate-Cause Callback 16 ++VALUE Acct-Terminate-Cause User-Error 17 ++VALUE Acct-Terminate-Cause Host-Request 18 ++ ++# ++# Non-Protocol Integer Translations ++# ++ ++VALUE Auth-Type Local 0 ++VALUE Auth-Type System 1 ++VALUE Auth-Type SecurID 2 ++VALUE Auth-Type Crypt-Local 3 ++VALUE Auth-Type Reject 4 ++ ++# ++# Cistron extensions ++# ++VALUE Auth-Type Pam 253 ++VALUE Auth-Type Accept 254 ++ ++# ++# Experimental Non-Protocol Integer Translations for Cistron-Radiusd ++# ++VALUE Fall-Through No 0 ++VALUE Fall-Through Yes 1 ++VALUE Add-Port-To-IP-Address No 0 ++VALUE Add-Port-To-IP-Address Yes 1 ++ ++# ++# Configuration Values ++# uncomment these two lines to turn account expiration on ++# ++ ++#VALUE Server-Config Password-Expiration 30 ++#VALUE Server-Config Password-Warning 5 ++ +diff --git a/src/plugins/vbng/etc/dictionary.ascend b/src/plugins/vbng/etc/dictionary.ascend +new file mode 100644 +index 00000000..a02c207d +--- /dev/null ++++ b/src/plugins/vbng/etc/dictionary.ascend +@@ -0,0 +1,297 @@ ++# ++# Ascend dictionary. ++# ++# Enable by putting the line "$INCLUDE dictionary.ascend" into ++# the main dictionary file. ++# ++# Version: 1.00 21-Jul-1997 Jens Glaser <jens@regio.net> ++# ++ ++ ++# ++# Ascend specific extensions ++# Used by ASCEND MAX/Pipeline products ++# ++ATTRIBUTE Ascend-FCP-Parameter 119 string ++ATTRIBUTE Ascend-Modem-PortNo 120 integer ++ATTRIBUTE Ascend-Modem-SlotNo 121 integer ++ATTRIBUTE Ascend-Modem-ShelfNo 122 integer ++ATTRIBUTE Ascend-Call-Attempt-Limit 123 integer ++ATTRIBUTE Ascend-Call-Block-Duration 124 integer ++ATTRIBUTE Ascend-Maximum-Call-Duration 125 integer ++ATTRIBUTE Ascend-Temporary-Rtes 126 integer ++ATTRIBUTE Tunneling-Protocol 127 integer ++ATTRIBUTE Ascend-Shared-Profile-Enable 128 integer ++ATTRIBUTE Ascend-Primary-Home-Agent 129 string ++ATTRIBUTE Ascend-Secondary-Home-Agent 130 string ++ATTRIBUTE Ascend-Dialout-Allowed 131 integer ++ATTRIBUTE Ascend-Client-Gateway 132 ipaddr ++ATTRIBUTE Ascend-BACP-Enable 133 integer ++ATTRIBUTE Ascend-DHCP-Maximum-Leases 134 integer ++ATTRIBUTE Ascend-Client-Primary-DNS 135 ipaddr ++ATTRIBUTE Ascend-Client-Secondary-DNS 136 ipaddr ++ATTRIBUTE Ascend-Client-Assign-DNS 137 integer ++ATTRIBUTE Ascend-User-Acct-Type 138 integer ++ATTRIBUTE Ascend-User-Acct-Host 139 ipaddr ++ATTRIBUTE Ascend-User-Acct-Port 140 integer ++ATTRIBUTE Ascend-User-Acct-Key 141 string ++ATTRIBUTE Ascend-User-Acct-Base 142 integer ++ATTRIBUTE Ascend-User-Acct-Time 143 integer ++ATTRIBUTE Ascend-Assign-IP-Client 144 ipaddr ++ATTRIBUTE Ascend-Assign-IP-Server 145 ipaddr ++ATTRIBUTE Ascend-Assign-IP-Global-Pool 146 string ++ATTRIBUTE Ascend-DHCP-Reply 147 integer ++ATTRIBUTE Ascend-DHCP-Pool-Number 148 integer ++ATTRIBUTE Ascend-Expect-Callback 149 integer ++ATTRIBUTE Ascend-Event-Type 150 integer ++ATTRIBUTE Ascend-Session-Svr-Key 151 string ++ATTRIBUTE Ascend-Multicast-Rate-Limit 152 integer ++ATTRIBUTE Ascend-IF-Netmask 153 ipaddr ++ATTRIBUTE Ascend-Remote-Addr 154 ipaddr ++ATTRIBUTE Ascend-Multicast-Client 155 integer ++ATTRIBUTE Ascend-FR-Circuit-Name 156 string ++ATTRIBUTE Ascend-FR-LinkUp 157 integer ++ATTRIBUTE Ascend-FR-Nailed-Grp 158 integer ++ATTRIBUTE Ascend-FR-Type 159 integer ++ATTRIBUTE Ascend-FR-Link-Mgt 160 integer ++ATTRIBUTE Ascend-FR-N391 161 integer ++ATTRIBUTE Ascend-FR-DCE-N392 162 integer ++ATTRIBUTE Ascend-FR-DTE-N392 163 integer ++ATTRIBUTE Ascend-FR-DCE-N393 164 integer ++ATTRIBUTE Ascend-FR-DTE-N393 165 integer ++ATTRIBUTE Ascend-FR-T391 166 integer ++ATTRIBUTE Ascend-FR-T392 167 integer ++ATTRIBUTE Ascend-Bridge-Address 168 string ++ATTRIBUTE Ascend-TS-Idle-Limit 169 integer ++ATTRIBUTE Ascend-TS-Idle-Mode 170 integer ++ATTRIBUTE Ascend-DBA-Monitor 171 integer ++ATTRIBUTE Ascend-Base-Channel-Count 172 integer ++ATTRIBUTE Ascend-Minimum-Channels 173 integer ++ATTRIBUTE Ascend-IPX-Route 174 string ++ATTRIBUTE Ascend-FT1-Caller 175 integer ++ATTRIBUTE Ascend-Backup 176 string ++ATTRIBUTE Ascend-Call-Type 177 integer ++ATTRIBUTE Ascend-Group 178 string ++ATTRIBUTE Ascend-FR-DLCI 179 integer ++ATTRIBUTE Ascend-FR-Profile-Name 180 string ++ATTRIBUTE Ascend-Ara-PW 181 string ++ATTRIBUTE Ascend-IPX-Node-Addr 182 string ++ATTRIBUTE Ascend-Home-Agent-IP-Addr 183 ipaddr ++ATTRIBUTE Ascend-Home-Agent-Password 184 string ++ATTRIBUTE Ascend-Home-Network-Name 185 string ++ATTRIBUTE Ascend-Home-Agent-UDP-Port 186 integer ++ATTRIBUTE Ascend-Multilink-ID 187 integer ++ATTRIBUTE Ascend-Num-In-Multilink 188 integer ++ATTRIBUTE Ascend-First-Dest 189 ipaddr ++ATTRIBUTE Ascend-Pre-Input-Octets 190 integer ++ATTRIBUTE Ascend-Pre-Output-Octets 191 integer ++ATTRIBUTE Ascend-Pre-Input-Packets 192 integer ++ATTRIBUTE Ascend-Pre-Output-Packets 193 integer ++ATTRIBUTE Ascend-Maximum-Time 194 integer ++ATTRIBUTE Ascend-Disconnect-Cause 195 integer ++ATTRIBUTE Ascend-Connect-Progress 196 integer ++ATTRIBUTE Ascend-Data-Rate 197 integer ++ATTRIBUTE Ascend-PreSession-Time 198 integer ++ATTRIBUTE Ascend-Token-Idle 199 integer ++ATTRIBUTE Ascend-Token-Immediate 200 integer ++ATTRIBUTE Ascend-Require-Auth 201 integer ++ATTRIBUTE Ascend-Number-Sessions 202 string ++ATTRIBUTE Ascend-Authen-Alias 203 string ++ATTRIBUTE Ascend-Token-Expiry 204 integer ++ATTRIBUTE Ascend-Menu-Selector 205 string ++ATTRIBUTE Ascend-Menu-Item 206 string ++ATTRIBUTE Ascend-PW-Warntime 207 integer ++ATTRIBUTE Ascend-PW-Lifetime 208 integer ++ATTRIBUTE Ascend-IP-Direct 209 ipaddr ++ATTRIBUTE Ascend-PPP-VJ-Slot-Comp 210 integer ++ATTRIBUTE Ascend-PPP-VJ-1172 211 integer ++ATTRIBUTE Ascend-PPP-Async-Map 212 integer ++ATTRIBUTE Ascend-Third-Prompt 213 string ++ATTRIBUTE Ascend-Send-Secret 214 string ++ATTRIBUTE Ascend-Receive-Secret 215 string ++ATTRIBUTE Ascend-IPX-Peer-Mode 216 integer ++ATTRIBUTE Ascend-IP-Pool-Definition 217 string ++ATTRIBUTE Ascend-Assign-IP-Pool 218 integer ++ATTRIBUTE Ascend-FR-Direct 219 integer ++ATTRIBUTE Ascend-FR-Direct-Profile 220 string ++ATTRIBUTE Ascend-FR-Direct-DLCI 221 integer ++ATTRIBUTE Ascend-Handle-IPX 222 integer ++ATTRIBUTE Ascend-Netware-timeout 223 integer ++ATTRIBUTE Ascend-IPX-Alias 224 integer ++ATTRIBUTE Ascend-Metric 225 integer ++ATTRIBUTE Ascend-PRI-Number-Type 226 integer ++ATTRIBUTE Ascend-Dial-Number 227 string ++ATTRIBUTE Ascend-Route-IP 228 integer ++ATTRIBUTE Ascend-Route-IPX 229 integer ++ATTRIBUTE Ascend-Bridge 230 integer ++ATTRIBUTE Ascend-Send-Auth 231 integer ++ATTRIBUTE Ascend-Send-Passwd 232 string ++ATTRIBUTE Ascend-Link-Compression 233 integer ++ATTRIBUTE Ascend-Target-Util 234 integer ++ATTRIBUTE Ascend-Maximum-Channels 235 integer ++ATTRIBUTE Ascend-Inc-Channel-Count 236 integer ++ATTRIBUTE Ascend-Dec-Channel-Count 237 integer ++ATTRIBUTE Ascend-Seconds-Of-History 238 integer ++ATTRIBUTE Ascend-History-Weigh-Type 239 integer ++ATTRIBUTE Ascend-Add-Seconds 240 integer ++ATTRIBUTE Ascend-Remove-Seconds 241 integer ++ATTRIBUTE Ascend-Idle-Limit 244 integer ++ATTRIBUTE Ascend-Preempt-Limit 245 integer ++ATTRIBUTE Ascend-Callback 246 integer ++ATTRIBUTE Ascend-Data-Svc 247 integer ++ATTRIBUTE Ascend-Force-56 248 integer ++ATTRIBUTE Ascend-Billing-Number 249 string ++ATTRIBUTE Ascend-Call-By-Call 250 integer ++ATTRIBUTE Ascend-Transit-Number 251 string ++ATTRIBUTE Ascend-Host-Info 252 string ++ATTRIBUTE Ascend-PPP-Address 253 ipaddr ++ATTRIBUTE Ascend-MPP-Idle-Percent 254 integer ++ATTRIBUTE Ascend-Xmit-Rate 255 integer ++ ++ ++ ++# Ascend protocols ++VALUE Service-Type Dialout-Framed-User 5 ++VALUE Framed-Protocol ARA 255 ++VALUE Framed-Protocol MPP 256 ++VALUE Framed-Protocol EURAW 257 ++VALUE Framed-Protocol EUUI 258 ++VALUE Framed-Protocol X25 259 ++VALUE Framed-Protocol COMB 260 ++VALUE Framed-Protocol FR 261 ++VALUE Framed-Protocol MP 262 ++VALUE Framed-Protocol FR-CIR 263 ++ ++ ++# ++# Ascend specific extensions ++# Used by ASCEND MAX/Pipeline products (see above) ++# ++ ++VALUE Ascend-FR-Direct FR-Direct-No 0 ++VALUE Ascend-FR-Direct FR-Direct-Yes 1 ++VALUE Ascend-Handle-IPX Handle-IPX-None 0 ++VALUE Ascend-Handle-IPX Handle-IPX-Client 1 ++VALUE Ascend-Handle-IPX Handle-IPX-Server 2 ++VALUE Ascend-IPX-Peer-Mode IPX-Peer-Router 0 ++VALUE Ascend-IPX-Peer-Mode IPX-Peer-Dialin 1 ++VALUE Ascend-Call-Type Nailed 1 ++VALUE Ascend-Call-Type Nailed/Mpp 2 ++VALUE Ascend-Call-Type Perm/Switched 3 ++VALUE Ascend-FT1-Caller FT1-No 0 ++VALUE Ascend-FT1-Caller FT1-Yes 1 ++VALUE Ascend-PRI-Number-Type Unknown-Number 0 ++VALUE Ascend-PRI-Number-Type Intl-Number 1 ++VALUE Ascend-PRI-Number-Type National-Number 2 ++VALUE Ascend-PRI-Number-Type Local-Number 4 ++VALUE Ascend-PRI-Number-Type Abbrev-Number 5 ++VALUE Ascend-Route-IPX Route-IPX-No 0 ++VALUE Ascend-Route-IPX Route-IPX-Yes 1 ++VALUE Ascend-Bridge Bridge-No 0 ++VALUE Ascend-Bridge Bridge-Yes 1 ++VALUE Ascend-TS-Idle-Mode TS-Idle-None 0 ++VALUE Ascend-TS-Idle-Mode TS-Idle-Input 1 ++VALUE Ascend-TS-Idle-Mode TS-Idle-Input-Output 2 ++VALUE Ascend-Send-Auth Send-Auth-None 0 ++VALUE Ascend-Send-Auth Send-Auth-PAP 1 ++VALUE Ascend-Send-Auth Send-Auth-CHAP 2 ++VALUE Ascend-Send-Auth Send-Auth-MS-CHAP 3 ++VALUE Ascend-Link-Compression Link-Comp-None 0 ++VALUE Ascend-Link-Compression Link-Comp-Stac 1 ++VALUE Ascend-Link-Compression Link-Comp-Stac-Draft-9 2 ++VALUE Ascend-Link-Compression Link-Comp-MS-Stac 3 ++VALUE Ascend-History-Weigh-Type History-Constant 0 ++VALUE Ascend-History-Weigh-Type History-Linear 1 ++VALUE Ascend-History-Weigh-Type History-Quadratic 2 ++VALUE Ascend-Callback Callback-No 0 ++VALUE Ascend-Callback Callback-Yes 1 ++VALUE Ascend-Expect-Callback Expect-Callback-No 0 ++VALUE Ascend-Expect-Callback Expect-Callback-Yes 1 ++VALUE Ascend-Data-Svc Switched-Voice-Bearer 0 ++VALUE Ascend-Data-Svc Switched-56KR 1 ++VALUE Ascend-Data-Svc Switched-64K 2 ++VALUE Ascend-Data-Svc Switched-64KR 3 ++VALUE Ascend-Data-Svc Switched-56K 4 ++VALUE Ascend-Data-Svc Switched-384KR 5 ++VALUE Ascend-Data-Svc Switched-384K 6 ++VALUE Ascend-Data-Svc Switched-1536K 7 ++VALUE Ascend-Data-Svc Switched-1536KR 8 ++VALUE Ascend-Data-Svc Switched-128K 9 ++VALUE Ascend-Data-Svc Switched-192K 10 ++VALUE Ascend-Data-Svc Switched-256K 11 ++VALUE Ascend-Data-Svc Switched-320K 12 ++VALUE Ascend-Data-Svc Switched-384K-MR 13 ++VALUE Ascend-Data-Svc Switched-448K 14 ++VALUE Ascend-Data-Svc Switched-512K 15 ++VALUE Ascend-Data-Svc Switched-576K 16 ++VALUE Ascend-Data-Svc Switched-640K 17 ++VALUE Ascend-Data-Svc Switched-704K 18 ++VALUE Ascend-Data-Svc Switched-768K 19 ++VALUE Ascend-Data-Svc Switched-832K 20 ++VALUE Ascend-Data-Svc Switched-896K 21 ++VALUE Ascend-Data-Svc Switched-960K 22 ++VALUE Ascend-Data-Svc Switched-1024K 23 ++VALUE Ascend-Data-Svc Switched-1088K 24 ++VALUE Ascend-Data-Svc Switched-1152K 25 ++VALUE Ascend-Data-Svc Switched-1216K 26 ++VALUE Ascend-Data-Svc Switched-1280K 27 ++VALUE Ascend-Data-Svc Switched-1344K 28 ++VALUE Ascend-Data-Svc Switched-1408K 29 ++VALUE Ascend-Data-Svc Switched-1472K 30 ++VALUE Ascend-Data-Svc Switched-1600K 31 ++VALUE Ascend-Data-Svc Switched-1664K 32 ++VALUE Ascend-Data-Svc Switched-1728K 33 ++VALUE Ascend-Data-Svc Switched-1792K 34 ++VALUE Ascend-Data-Svc Switched-1856K 35 ++VALUE Ascend-Data-Svc Switched-1920K 36 ++VALUE Ascend-Data-Svc Switched-inherited 37 ++VALUE Ascend-Data-Svc Switched-restricted-bearer-x30 38 ++VALUE Ascend-Data-Svc Switched-clear-bearer-v110 39 ++VALUE Ascend-Data-Svc Switched-restricted-64-x30 40 ++VALUE Ascend-Data-Svc Switched-clear-56-v110 41 ++VALUE Ascend-Data-Svc Switched-modem 42 ++VALUE Ascend-Data-Svc Switched-atmodem 43 ++VALUE Ascend-Data-Svc Nailed-56KR 1 ++VALUE Ascend-Data-Svc Nailed-64K 2 ++VALUE Ascend-Force-56 Force-56-No 0 ++VALUE Ascend-Force-56 Force-56-Yes 1 ++VALUE Ascend-PW-Lifetime Lifetime-In-Days 0 ++VALUE Ascend-PW-Warntime Days-Of-Warning 0 ++VALUE Ascend-PPP-VJ-1172 PPP-VJ-1172 1 ++VALUE Ascend-PPP-VJ-Slot-Comp VJ-Slot-Comp-No 1 ++VALUE Ascend-Require-Auth Not-Require-Auth 0 ++VALUE Ascend-Require-Auth Require-Auth 1 ++VALUE Ascend-Token-Immediate Tok-Imm-No 0 ++VALUE Ascend-Token-Immediate Tok-Imm-Yes 1 ++VALUE Ascend-DBA-Monitor DBA-Transmit 0 ++VALUE Ascend-DBA-Monitor DBA-Transmit-Recv 1 ++VALUE Ascend-DBA-Monitor DBA-None 2 ++VALUE Ascend-FR-Type Ascend-FR-DTE 0 ++VALUE Ascend-FR-Type Ascend-FR-DCE 1 ++VALUE Ascend-FR-Type Ascend-FR-NNI 2 ++VALUE Ascend-FR-Link-Mgt Ascend-FR-No-Link-Mgt 0 ++VALUE Ascend-FR-Link-Mgt Ascend-FR-T1-617D 1 ++VALUE Ascend-FR-Link-Mgt Ascend-FR-Q-933A 2 ++VALUE Ascend-FR-LinkUp Ascend-LinkUp-Default 0 ++VALUE Ascend-FR-LinkUp Ascend-LinkUp-AlwaysUp 1 ++VALUE Ascend-Multicast-Client Multicast-No 0 ++VALUE Ascend-Multicast-Client Multicast-Yes 1 ++VALUE Ascend-User-Acct-Type Ascend-User-Acct-None 0 ++VALUE Ascend-User-Acct-Type Ascend-User-Acct-User 1 ++VALUE Ascend-User-Acct-Type Ascend-User-Acct-User-Default 2 ++VALUE Ascend-User-Acct-Base Base-10 0 ++VALUE Ascend-User-Acct-Base Base-16 1 ++VALUE Ascend-DHCP-Reply DHCP-Reply-No 0 ++VALUE Ascend-DHCP-Reply DHCP-Reply-Yes 1 ++VALUE Ascend-Client-Assign-DNS DNS-Assign-No 0 ++VALUE Ascend-Client-Assign-DNS DNS-Assign-Yes 1 ++VALUE Ascend-Event-Type Ascend-ColdStart 1 ++VALUE Ascend-Event-Type Ascend-Session-Event 2 ++VALUE Ascend-BACP-Enable BACP-No 0 ++VALUE Ascend-BACP-Enable BACP-Yes 1 ++VALUE Ascend-Dialout-Allowed Dialout-Not-Allowed 0 ++VALUE Ascend-Dialout-Allowed Dialout-Allowed 1 ++VALUE Ascend-Shared-Profile-Enable Shared-Profile-No 0 ++VALUE Ascend-Shared-Profile-Enable Shared-Profile-Yes 1 ++VALUE Ascend-Temporary-Rtes Temp-Rtes-No 0 ++VALUE Ascend-Temporary-Rtes Temp-Rtes-Yes 1 +diff --git a/src/plugins/vbng/etc/dictionary.compat b/src/plugins/vbng/etc/dictionary.compat +new file mode 100644 +index 00000000..4c85ea87 +--- /dev/null ++++ b/src/plugins/vbng/etc/dictionary.compat +@@ -0,0 +1,47 @@ ++# ++# Obsolete names for backwards compatibility with older users files. ++# Move the $INCLUDE in the main dictionary file to the end if you want ++# these names to be used in the "details" logfile. ++# ++ATTRIBUTE Client-Id 4 ipaddr ++ATTRIBUTE Client-Port-Id 5 integer ++ATTRIBUTE User-Service-Type 6 integer ++ATTRIBUTE Framed-Address 8 ipaddr ++ATTRIBUTE Framed-Netmask 9 ipaddr ++ATTRIBUTE Framed-Filter-Id 11 string ++ATTRIBUTE Login-Host 14 ipaddr ++ATTRIBUTE Login-Port 16 integer ++ATTRIBUTE Old-Password 17 string ++ATTRIBUTE Port-Message 18 string ++ATTRIBUTE Dialback-No 19 string ++ATTRIBUTE Dialback-Name 20 string ++ATTRIBUTE Challenge-State 24 string ++VALUE Framed-Compression Van-Jacobsen-TCP-IP 1 ++VALUE Framed-Compression VJ-TCP-IP 1 ++VALUE Service-Type Shell-User 6 ++VALUE Auth-Type Unix 1 ++VALUE Service-Type Dialback-Login-User 3 ++VALUE Service-Type Dialback-Framed-User 4 ++ ++# ++# For compatibility with MERIT users files. ++# ++ATTRIBUTE NAS-Port 5 integer ++ATTRIBUTE Login-Host 14 ipaddr ++ATTRIBUTE Login-Callback-Number 19 string ++ATTRIBUTE Framed-Callback-Id 20 string ++ATTRIBUTE Client-Port-DNIS 30 string ++ATTRIBUTE Caller-ID 31 string ++VALUE Service-Type Login 1 ++VALUE Service-Type Framed 2 ++VALUE Service-Type Callback-Login 3 ++VALUE Service-Type Callback-Framed 4 ++VALUE Service-Type Exec-User 7 ++ ++# ++# For compatibility with ESVA RADIUS, Old Cistron RADIUS ++# ++ATTRIBUTE Session 1034 integer ++ATTRIBUTE User-Name-Is-Star 1035 integer ++VALUE User-Name-Is-Star No 0 ++VALUE User-Name-Is-Star Yes 1 +diff --git a/src/plugins/vbng/etc/dictionary.dhcp b/src/plugins/vbng/etc/dictionary.dhcp +new file mode 100644 +index 00000000..cf329348 +--- /dev/null ++++ b/src/plugins/vbng/etc/dictionary.dhcp +@@ -0,0 +1,440 @@ ++# -*- text -*- ++# Copyright (C) 2011 The FreeRADIUS Server project and contributors ++############################################################################## ++# ++# DHCP to RADUS gateway dictionary. ++# ++# http://www.iana.org/assignments/bootp-dhcp-parameters ++# ++# Also http://www.networksorcery.com/enp/protocol/bootp/options.htm ++# ++# http://www.bind9.net/rfc-dhcp ++# ++# $Id: 73632c57d3860bb30749a1df4dad2320d5f79f31 $ ++# ++############################################################################## ++ ++# ++ ++# This is really Apollo's number, but since they're out of business, ++# I don't think they'll be needing this. ++# ++# HP owns the Apollo assets, but let's not worry about that. ++# ++# The vendor codes are 2 octets, because we need 256 numbers ++# for the base DHCP options, PLUS a few for the DHCP headers, ++# which aren't in option format. ++# ++# On top of that, a number of options are really TLV's. ++# We need to be able to understand them, too. ++# ++VENDOR DHCP 54 format=2,1 ++ ++BEGIN-VENDOR DHCP ++ ++ATTRIBUTE DHCP-Opcode 256 byte ++ATTRIBUTE DHCP-Hardware-Type 257 byte ++ATTRIBUTE DHCP-Hardware-Address-Length 258 byte ++ATTRIBUTE DHCP-Hop-Count 259 byte ++ATTRIBUTE DHCP-Transaction-Id 260 integer ++ATTRIBUTE DHCP-Number-of-Seconds 261 short ++ATTRIBUTE DHCP-Flags 262 short ++ATTRIBUTE DHCP-Client-IP-Address 263 ipaddr ++ATTRIBUTE DHCP-Your-IP-Address 264 ipaddr ++ATTRIBUTE DHCP-Server-IP-Address 265 ipaddr ++ATTRIBUTE DHCP-Gateway-IP-Address 266 ipaddr ++ATTRIBUTE DHCP-Client-Hardware-Address 267 ether # 16 octets ++ATTRIBUTE DHCP-Server-Host-Name 268 string # 64 octets ++ATTRIBUTE DHCP-Boot-Filename 269 string # 128 octets ++ ++ATTRIBUTE DHCP-Relay-To-IP-Address 270 ipaddr ++ATTRIBUTE DHCP-Relay-Max-Hop-Count 271 integer ++ ++# This is copied from the request packet, giaddr, and ++# added to the reply packet by the server core. ++ATTRIBUTE DHCP-Relay-IP-Address 272 ipaddr ++ ++VALUE DHCP-Flags Broadcast 0x8000 ++ ++VALUE DHCP-Hardware-Type Ethernet 1 ++VALUE DHCP-Hardware-Type Experiemental-Ethernet 2 ++VALUE DHCP-Hardware-Type AX.25 3 ++VALUE DHCP-Hardware-Type Proteon-Token-Ring 4 ++VALUE DHCP-Hardware-Type Chaos 5 ++VALUE DHCP-Hardware-Type IEEE-802 6 ++VALUE DHCP-Hardware-Type Arcnet 7 ++VALUE DHCP-Hardware-Type Hyperchannel 8 ++VALUE DHCP-Hardware-Type Lanstar 9 ++VALUE DHCP-Hardware-Type Autonet-Short-Address 10 ++VALUE DHCP-Hardware-Type LocalTalk 11 ++VALUE DHCP-Hardware-Type LocalNet 12 ++VALUE DHCP-Hardware-Type Ultra-Link 13 ++VALUE DHCP-Hardware-Type SMDS 14 ++VALUE DHCP-Hardware-Type Frame-Relay 15 ++VALUE DHCP-Hardware-Type ATM-16 16 ++VALUE DHCP-Hardware-Type HDLC 17 ++VALUE DHCP-Hardware-Type Fibre-Channel 18 ++VALUE DHCP-Hardware-Type ATM-19 19 ++VALUE DHCP-Hardware-Type Serial-Line 20 ++VALUE DHCP-Hardware-Type ATM-21 21 ++VALUE DHCP-Hardware-Type MIL-STD-188-220 22 ++VALUE DHCP-Hardware-Type Metricom 23 ++VALUE DHCP-Hardware-Type IEEE-1394 24 ++VALUE DHCP-Hardware-Type MAPOS 25 ++VALUE DHCP-Hardware-Type Twinaxial 26 ++VALUE DHCP-Hardware-Type EUI-64 27 ++VALUE DHCP-Hardware-Type HIPARP 28 ++VALUE DHCP-Hardware-Type IP-Over-ISO-7816-3 29 ++VALUE DHCP-Hardware-Type ARPSec 30 ++VALUE DHCP-Hardware-Type IPSec-Tunnel 31 ++VALUE DHCP-Hardware-Type Infiniband 32 ++VALUE DHCP-Hardware-Type CAI-TIA-102 33 ++ ++############################################################################## ++# ++# DHCP Options, with comments. For now, many are "octets", ++# as FreeRADIUS doesn't handle complex data structures. ++# ++############################################################################## ++ ++#ATTRIBUTE DHCP-Pad 0 octets ++ATTRIBUTE DHCP-Subnet-Mask 1 ipaddr ++# Time Offset in twos-complement notation. ++ATTRIBUTE DHCP-Time-Offset 2 integer ++ATTRIBUTE DHCP-Router-Address 3 ipaddr array ++ATTRIBUTE DHCP-Time-Server 4 ipaddr array ++ATTRIBUTE DHCP-IEN-116-Name-Server 5 ipaddr array ++ATTRIBUTE DHCP-Domain-Name-Server 6 ipaddr array ++# Logging-Server addresses ++ATTRIBUTE DHCP-Log-Server 7 ipaddr array ++ATTRIBUTE DHCP-Quotes-Server 8 ipaddr array ++ATTRIBUTE DHCP-LPR-Server 9 ipaddr array ++ATTRIBUTE DHCP-Impress-Server 10 ipaddr array ++ATTRIBUTE DHCP-RLP-Server 11 ipaddr array ++# Hostname string ++ATTRIBUTE DHCP-Hostname 12 string ++# Size of boot file in 512 byte ++ATTRIBUTE DHCP-Boot-File-Size 13 short ++# Client to dump and name ++ATTRIBUTE DHCP-Merit-Dump-File 14 octets ++ATTRIBUTE DHCP-Domain-Name 15 string ++ATTRIBUTE DHCP-Swap-Server 16 ipaddr ++# Path name for root disk ++ATTRIBUTE DHCP-Root-Path 17 string ++ATTRIBUTE DHCP-Bootp-Extensions-Path 18 string ++ATTRIBUTE DHCP-IP-Forward-Enable 19 byte ++ATTRIBUTE DHCP-Source-Route-Enable 20 byte ++# Routing Policy Filters ++ATTRIBUTE DHCP-Policy-Filter 21 octets ++ATTRIBUTE DHCP-Max-Datagram-Reassembly-Sz 22 short ++ATTRIBUTE DHCP-Default-IP-TTL 23 octets ++ATTRIBUTE DHCP-Path-MTU-Aging-Timeout 24 integer ++ATTRIBUTE DHCP-Path-MTU-Plateau-Table 25 short array ++ATTRIBUTE DHCP-Interface-MTU-Size 26 short ++ATTRIBUTE DHCP-All-Subnets-Are-Local 27 byte ++ATTRIBUTE DHCP-Broadcast-Address 28 ipaddr ++ATTRIBUTE DHCP-Perform-Mask-Discovery 29 byte ++ATTRIBUTE DHCP-Provide-Mask-To-Others 30 byte ++ATTRIBUTE DHCP-Perform-Router-Discovery 31 byte ++ATTRIBUTE DHCP-Router-Solicitation-Address 32 ipaddr ++# first is destination address, second is router. ++ATTRIBUTE DHCP-Static-Routes 33 ipaddr array ++ATTRIBUTE DHCP-Trailer-Encapsulation 34 byte ++ATTRIBUTE DHCP-ARP-Cache-Timeout 35 integer ++ATTRIBUTE DHCP-Ethernet-Encapsulation 36 byte ++ATTRIBUTE DHCP-Default-TCP-TTL 37 byte ++ATTRIBUTE DHCP-Keep-Alive-Interval 38 integer ++ATTRIBUTE DHCP-Keep-Alive-Garbage 39 byte ++ATTRIBUTE DHCP-NIS-Domain-Name 40 string ++ATTRIBUTE DHCP-NIS-Servers 41 ipaddr array ++ATTRIBUTE DHCP-NTP-Servers 42 ipaddr array ++# N Vendor Specific Information ++ATTRIBUTE DHCP-Vendor 43 octets # tlv ++ATTRIBUTE DHCP-NETBIOS-Name-Servers 44 ipaddr array ++ATTRIBUTE DHCP-NETBIOS-Dgm-Dist-Servers 45 ipaddr array ++ATTRIBUTE DHCP-NETBIOS-Node-Type 46 byte ++# N NETBIOS Scope ++ATTRIBUTE DHCP-NETBIOS 47 octets ++ATTRIBUTE DHCP-X-Window-Font-Server 48 ipaddr array ++ATTRIBUTE DHCP-X-Window-Display-Mgr 49 ipaddr array ++ATTRIBUTE DHCP-Requested-IP-Address 50 ipaddr ++ATTRIBUTE DHCP-IP-Address-Lease-Time 51 integer ++# Overload "sname" or "file" ++ATTRIBUTE DHCP-Overload 52 byte ++ATTRIBUTE DHCP-Message-Type 53 byte ++ATTRIBUTE DHCP-DHCP-Server-Identifier 54 ipaddr ++ ++# Array of 1-byte numbers indicating which options the client ++# would like to see in the response. ++ATTRIBUTE DHCP-Parameter-Request-List 55 byte array ++ATTRIBUTE DHCP-DHCP-Error-Message 56 octets ++ATTRIBUTE DHCP-DHCP-Maximum-Msg-Size 57 short ++ATTRIBUTE DHCP-Renewal-Time 58 integer ++ATTRIBUTE DHCP-Rebinding-Time 59 integer ++ATTRIBUTE DHCP-Vendor-Class-Identifier 60 string ++ ++# Client Identifier ++# First octets is DHCP-Hardware-Type, rest are type-specific data, ++# e.g. MAC address. ++ATTRIBUTE DHCP-Client-Identifier 61 ether ++ATTRIBUTE DHCP-Netware-Domain-Name 62 octets ++ATTRIBUTE DHCP-Netware-Sub-Options 63 octets ++ATTRIBUTE DHCP-NIS-Client-Domain-Name 64 octets ++ATTRIBUTE DHCP-NIS-Server-Address 65 ipaddr ++ATTRIBUTE DHCP-TFTP-Server-Name 66 string ++ATTRIBUTE DHCP-Boot-File-Name 67 string ++# Home Agent Addresses ++ATTRIBUTE DHCP-Home-Agent-Address 68 octets ++ATTRIBUTE DHCP-SMTP-Server-Address 69 ipaddr array ++ATTRIBUTE DHCP-POP3-Server-Address 70 ipaddr array ++ATTRIBUTE DHCP-NNTP-Server-Address 71 ipaddr array ++ATTRIBUTE DHCP-WWW-Server-Address 72 ipaddr array ++ATTRIBUTE DHCP-Finger-Server-Address 73 ipaddr array ++ATTRIBUTE DHCP-IRC-Server-Address 74 ipaddr array ++ATTRIBUTE DHCP-StreetTalk-Server-Address 75 ipaddr array ++ATTRIBUTE DHCP-STDA-Server-Address 76 ipaddr array ++# User Class Information ++ATTRIBUTE DHCP-User-Class 77 octets ++# directory agent information ++ATTRIBUTE DHCP-Directory-Agent 78 octets ++# service location agent scope ++ATTRIBUTE DHCP-Service-Scope 79 octets ++# Rapid Commit ++ATTRIBUTE DHCP-Rapid-Commit 80 octets ++# Fully Qualified Domain Name ++ATTRIBUTE DHCP-Client-FQDN 81 string ++# Relay Agent Information ++ATTRIBUTE DHCP-Relay-Agent-Information 82 tlv ++ ++ATTRIBUTE DHCP-Agent-Circuit-Id 82.1 octets ++ATTRIBUTE DHCP-Agent-Remote-Id 82.2 octets ++ ++ATTRIBUTE DHCP-Relay-Circuit-Id 82.1 octets ++ATTRIBUTE DHCP-Relay-Remote-Id 82.2 octets ++ ++# 3 is reserved and shouldn't be used for anything ++ATTRIBUTE DHCP-Docsis-Device-Class 82.4 integer ++ATTRIBUTE DHCP-Relay-Link-Selection 82.5 ipaddr ++ATTRIBUTE DHCP-Subscriber-Id 82.6 string ++ ++# AGH! RADIUS inside of DHCP! ++ATTRIBUTE DHCP-RADIUS-Attributes 82.7 octets ++ ++# Horribly complicated ++ATTRIBUTE DHCP-Authentication-Information 82.8 octets ++ATTRIBUTE DHCP-Vendor-Specific-Information 82.9 octets ++ATTRIBUTE DHCP-Relay-Agent-Flags 82.10 byte ++ATTRIBUTE DHCP-Server-Identifier-Override 82.11 ipaddr ++ ++# Internet Storage Name Service ++ATTRIBUTE DHCP-iSNS 83 octets ++# Novell Directory Services ++ATTRIBUTE DHCP-NDS-Servers 85 octets ++# Novell Directory Services ++ATTRIBUTE DHCP-NDS-Tree-Name 86 octets ++# Novell Directory Services ++ATTRIBUTE DHCP-NDS-Context 87 octets ++# Authentication ++ATTRIBUTE DHCP-Authentication 90 octets ++ ++ATTRIBUTE DHCP-Client-Last-Txn-Time 91 octets ++ ++ATTRIBUTE DHCP-associated-ip 92 octets ++# Client System Architecture ++ATTRIBUTE DHCP-Client-System 93 octets ++# Client Network Device Interface ++ATTRIBUTE DHCP-Client-NDI 94 octets ++# Lightweight Directory Access Protocol ++ATTRIBUTE DHCP-LDAP 95 octets ++# UUID/GUID-based Client Identifier ++ATTRIBUTE DHCP-UUID/GUID 97 octets ++# Open Group's User Authentication ++ATTRIBUTE DHCP-User-Auth 98 octets ++# NetInfo Parent-Server Address ++ATTRIBUTE DHCP-Netinfo-Address 112 octets ++# NetInfo Parent-Server Tag ++ATTRIBUTE DHCP-Netinfo-Tag 113 octets ++# URL ++ATTRIBUTE DHCP-URL 114 octets ++# DHCP Auto-Configuration ++ATTRIBUTE DHCP-Auto-Config 116 byte ++# Name Service Search ++ATTRIBUTE DHCP-Name-Service-Search 117 octets ++# Subnet Selection Option ++ATTRIBUTE DHCP-Subnet-Selection-Option 118 octets ++# DNS domain serach list ++ATTRIBUTE DHCP-Domain-Search 119 octets ++# SIP-Servers DHCP Option ++ATTRIBUTE DHCP-SIP-Servers-DHCP-Option 120 octets ++# Classless Static Route Option ++ATTRIBUTE DHCP-Classless-Static-Route 121 octets ++# CableLabs Client Configuration ++ATTRIBUTE DHCP-CCC 122 octets ++# 16 GeoConf Option ++ATTRIBUTE DHCP-GeoConf-Option 123 octets ++ ++# Vendor Class ++# ++# String name that defines the vendor space used for the TLV's ++# in option 125. ++# ++ATTRIBUTE DHCP-V-I-Vendor-Class 124 octets ++# Vendor-Specific ++ATTRIBUTE DHCP-V-I-Vendor-Specific 125 octets # tlv ++ATTRIBUTE DHCP-Etherboot 128 ether ++# (for IP Phone software load) ++ATTRIBUTE DHCP-TFTP-Server-IP-Address 128 octets ++ ++ATTRIBUTE DHCP-Call-Server-IP-address 129 octets ++ ++ATTRIBUTE DHCP-Ethernet-Interface 130 octets ++ ++ATTRIBUTE DHCP-Vendor-Discrimination-Str 130 octets ++ ++ATTRIBUTE DHCP-Remote-Stats-Svr-IP-Address 131 octets ++ ++ATTRIBUTE DHCP-IEEE-802.1Q-L2-Priority 132 octets ++ ++ATTRIBUTE DHCP-IEEE-802.1P-VLAN-ID 133 octets ++ ++ATTRIBUTE DHCP-Diffserv-Code-Point 134 octets ++ ++ATTRIBUTE DHCP-HTTP-Proxy 135 octets ++ ++ATTRIBUTE DHCP-Cisco-TFTP-Server-IP-Addresses 150 ipaddr array ++ ++ATTRIBUTE DHCP-End-Of-Options 255 byte ++ ++VALUE DHCP-Opcode Client-Message 1 ++VALUE DHCP-Opcode Server-Message 2 ++ ++VALUE DHCP-Message-Type DHCP-Do-Not-Respond 0 ++VALUE DHCP-Message-Type DHCP-Discover 1 ++VALUE DHCP-Message-Type DHCP-Offer 2 ++VALUE DHCP-Message-Type DHCP-Request 3 ++VALUE DHCP-Message-Type DHCP-Decline 4 ++VALUE DHCP-Message-Type DHCP-Ack 5 ++VALUE DHCP-Message-Type DHCP-NAK 6 ++VALUE DHCP-Message-Type DHCP-Release 7 ++VALUE DHCP-Message-Type DHCP-Inform 8 ++VALUE DHCP-Message-Type DHCP-Force-Renew 9 ++ ++VALUE DHCP-Parameter-Request-List DHCP-Subnet-Mask 1 ++VALUE DHCP-Parameter-Request-List DHCP-Time-Offset 2 ++VALUE DHCP-Parameter-Request-List DHCP-Router-Address 3 ++VALUE DHCP-Parameter-Request-List DHCP-Time-Server 4 ++VALUE DHCP-Parameter-Request-List DHCP-IEN-116-Name-Server 5 ++VALUE DHCP-Parameter-Request-List DHCP-Domain-Name-Server 6 ++VALUE DHCP-Parameter-Request-List DHCP-Log-Server 7 ++VALUE DHCP-Parameter-Request-List DHCP-Quotes-Server 8 ++VALUE DHCP-Parameter-Request-List DHCP-LPR-Server 9 ++VALUE DHCP-Parameter-Request-List DHCP-Impress-Server 10 ++VALUE DHCP-Parameter-Request-List DHCP-RLP-Server 11 ++VALUE DHCP-Parameter-Request-List DHCP-Hostname 12 ++VALUE DHCP-Parameter-Request-List DHCP-Boot-File-Size 13 ++VALUE DHCP-Parameter-Request-List DHCP-Merit-Dump-File 14 ++VALUE DHCP-Parameter-Request-List DHCP-Domain-Name 15 ++VALUE DHCP-Parameter-Request-List DHCP-Swap-Server 16 ++VALUE DHCP-Parameter-Request-List DHCP-Root-Path 17 ++VALUE DHCP-Parameter-Request-List DHCP-Bootp-Extensions-Path 18 ++VALUE DHCP-Parameter-Request-List DHCP-IP-Forward-Enable 19 ++VALUE DHCP-Parameter-Request-List DHCP-Source-Route-Enable 20 ++VALUE DHCP-Parameter-Request-List DHCP-Policy-Filter 21 ++VALUE DHCP-Parameter-Request-List DHCP-Max-Datagram-Reassembly-Sz 22 ++VALUE DHCP-Parameter-Request-List DHCP-Default-IP-TTL 23 ++VALUE DHCP-Parameter-Request-List DHCP-Path-MTU-Aging-Timeout 24 ++VALUE DHCP-Parameter-Request-List DHCP-Path-MTU-Plateau-Table 25 ++VALUE DHCP-Parameter-Request-List DHCP-Interface-MTU-Size 26 ++VALUE DHCP-Parameter-Request-List DHCP-All-Subnets-Are-Local 27 ++VALUE DHCP-Parameter-Request-List DHCP-Broadcast-Address 28 ++VALUE DHCP-Parameter-Request-List DHCP-Perform-Mask-Discovery 29 ++VALUE DHCP-Parameter-Request-List DHCP-Provide-Mask-To-Others 30 ++VALUE DHCP-Parameter-Request-List DHCP-Perform-Router-Discovery 31 ++VALUE DHCP-Parameter-Request-List DHCP-Router-Solicitation-Address 32 ++VALUE DHCP-Parameter-Request-List DHCP-Static-Routes 33 ++VALUE DHCP-Parameter-Request-List DHCP-Trailer-Encapsulation 34 ++VALUE DHCP-Parameter-Request-List DHCP-ARP-Cache-Timeout 35 ++VALUE DHCP-Parameter-Request-List DHCP-Ethernet-Encapsulation 36 ++VALUE DHCP-Parameter-Request-List DHCP-Default-TCP-TTL 37 ++VALUE DHCP-Parameter-Request-List DHCP-Keep-Alive-Interval 38 ++VALUE DHCP-Parameter-Request-List DHCP-Keep-Alive-Garbage 39 ++VALUE DHCP-Parameter-Request-List DHCP-NIS-Domain-Name 40 ++VALUE DHCP-Parameter-Request-List DHCP-NIS-Servers 41 ++VALUE DHCP-Parameter-Request-List DHCP-NTP-Servers 42 ++VALUE DHCP-Parameter-Request-List DHCP-Vendor 43 ++VALUE DHCP-Parameter-Request-List DHCP-NETBIOS-Name-Servers 44 ++VALUE DHCP-Parameter-Request-List DHCP-NETBIOS-Dgm-Dist-Servers 45 ++VALUE DHCP-Parameter-Request-List DHCP-NETBIOS-Node-Type 46 ++VALUE DHCP-Parameter-Request-List DHCP-NETBIOS 47 ++VALUE DHCP-Parameter-Request-List DHCP-X-Window-Font-Server 48 ++VALUE DHCP-Parameter-Request-List DHCP-X-Window-Display-Mgr 49 ++VALUE DHCP-Parameter-Request-List DHCP-Requested-IP-Address 50 ++VALUE DHCP-Parameter-Request-List DHCP-IP-Address-Lease-Time 51 ++VALUE DHCP-Parameter-Request-List DHCP-Overload 52 ++VALUE DHCP-Parameter-Request-List DHCP-Message-Type 53 ++VALUE DHCP-Parameter-Request-List DHCP-DHCP-Server-Identifier 54 ++VALUE DHCP-Parameter-Request-List DHCP-Parameter-Request-List 55 ++VALUE DHCP-Parameter-Request-List DHCP-DHCP-Error-Message 56 ++VALUE DHCP-Parameter-Request-List DHCP-DHCP-Maximum-Msg-Size 57 ++VALUE DHCP-Parameter-Request-List DHCP-Renewal-Time 58 ++VALUE DHCP-Parameter-Request-List DHCP-Rebinding-Time 59 ++VALUE DHCP-Parameter-Request-List DHCP-Class-Identifier 60 ++VALUE DHCP-Parameter-Request-List DHCP-Client-Identifier 61 ++VALUE DHCP-Parameter-Request-List DHCP-Netware-Domain-Name 62 ++VALUE DHCP-Parameter-Request-List DHCP-Netware-Sub-Options 63 ++VALUE DHCP-Parameter-Request-List DHCP-NIS-Client-Domain-Name 64 ++VALUE DHCP-Parameter-Request-List DHCP-NIS-Server-Address 65 ++VALUE DHCP-Parameter-Request-List DHCP-TFTP-Server-Name 66 ++VALUE DHCP-Parameter-Request-List DHCP-Boot-File-Name 67 ++VALUE DHCP-Parameter-Request-List DHCP-Home-Agent-Address 68 ++VALUE DHCP-Parameter-Request-List DHCP-SMTP-Server-Address 69 ++VALUE DHCP-Parameter-Request-List DHCP-POP3-Server-Address 70 ++VALUE DHCP-Parameter-Request-List DHCP-NNTP-Server-Address 71 ++VALUE DHCP-Parameter-Request-List DHCP-WWW-Server-Address 72 ++VALUE DHCP-Parameter-Request-List DHCP-Finger-Server-Address 73 ++VALUE DHCP-Parameter-Request-List DHCP-IRC-Server-Address 74 ++VALUE DHCP-Parameter-Request-List DHCP-StreetTalk-Server-Address 75 ++VALUE DHCP-Parameter-Request-List DHCP-STDA-Server-Address 76 ++VALUE DHCP-Parameter-Request-List DHCP-User-Class 77 ++VALUE DHCP-Parameter-Request-List DHCP-Directory-Agent 78 ++VALUE DHCP-Parameter-Request-List DHCP-Service-Scope 79 ++VALUE DHCP-Parameter-Request-List DHCP-Rapid-Commit 80 ++VALUE DHCP-Parameter-Request-List DHCP-Client-FQDN 81 ++VALUE DHCP-Parameter-Request-List DHCP-Relay-Agent-Information 82 ++VALUE DHCP-Parameter-Request-List DHCP-iSNS 83 ++VALUE DHCP-Parameter-Request-List DHCP-NDS-Servers 85 ++VALUE DHCP-Parameter-Request-List DHCP-NDS-Tree-Name 86 ++VALUE DHCP-Parameter-Request-List DHCP-NDS-Context 87 ++VALUE DHCP-Parameter-Request-List DHCP-Authentication 90 ++VALUE DHCP-Parameter-Request-List DHCP-Client-Last-Txn-Time 91 ++VALUE DHCP-Parameter-Request-List DHCP-associated-ip 92 ++VALUE DHCP-Parameter-Request-List DHCP-Client-System 93 ++VALUE DHCP-Parameter-Request-List DHCP-Client-NDI 94 ++VALUE DHCP-Parameter-Request-List DHCP-LDAP 95 ++VALUE DHCP-Parameter-Request-List DHCP-UUID/GUID 97 ++VALUE DHCP-Parameter-Request-List DHCP-User-Auth 98 ++VALUE DHCP-Parameter-Request-List DHCP-Netinfo-Address 112 ++VALUE DHCP-Parameter-Request-List DHCP-Netinfo-Tag 113 ++VALUE DHCP-Parameter-Request-List DHCP-URL 114 ++VALUE DHCP-Parameter-Request-List DHCP-Auto-Config 116 ++VALUE DHCP-Parameter-Request-List DHCP-Name-Service-Search 117 ++VALUE DHCP-Parameter-Request-List DHCP-Subnet-Selection-Option 118 ++VALUE DHCP-Parameter-Request-List DHCP-Domain-Search 119 ++VALUE DHCP-Parameter-Request-List DHCP-SIP-Servers-DHCP-Option 120 ++VALUE DHCP-Parameter-Request-List DHCP-Classless-Static-Route 121 ++VALUE DHCP-Parameter-Request-List DHCP-CCC 122 ++VALUE DHCP-Parameter-Request-List DHCP-GeoConf-Option 123 ++VALUE DHCP-Parameter-Request-List DHCP-V-I-Vendor-Class 124 ++VALUE DHCP-Parameter-Request-List DHCP-V-I-Vendor-Specific 125 ++VALUE DHCP-Parameter-Request-List DHCP-Etherboot 128 ++VALUE DHCP-Parameter-Request-List DHCP-TFTP-Server-IP-Address 128 ++VALUE DHCP-Parameter-Request-List DHCP-Call-Server-IP-address 129 ++VALUE DHCP-Parameter-Request-List DHCP-Ethernet-Interface 130 ++VALUE DHCP-Parameter-Request-List DHCP-Vendor-Discrimination-Str 130 ++VALUE DHCP-Parameter-Request-List DHCP-Remote-Stats-Svr-IP-Address 131 ++VALUE DHCP-Parameter-Request-List DHCP-IEEE-802.1P-VLAN-ID 132 ++VALUE DHCP-Parameter-Request-List DHCP-IEEE-802.1Q-L2-Priority 133 ++VALUE DHCP-Parameter-Request-List DHCP-Diffserv-Code-Point 134 ++VALUE DHCP-Parameter-Request-List DHCP-HTTP-Proxy 135 ++ ++END-VENDOR DHCP +diff --git a/src/plugins/vbng/etc/dictionary.merit b/src/plugins/vbng/etc/dictionary.merit +new file mode 100644 +index 00000000..7d675e50 +--- /dev/null ++++ b/src/plugins/vbng/etc/dictionary.merit +@@ -0,0 +1,17 @@ ++# ++# Experimental extensions, configuration only (for check-items) ++# Names/numbers as per the MERIT extensions (if possible). ++# ++ATTRIBUTE NAS-Identifier 32 string ++ATTRIBUTE Proxy-State 33 string ++ATTRIBUTE Login-LAT-Service 34 string ++ATTRIBUTE Login-LAT-Node 35 string ++ATTRIBUTE Login-LAT-Group 36 string ++ATTRIBUTE Framed-AppleTalk-Link 37 integer ++ATTRIBUTE Framed-AppleTalk-Network 38 integer ++ATTRIBUTE Framed-AppleTalk-Zone 39 string ++ATTRIBUTE Acct-Input-Packets 47 integer ++ATTRIBUTE Acct-Output-Packets 48 integer ++# 8 is a MERIT extension. ++VALUE Service-Type Authenticate-Only 8 ++ +diff --git a/src/plugins/vbng/etc/dictionary.sip b/src/plugins/vbng/etc/dictionary.sip +new file mode 100644 +index 00000000..149fa4cb +--- /dev/null ++++ b/src/plugins/vbng/etc/dictionary.sip +@@ -0,0 +1,77 @@ ++# ++# Updated 97/06/13 to livingston-radius-2.01 miquels@cistron.nl ++# ++# This file contains dictionary translations for parsing ++# requests and generating responses. All transactions are ++# composed of Attribute/Value Pairs. The value of each attribute ++# is specified as one of 4 data types. Valid data types are: ++# ++# string - 0-253 octets ++# ipaddr - 4 octets in network byte order ++# integer - 32 bit value in big endian order (high byte first) ++# date - 32 bit value in big endian order - seconds since ++# 00:00:00 GMT, Jan. 1, 1970 ++# ++# Enumerated values are stored in the user file with dictionary ++# VALUE translations for easy administration. ++# ++# Example: ++# ++# ATTRIBUTE VALUE ++# --------------- ----- ++# Framed-Protocol = PPP ++# 7 = 1 (integer encoding) ++# ++ ++# ++# Experimental SIP Attributes/Values (draft-sterman-aaa-sip-00.txt etc) ++# ++ATTRIBUTE Sip-Method 101 integer ++ATTRIBUTE Sip-Response-Code 102 integer ++ATTRIBUTE Sip-CSeq 103 string ++ATTRIBUTE Sip-To-Tag 104 string ++ATTRIBUTE Sip-From-Tag 105 string ++ATTRIBUTE Sip-Branch-ID 106 string ++ATTRIBUTE Sip-Translated-Request-URI 107 string ++ATTRIBUTE Sip-Source-IP-Address 108 ipaddr ++ATTRIBUTE Sip-Source-Port 109 integer ++ATTRIBUTE Sip-User-ID 110 string ++ATTRIBUTE Sip-User-Realm 111 string ++ATTRIBUTE Sip-User-Nonce 112 string ++ATTRIBUTE Sip-User-Method 113 string ++ATTRIBUTE Sip-User-Digest-URI 114 string ++ATTRIBUTE Sip-User-Nonce-Count 115 string ++ATTRIBUTE Sip-User-QOP 116 string ++ATTRIBUTE Sip-User-Opaque 117 string ++ATTRIBUTE Sip-User-Response 118 string ++ATTRIBUTE Sip-User-CNonce 119 string ++ATTRIBUTE Sip-URI-User 208 string ++ATTRIBUTE Sip-Req-URI 210 string ++ATTRIBUTE Sip-CC 212 string ++ATTRIBUTE Sip-RPId 213 string ++ATTRIBUTE Digest-Response 206 string ++ATTRIBUTE Digest-Attributes 207 string ++ATTRIBUTE Digest-Realm 1063 string ++ATTRIBUTE Digest-Nonce 1064 string ++ATTRIBUTE Digest-Method 1065 string ++ATTRIBUTE Digest-URI 1066 string ++ATTRIBUTE Digest-QOP 1067 string ++ATTRIBUTE Digest-Algorithm 1068 string ++ATTRIBUTE Digest-Body-Digest 1069 string ++ATTRIBUTE Digest-CNonce 1070 string ++ATTRIBUTE Digest-Nonce-Count 1071 string ++ATTRIBUTE Digest-User-Name 1072 string ++ ++VALUE Service-Type SIP 15 ++ ++VALUE Sip-Method Other 0 ++VALUE Sip-Method Invite 1 ++VALUE Sip-Method Cancel 2 ++VALUE Sip-Method Ack 3 ++VALUE Sip-Method Bye 4 ++ ++VALUE Sip-Response-Code Other 0 ++VALUE Sip-Response-Code Invite 1 ++VALUE Sip-Response-Code Cancel 2 ++VALUE Sip-Response-Code Ack 3 ++VALUE Sip-Response-Code Bye 4 +diff --git a/src/plugins/vbng/etc/issue b/src/plugins/vbng/etc/issue +new file mode 100644 +index 00000000..62544873 +--- /dev/null ++++ b/src/plugins/vbng/etc/issue +@@ -0,0 +1,5 @@ ++(\I) ++----------------------------------------------------- ++\S \R (\N) (port \L) ++----------------------------------------------------- ++ +diff --git a/src/plugins/vbng/etc/port-id-map b/src/plugins/vbng/etc/port-id-map +new file mode 100644 +index 00000000..9088a0b9 +--- /dev/null ++++ b/src/plugins/vbng/etc/port-id-map +@@ -0,0 +1,24 @@ ++# ++# port-id-map ++# ++# This file describes the ttyname to port id mapping. The port id ++# is reported as part of a RADIUS authentication or accouting request. ++# ++#ttyname (as returned by ttyname(3)) port-id ++/dev/tty1 1 ++/dev/tty2 2 ++/dev/tty3 3 ++/dev/tty4 4 ++/dev/tty5 5 ++/dev/tty6 6 ++/dev/tty7 7 ++/dev/tty8 8 ++/dev/ttyS0 9 ++/dev/ttyS1 10 ++/dev/ttyS2 11 ++/dev/ttyS3 12 ++/dev/ttyS4 13 ++/dev/ttyS5 14 ++/dev/ttyS6 15 ++/dev/ttyS7 16 ++ +\ No newline at end of file +diff --git a/src/plugins/vbng/etc/radiusclient.conf b/src/plugins/vbng/etc/radiusclient.conf +new file mode 100644 +index 00000000..3a315b46 +--- /dev/null ++++ b/src/plugins/vbng/etc/radiusclient.conf +@@ -0,0 +1,92 @@ ++# General settings ++ ++# specify which authentication comes first respectively which ++# authentication is used. possible values are: "radius" and "local". ++# if you specify "radius,local" then the RADIUS server is asked ++# first then the local one. if only one keyword is specified only ++# this server is asked. ++auth_order radius,local ++ ++# maximum login tries a user has ++login_tries 4 ++ ++# timeout for all login tries ++# if this time is exceeded the user is kicked out ++login_timeout 60 ++ ++# name of the nologin file which when it exists disables logins. ++# it may be extended by the ttyname which will result in ++# a terminal specific lock (e.g. /etc/nologin.ttyS2 will disable ++# logins on /dev/ttyS2) ++nologin /etc/nologin ++ ++# name of the issue file. it's only display when no username is passed ++# on the radlogin command line ++issue /usr/local/etc/radiusclient/issue ++ ++# RADIUS settings ++ ++# RADIUS server to use for authentication requests. this config ++# item can appear more then one time. if multiple servers are ++# defined they are tried in a round robin fashion if one ++# server is not answering. ++# optionally you can specify a the port number on which is remote ++# RADIUS listens separated by a colon from the hostname. if ++# no port is specified /etc/services is consulted of the radius ++# service. if this fails also a compiled in default is used. ++authserver localhost ++ ++# RADIUS server to use for accouting requests. All that I ++# said for authserver applies, too. ++# ++acctserver localhost ++ ++# file holding shared secrets used for the communication ++# between the RADIUS client and server ++servers /usr/local/etc/radiusclient/servers ++ ++# dictionary of allowed attributes and values ++# just like in the normal RADIUS distributions ++dictionary /usr/local/etc/radiusclient/dictionary ++ ++# program to call for a RADIUS authenticated login ++login_radius /usr/local/sbin/login.radius ++ ++# file which holds sequence number for communication with the ++# RADIUS server ++seqfile /var/run/radius.seq ++ ++# file which specifies mapping between ttyname and NAS-Port attribute ++mapfile /usr/local/etc/radiusclient/port-id-map ++ ++# default authentication realm to append to all usernames if no ++# realm was explicitly specified by the user ++# the radiusd directly form Livingston doesnt use any realms, so leave ++# it blank then ++default_realm ++ ++# time to wait for a reply from the RADIUS server ++radius_timeout 10 ++ ++# resend request this many times before trying the next server ++radius_retries 3 ++ ++# The length of time in seconds that we skip a nonresponsive RADIUS ++# server for transaction requests. Server(s) being in the "dead" state ++# are tried only after all other non-dead servers have been tried and ++# failed or timeouted. The deadtime interval starts when the server ++# does not respond to an authentication/accounting request transmissions. ++# When the interval expires, the "dead" server would be re-tried again, ++# and if it's still down then it will be considered "dead" for another ++# such interval and so on. This option is no-op if there is only one ++# server in the list. Set to 0 in order to disable the feature. ++radius_deadtime 0 ++ ++# local address from which radius packets have to be sent ++bindaddr * ++ ++# LOCAL settings ++ ++# program to execute for local login ++# it must support the -f flag for preauthenticated login ++login_local /bin/login +diff --git a/src/plugins/vbng/etc/radiusclient.conf.in b/src/plugins/vbng/etc/radiusclient.conf.in +new file mode 100644 +index 00000000..fdf62e6d +--- /dev/null ++++ b/src/plugins/vbng/etc/radiusclient.conf.in +@@ -0,0 +1,92 @@ ++# General settings ++ ++# specify which authentication comes first respectively which ++# authentication is used. possible values are: "radius" and "local". ++# if you specify "radius,local" then the RADIUS server is asked ++# first then the local one. if only one keyword is specified only ++# this server is asked. ++auth_order radius,local ++ ++# maximum login tries a user has ++login_tries 4 ++ ++# timeout for all login tries ++# if this time is exceeded the user is kicked out ++login_timeout 60 ++ ++# name of the nologin file which when it exists disables logins. ++# it may be extended by the ttyname which will result in ++# a terminal specific lock (e.g. /etc/nologin.ttyS2 will disable ++# logins on /dev/ttyS2) ++nologin /etc/nologin ++ ++# name of the issue file. it's only display when no username is passed ++# on the radlogin command line ++issue @pkgsysconfdir@/issue ++ ++# RADIUS settings ++ ++# RADIUS server to use for authentication requests. this config ++# item can appear more then one time. if multiple servers are ++# defined they are tried in a round robin fashion if one ++# server is not answering. ++# optionally you can specify a the port number on which is remote ++# RADIUS listens separated by a colon from the hostname. if ++# no port is specified /etc/services is consulted of the radius ++# service. if this fails also a compiled in default is used. ++authserver localhost ++ ++# RADIUS server to use for accouting requests. All that I ++# said for authserver applies, too. ++# ++acctserver localhost ++ ++# file holding shared secrets used for the communication ++# between the RADIUS client and server ++servers @pkgsysconfdir@/servers ++ ++# dictionary of allowed attributes and values ++# just like in the normal RADIUS distributions ++dictionary @pkgsysconfdir@/dictionary ++ ++# program to call for a RADIUS authenticated login ++login_radius @sbindir@/login.radius ++ ++# file which holds sequence number for communication with the ++# RADIUS server ++seqfile /var/run/radius.seq ++ ++# file which specifies mapping between ttyname and NAS-Port attribute ++mapfile @pkgsysconfdir@/port-id-map ++ ++# default authentication realm to append to all usernames if no ++# realm was explicitly specified by the user ++# the radiusd directly form Livingston doesnt use any realms, so leave ++# it blank then ++default_realm ++ ++# time to wait for a reply from the RADIUS server ++radius_timeout 10 ++ ++# resend request this many times before trying the next server ++radius_retries 3 ++ ++# The length of time in seconds that we skip a nonresponsive RADIUS ++# server for transaction requests. Server(s) being in the "dead" state ++# are tried only after all other non-dead servers have been tried and ++# failed or timeouted. The deadtime interval starts when the server ++# does not respond to an authentication/accounting request transmissions. ++# When the interval expires, the "dead" server would be re-tried again, ++# and if it's still down then it will be considered "dead" for another ++# such interval and so on. This option is no-op if there is only one ++# server in the list. Set to 0 in order to disable the feature. ++radius_deadtime 0 ++ ++# local address from which radius packets have to be sent ++bindaddr * ++ ++# LOCAL settings ++ ++# program to execute for local login ++# it must support the -f flag for preauthenticated login ++login_local /bin/login +diff --git a/src/plugins/vbng/etc/servers b/src/plugins/vbng/etc/servers +new file mode 100644 +index 00000000..50eddd39 +--- /dev/null ++++ b/src/plugins/vbng/etc/servers +@@ -0,0 +1,10 @@ ++## Server Name or Client/Server pair Key ++## ---------------- --------------- ++# ++#portmaster.elemental.net hardlyasecret ++#portmaster2.elemental.net donttellanyone ++# ++## uncomment the following line for simple testing of radlogin ++## with freeradius-server ++# ++#localhost/localhost testing123 +diff --git a/src/plugins/vbng/include/freeradius-client.h b/src/plugins/vbng/include/freeradius-client.h +new file mode 100644 +index 00000000..96c75460 +--- /dev/null ++++ b/src/plugins/vbng/include/freeradius-client.h +@@ -0,0 +1,528 @@ ++/* ++ * $Id: freeradius-client.h,v 1.18 2010/06/15 09:22:51 aland Exp $ ++ * ++ * Copyright (C) 1995,1996,1997,1998 Lars Fenneberg ++ * ++ * Copyright 1992 Livingston Enterprises, Inc. ++ * ++ * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan ++ * and Merit Network, Inc. All Rights Reserved ++ * ++ * See the file COPYRIGHT for the respective terms and conditions. ++ * If the file is missing contact me at lf@elemental.net ++ * and I'll send you a copy. ++ * ++ */ ++ ++#ifndef FREERADIUS_CLIENT_H ++#define FREERADIUS_CLIENT_H ++ ++#ifdef CP_DEBUG ++#define DEBUG(args, ...) rc_log(## args) ++#else ++#define DEBUG(args, ...) ; ++#endif ++ ++#include <sys/types.h> ++/* ++ * Include for C99 uintX_t defines is stdint.h on most systems. Solaris uses ++ * inttypes.h instead. Comment out the stdint include if you get an error, ++ * and uncomment the inttypes.h include. ++ */ ++#include <stdint.h> ++/* #include <inttypes.h> */ ++#include <stdio.h> ++#include <time.h> ++ ++#undef __BEGIN_DECLS ++#undef __END_DECLS ++#ifdef __cplusplus ++# define __BEGIN_DECLS extern "C" { ++# define __END_DECLS } ++#else ++# define __BEGIN_DECLS /* empty */ ++# define __END_DECLS /* empty */ ++#endif ++ ++#define AUTH_VECTOR_LEN 16 ++#define AUTH_PASS_LEN (3 * 16) /* multiple of 16 */ ++#define AUTH_ID_LEN 64 ++#define AUTH_STRING_LEN 253 /* maximum of 253 */ ++ ++#define BUFFER_LEN 8192 ++ ++#define NAME_LENGTH 32 ++#define GETSTR_LENGTH 128 /* must be bigger than AUTH_PASS_LEN */ ++ ++#define MAX_SECRET_LENGTH (3 * 16) /* MUST be multiple of 16 */ ++ ++#define VENDOR(x) (((x) >> 16) & 0xffff) ++#define ATTRID(x) ((x) & 0xffff) ++ ++#define PW_MAX_MSG_SIZE 4096 ++ ++/* codes for radius_buildreq, radius_getport, etc. */ ++#define AUTH 0 ++#define ACCT 1 ++ ++/* defines for config.c */ ++ ++#define SERVER_MAX 8 ++ ++#define AUTH_LOCAL_FST (1<<0) ++#define AUTH_RADIUS_FST (1<<1) ++#define AUTH_LOCAL_SND (1<<2) ++#define AUTH_RADIUS_SND (1<<3) ++ ++typedef struct server { ++ int max; ++ char *name[SERVER_MAX]; ++ uint16_t port[SERVER_MAX]; ++ char *secret[SERVER_MAX]; ++ double deadtime_ends[SERVER_MAX]; ++} SERVER; ++ ++typedef struct pw_auth_hdr ++{ ++ uint8_t code; ++ uint8_t id; ++ uint16_t length; ++ uint8_t vector[AUTH_VECTOR_LEN]; ++ uint8_t data[2]; ++} AUTH_HDR; ++ ++struct rc_conf ++{ ++ struct _option *config_options; ++ uint32_t this_host_ipaddr; ++ uint32_t *this_host_bind_ipaddr; ++ struct map2id_s *map2id_list; ++ struct dict_attr *dictionary_attributes; ++ struct dict_value *dictionary_values; ++ struct dict_vendor *dictionary_vendors; ++ char buf[GETSTR_LENGTH]; ++ char buf1[14]; ++ char ifname[512]; ++}; ++ ++typedef struct rc_conf rc_handle; ++ ++#define AUTH_HDR_LEN 20 ++#define CHAP_VALUE_LENGTH 16 ++ ++#define PW_AUTH_UDP_PORT 1645 ++#define PW_ACCT_UDP_PORT 1646 ++ ++#define PW_TYPE_STRING 0 ++#define PW_TYPE_INTEGER 1 ++#define PW_TYPE_IPADDR 2 ++#define PW_TYPE_DATE 3 ++#define PW_TYPE_IPV6ADDR 4 ++#define PW_TYPE_IPV6PREFIX 5 ++ ++/* standard RADIUS codes */ ++ ++#define PW_ACCESS_REQUEST 1 ++#define PW_ACCESS_ACCEPT 2 ++#define PW_ACCESS_REJECT 3 ++#define PW_ACCOUNTING_REQUEST 4 ++#define PW_ACCOUNTING_RESPONSE 5 ++#define PW_ACCOUNTING_STATUS 6 ++#define PW_PASSWORD_REQUEST 7 ++#define PW_PASSWORD_ACK 8 ++#define PW_PASSWORD_REJECT 9 ++#define PW_ACCOUNTING_MESSAGE 10 ++#define PW_ACCESS_CHALLENGE 11 ++#define PW_STATUS_SERVER 12 ++#define PW_STATUS_CLIENT 13 ++ ++ ++/* standard RADIUS attribute-value pairs */ ++ ++#define PW_USER_NAME 1 /* string */ ++#define PW_USER_PASSWORD 2 /* string */ ++#define PW_CHAP_PASSWORD 3 /* string */ ++#define PW_NAS_IP_ADDRESS 4 /* ipaddr */ ++#define PW_NAS_PORT 5 /* integer */ ++#define PW_SERVICE_TYPE 6 /* integer */ ++#define PW_FRAMED_PROTOCOL 7 /* integer */ ++#define PW_FRAMED_IP_ADDRESS 8 /* ipaddr */ ++#define PW_FRAMED_IP_NETMASK 9 /* ipaddr */ ++#define PW_FRAMED_ROUTING 10 /* integer */ ++#define PW_FILTER_ID 11 /* string */ ++#define PW_FRAMED_MTU 12 /* integer */ ++#define PW_FRAMED_COMPRESSION 13 /* integer */ ++#define PW_LOGIN_IP_HOST 14 /* ipaddr */ ++#define PW_LOGIN_SERVICE 15 /* integer */ ++#define PW_LOGIN_PORT 16 /* integer */ ++#define PW_OLD_PASSWORD 17 /* string */ /* deprecated */ ++#define PW_REPLY_MESSAGE 18 /* string */ ++#define PW_LOGIN_CALLBACK_NUMBER 19 /* string */ ++#define PW_FRAMED_CALLBACK_ID 20 /* string */ ++#define PW_EXPIRATION 21 /* date */ /* deprecated */ ++#define PW_FRAMED_ROUTE 22 /* string */ ++#define PW_FRAMED_IPX_NETWORK 23 /* integer */ ++#define PW_STATE 24 /* string */ ++#define PW_CLASS 25 /* string */ ++#define PW_VENDOR_SPECIFIC 26 /* string */ ++#define PW_SESSION_TIMEOUT 27 /* integer */ ++#define PW_IDLE_TIMEOUT 28 /* integer */ ++#define PW_TERMINATION_ACTION 29 /* integer */ ++#define PW_CALLED_STATION_ID 30 /* string */ ++#define PW_CALLING_STATION_ID 31 /* string */ ++#define PW_NAS_IDENTIFIER 32 /* string */ ++#define PW_PROXY_STATE 33 /* string */ ++#define PW_LOGIN_LAT_SERVICE 34 /* string */ ++#define PW_LOGIN_LAT_NODE 35 /* string */ ++#define PW_LOGIN_LAT_GROUP 36 /* string */ ++#define PW_FRAMED_APPLETALK_LINK 37 /* integer */ ++#define PW_FRAMED_APPLETALK_NETWORK 38 /* integer */ ++#define PW_FRAMED_APPLETALK_ZONE 39 /* string */ ++#define PW_EVENT_TIMESTAMP 55 /* integer */ ++#define PW_CHAP_CHALLENGE 60 /* string */ ++#define PW_NAS_PORT_TYPE 61 /* integer */ ++#define PW_PORT_LIMIT 62 /* integer */ ++#define PW_LOGIN_LAT_PORT 63 /* string */ ++#define PW_CONNECT_INFO 77 /* string */ ++#define PW_MESSAGE_AUTHENTICATOR 80 /* string */ ++ ++/* RFC3162 IPv6 attributes */ ++ ++#define PW_NAS_IPV6_ADDRESS 95 /* string */ ++#define PW_FRAMED_INTERFACE_ID 96 /* string */ ++#define PW_FRAMED_IPV6_PREFIX 97 /* string */ ++#define PW_LOGIN_IPV6_HOST 98 /* string */ ++#define PW_FRAMED_IPV6_ROUTE 99 /* string */ ++#define PW_FRAMED_IPV6_POOL 100 /* string */ ++ ++/* RFC6911 IPv6 attributes */ ++#define PW_FRAMED_IPV6_ADDRESS 168 /* ipaddr6 */ ++#define PW_DNS_SERVER_IPV6_ADDRESS 169 /* ipaddr6 */ ++#define PW_ROUTE_IPV6_INFORMATION 170 /* ipv6prefix */ ++ ++/* Accounting */ ++ ++#define PW_ACCT_STATUS_TYPE 40 /* integer */ ++#define PW_ACCT_DELAY_TIME 41 /* integer */ ++#define PW_ACCT_INPUT_OCTETS 42 /* integer */ ++#define PW_ACCT_OUTPUT_OCTETS 43 /* integer */ ++#define PW_ACCT_SESSION_ID 44 /* string */ ++#define PW_ACCT_AUTHENTIC 45 /* integer */ ++#define PW_ACCT_SESSION_TIME 46 /* integer */ ++#define PW_ACCT_INPUT_PACKETS 47 /* integer */ ++#define PW_ACCT_OUTPUT_PACKETS 48 /* integer */ ++#define PW_ACCT_TERMINATE_CAUSE 49 /* integer */ ++#define PW_ACCT_MULTI_SESSION_ID 50 /* string */ ++#define PW_ACCT_LINK_COUNT 51 /* integer */ ++#define PW_ACCT_INPUT_GIGAWORDS 52 /* integer */ ++#define PW_ACCT_OUTPUT_GIGAWORDS 53 /* integer */ ++ ++/* Experimental SIP-specific attributes (draft-sterman-aaa-sip-00.txt etc) */ ++ ++#define PW_DIGEST_RESPONSE 206 /* string */ ++#define PW_DIGEST_ATTRIBUTES 207 /* string */ ++#define PW_DIGEST_REALM 1063 /* string */ ++#define PW_DIGEST_NONCE 1064 /* string */ ++#define PW_DIGEST_METHOD 1065 /* string */ ++#define PW_DIGEST_URI 1066 /* string */ ++#define PW_DIGEST_QOP 1067 /* string */ ++#define PW_DIGEST_ALGORITHM 1068 /* string */ ++#define PW_DIGEST_BODY_DIGEST 1069 /* string */ ++#define PW_DIGEST_CNONCE 1070 /* string */ ++#define PW_DIGEST_NONCE_COUNT 1071 /* string */ ++#define PW_DIGEST_USER_NAME 1072 /* string */ ++ ++/* Merit Experimental Extensions */ ++ ++#define PW_USER_ID 222 /* string */ ++#define PW_USER_REALM 223 /* string */ ++ ++/* Integer Translations */ ++ ++/* SERVICE TYPES */ ++ ++#define PW_LOGIN 1 ++#define PW_FRAMED 2 ++#define PW_CALLBACK_LOGIN 3 ++#define PW_CALLBACK_FRAMED 4 ++#define PW_OUTBOUND 5 ++#define PW_ADMINISTRATIVE 6 ++#define PW_NAS_PROMPT 7 ++#define PW_AUTHENTICATE_ONLY 8 ++#define PW_CALLBACK_NAS_PROMPT 9 ++ ++/* FRAMED PROTOCOLS */ ++ ++#define PW_PPP 1 ++#define PW_SLIP 2 ++#define PW_ARA 3 ++#define PW_GANDALF 4 ++#define PW_XYLOGICS 5 ++ ++/* FRAMED ROUTING VALUES */ ++ ++#define PW_NONE 0 ++#define PW_BROADCAST 1 ++#define PW_LISTEN 2 ++#define PW_BROADCAST_LISTEN 3 ++ ++/* FRAMED COMPRESSION TYPES */ ++ ++#define PW_VAN_JACOBSON_TCP_IP 1 ++#define PW_IPX_HEADER_COMPRESSION 2 ++ ++/* LOGIN SERVICES */ ++ ++#define PW_TELNET 0 ++#define PW_RLOGIN 1 ++#define PW_TCP_CLEAR 2 ++#define PW_PORTMASTER 3 ++#define PW_LAT 4 ++#define PW_X25_PAD 5 ++#define PW_X25_T3POS 6 ++ ++/* TERMINATION ACTIONS */ ++ ++#define PW_DEFAULT 0 ++#define PW_RADIUS_REQUEST 1 ++ ++/* PROHIBIT PROTOCOL */ ++ ++#define PW_DUMB 0 /* 1 and 2 are defined in FRAMED PROTOCOLS */ ++#define PW_AUTH_ONLY 3 ++#define PW_ALL 255 ++ ++/* ACCOUNTING STATUS TYPES */ ++ ++#define PW_STATUS_START 1 ++#define PW_STATUS_STOP 2 ++#define PW_STATUS_ALIVE 3 ++#define PW_STATUS_MODEM_START 4 ++#define PW_STATUS_MODEM_STOP 5 ++#define PW_STATUS_CANCEL 6 ++#define PW_ACCOUNTING_ON 7 ++#define PW_ACCOUNTING_OFF 8 ++ ++/* ACCOUNTING TERMINATION CAUSES */ ++ ++#define PW_USER_REQUEST 1 ++#define PW_LOST_CARRIER 2 ++#define PW_LOST_SERVICE 3 ++#define PW_ACCT_IDLE_TIMEOUT 4 ++#define PW_ACCT_SESSION_TIMEOUT 5 ++#define PW_ADMIN_RESET 6 ++#define PW_ADMIN_REBOOT 7 ++#define PW_PORT_ERROR 8 ++#define PW_NAS_ERROR 9 ++#define PW_NAS_REQUEST 10 ++#define PW_NAS_REBOOT 11 ++#define PW_PORT_UNNEEDED 12 ++#define PW_PORT_PREEMPTED 13 ++#define PW_PORT_SUSPENDED 14 ++#define PW_SERVICE_UNAVAILABLE 15 ++#define PW_CALLBACK 16 ++#define PW_USER_ERROR 17 ++#define PW_HOST_REQUEST 18 ++ ++/* NAS PORT TYPES */ ++ ++#define PW_ASYNC 0 ++#define PW_SYNC 1 ++#define PW_ISDN_SYNC 2 ++#define PW_ISDN_SYNC_V120 3 ++#define PW_ISDN_SYNC_V110 4 ++#define PW_VIRTUAL 5 ++ ++/* AUTHENTIC TYPES */ ++#define PW_RADIUS 1 ++#define PW_LOCAL 2 ++#define PW_REMOTE 3 ++ ++/* Server data structures */ ++ ++typedef struct dict_attr ++{ ++ char name[NAME_LENGTH + 1]; /* attribute name */ ++ int value; /* attribute index */ ++ int type; /* string, int, etc. */ ++ struct dict_attr *next; ++} DICT_ATTR; ++ ++typedef struct dict_value ++{ ++ char attrname[NAME_LENGTH +1]; ++ char name[NAME_LENGTH + 1]; ++ int value; ++ struct dict_value *next; ++} DICT_VALUE; ++ ++typedef struct dict_vendor ++{ ++ char vendorname[NAME_LENGTH +1]; ++ int vendorpec; ++ struct dict_vendor *next; ++} DICT_VENDOR; ++ ++typedef struct value_pair ++{ ++ char name[NAME_LENGTH + 1]; ++ int attribute; ++ int type; ++ uint32_t lvalue; ++ char strvalue[AUTH_STRING_LEN + 1]; ++ struct value_pair *next; ++} VALUE_PAIR; ++ ++/* don't change this, as it has to be the same as in the Merit radiusd code */ ++#define MGMT_POLL_SECRET "Hardlyasecret" ++ ++/* Define return codes from "SendServer" utility */ ++ ++#define BADRESP_RC -2 ++#define ERROR_RC -1 ++#define OK_RC 0 ++#define TIMEOUT_RC 1 ++#define REJECT_RC 2 ++ ++typedef struct send_data /* Used to pass information to sendserver() function */ ++{ ++ uint8_t code; /* RADIUS packet code */ ++ uint8_t seq_nbr; /* Packet sequence number */ ++ char *server; /* Name/addrress of RADIUS server */ ++ int svc_port; /* RADIUS protocol destination port */ ++ char *secret; /* Shared secret of RADIUS server */ ++ int timeout; /* Session timeout in seconds */ ++ int retries; ++ VALUE_PAIR *send_pairs; /* More a/v pairs to send */ ++ VALUE_PAIR *receive_pairs; /* Where to place received a/v pairs */ ++} SEND_DATA; ++ ++#ifndef MIN ++#define MIN(a, b) ((a) < (b) ? (a) : (b)) ++#endif ++#ifndef MAX ++#define MAX(a, b) ((a) > (b) ? (a) : (b)) ++#endif ++ ++#ifndef PATH_MAX ++#define PATH_MAX 1024 ++#endif ++ ++typedef struct env ++{ ++ int maxsize, size; ++ char **env; ++} ENV; ++ ++#define ENV_SIZE 128 ++ ++__BEGIN_DECLS ++ ++/* Function prototypes */ ++ ++/* avpair.c */ ++ ++VALUE_PAIR *rc_avpair_add(rc_handle const *, VALUE_PAIR **, int, void const *, int, int); ++int rc_avpair_assign(VALUE_PAIR *, void const *, int); ++VALUE_PAIR *rc_avpair_new(rc_handle const *, int, void const *, int, int); ++VALUE_PAIR *rc_avpair_gen(rc_handle const *, VALUE_PAIR *, unsigned char const *, int, int); ++VALUE_PAIR *rc_avpair_get(VALUE_PAIR *, int, int); ++void rc_avpair_insert(VALUE_PAIR **, VALUE_PAIR *, VALUE_PAIR *); ++void rc_avpair_free(VALUE_PAIR *); ++int rc_avpair_parse(rc_handle const *, char const *, VALUE_PAIR **); ++int rc_avpair_tostr(rc_handle const *, VALUE_PAIR *, char *, int, char *, int); ++char *rc_avpair_log(rc_handle const *, VALUE_PAIR *, char *buf, size_t buf_len); ++VALUE_PAIR *rc_avpair_readin(rc_handle const *, FILE *); ++ ++/* buildreq.c */ ++ ++void rc_buildreq(rc_handle const *, SEND_DATA *, int, char *, unsigned short, char *, int, int); ++unsigned char rc_get_id(); ++int rc_auth(rc_handle *, uint32_t, VALUE_PAIR *, VALUE_PAIR **, char *); ++int rc_auth_proxy(rc_handle *, VALUE_PAIR *, VALUE_PAIR **, char *); ++int rc_acct(rc_handle *, uint32_t, VALUE_PAIR *); ++int rc_acct_proxy(rc_handle *, VALUE_PAIR *); ++int rc_check(rc_handle *, char *, char *, unsigned short, char *); ++ ++int rc_aaa(rc_handle *rh, uint32_t client_port, VALUE_PAIR *send, VALUE_PAIR **received, ++ char *msg, int add_nas_port, int request_type); ++ ++/* clientid.c */ ++ ++int rc_read_mapfile(rc_handle *, char const *); ++uint32_t rc_map2id(rc_handle const *, char const *); ++void rc_map2id_free(rc_handle *); ++ ++/* config.c */ ++ ++rc_handle *rc_read_config(char const *); ++char *rc_conf_str(rc_handle const *, char const *); ++int rc_conf_int(rc_handle const *, char const *); ++SERVER *rc_conf_srv(rc_handle const *, char const *); ++int rc_find_server(rc_handle const *, char const *, uint32_t *, char *); ++void rc_config_free(rc_handle *); ++int rc_add_config(rc_handle *, char const *, char const *, char const *, int); ++rc_handle *rc_config_init(rc_handle *); ++int test_config(rc_handle const *, char const *); ++ ++/* dict.c */ ++ ++int rc_read_dictionary(rc_handle *, char const *); ++DICT_ATTR *rc_dict_getattr(rc_handle const *, int); ++DICT_ATTR *rc_dict_findattr(rc_handle const *, char const *); ++DICT_VALUE *rc_dict_findval(rc_handle const *, char const *); ++DICT_VENDOR *rc_dict_findvend(rc_handle const *, char const *); ++DICT_VENDOR *rc_dict_getvend(rc_handle const *, int); ++DICT_VALUE * rc_dict_getval(rc_handle const *, uint32_t, char const *); ++void rc_dict_free(rc_handle *); ++ ++/* ip_util.c */ ++ ++struct hostent *rc_gethostbyname(char const *); ++struct hostent *rc_gethostbyaddr(char const *, size_t, int); ++uint32_t rc_get_ipaddr(char const *); ++int rc_good_ipaddr(char const *); ++char const *rc_ip_hostname(uint32_t); ++unsigned short rc_getport(int); ++int rc_own_hostname(char *, int); ++uint32_t rc_own_ipaddress(rc_handle *); ++uint32_t rc_own_bind_ipaddress(rc_handle *); ++struct sockaddr; ++int rc_get_srcaddr(struct sockaddr *, struct sockaddr *); ++ ++ ++/* log.c */ ++ ++void rc_openlog(char const *); ++void rc_log(int, char const *, ...); ++ ++/* sendserver.c */ ++ ++int rc_send_server(rc_handle *, SEND_DATA *, char *); ++ ++/* util.c */ ++ ++void rc_str2tm(char const *, struct tm *); ++char *rc_getifname(rc_handle *, char const *); ++char *rc_getstr(rc_handle *, char const *, int); ++void rc_mdelay(int); ++char *rc_mksid(rc_handle *); ++rc_handle *rc_new(void); ++void rc_destroy(rc_handle *); ++char *rc_fgetln(FILE *, size_t *); ++double rc_getctime(void); ++ ++/* env.c */ ++ ++struct env *rc_new_env(int); ++void rc_free_env(struct env *); ++int rc_add_env(struct env *, char const *, char const *); ++int rc_import_env(struct env *, char const **); ++ ++/* md5.c */ ++ ++void rc_md5_calc(unsigned char *, unsigned char const *, unsigned int); ++ ++__END_DECLS ++ ++#endif /* FREERADIUS_CLIENT_H */ +diff --git a/src/plugins/vbng/include/includes.h b/src/plugins/vbng/include/includes.h +new file mode 100644 +index 00000000..908f0e74 +--- /dev/null ++++ b/src/plugins/vbng/include/includes.h +@@ -0,0 +1,182 @@ ++/* ++ * $Id: includes.h,v 1.6 2007/06/21 18:07:22 cparker Exp $ ++ * ++ * Copyright (C) 1997 Lars Fenneberg ++ * ++ * Copyright 1992 Livingston Enterprises, Inc. ++ * ++ * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan ++ * and Merit Network, Inc. All Rights Reserved ++ * ++ * See the file COPYRIGHT for the respective terms and conditions. ++ * If the file is missing contact me at lf@elemental.net ++ * and I'll send you a copy. ++ * ++ */ ++ ++#include "config.h" ++ ++/* AIX requires this to be the first thing in the file. */ ++#ifndef __GNUC__ ++# if HAVE_ALLOCA_H ++# include <alloca.h> ++# else ++# ifdef _AIX ++# pragma alloca ++# else ++# ifndef alloca /* predefined by HP cc +Olibcalls */ ++ char *alloca (); ++# endif ++# endif ++# endif ++#endif ++ ++#include <sys/types.h> ++ ++#include <ctype.h> ++#include <stdio.h> ++#include <errno.h> ++ ++#ifdef HAVE_NETDB_H ++#include <netdb.h> ++#endif ++ ++#ifdef HAVE_SYSLOG_H ++#include <syslog.h> ++#endif ++ ++#ifdef STDC_HEADERS ++# include <stdlib.h> ++# include <string.h> ++# include <stdarg.h> ++#else ++# include <stdarg.h> ++# ifndef HAVE_STRCHR ++# define strchr index ++# define strrchr rindex ++# endif ++#endif ++ ++/* I realize that this is ugly and unsafe.. :( */ ++#ifndef HAVE_SNPRINTF ++# define snprintf(buf, len, format, ...) sprintf(buf, format, __VA_ARGS__) ++#endif ++#ifndef HAVE_VSNPRINTF ++# define vsnprintf(buf, len, format, ap) vsprintf(buf, format, ap) ++#endif ++ ++#ifdef HAVE_UNISTD_H ++# include <unistd.h> ++#endif /* HAVE_UNISTD_H */ ++ ++#ifdef HAVE_FCNTL_H ++# include <fcntl.h> ++#endif ++ ++#ifdef HAVE_SYS_FCNTL_H ++# include <sys/fcntl.h> ++#endif ++ ++#ifdef HAVE_SYS_FILE_H ++# include <sys/file.h> ++#endif ++ ++#ifdef HAVE_SYS_STAT_H ++# include <sys/stat.h> ++#endif ++ ++#ifdef HAVE_SYS_UTSNAME_H ++# include <sys/utsname.h> ++#endif ++ ++#ifdef HAVE_SYS_IOCTL_H ++# include <sys/ioctl.h> ++#endif ++ ++#ifdef HAVE_CRYPT_H ++# include <crypt.h> ++#endif ++ ++#ifdef HAVE_LIMITS_H ++# include <limits.h> ++#endif ++ ++#ifdef HAVE_TERMIOS_H ++# include <termios.h> ++#endif ++ ++#ifndef PATH_MAX ++#define PATH_MAX 1024 ++#endif ++ ++#ifndef UCHAR_MAX ++# ifdef __STDC__ ++# define UCHAR_MAX 255U ++# else ++# define UCHAR_MAX 255 ++# endif ++#endif ++ ++#ifdef HAVE_PWD_H ++#include <pwd.h> ++#endif ++ ++#ifdef HAVE_SYS_SOCKET_H ++#include <sys/socket.h> ++#endif ++ ++#ifdef HAVE_NETINET_IN_H ++#include <netinet/in.h> ++#endif ++ ++#ifdef HAVE_ARPA_INET_H ++#include <arpa/inet.h> ++#endif ++ ++#if defined(HAVE_SIGNAL_H) ++# include <signal.h> ++#endif ++#if defined(HAVE_SYS_SIGNAL_H) ++# include <sys/signal.h> ++#endif ++ ++#ifdef NEED_SIG_PROTOTYPES ++int sigemptyset(sigset_t *); ++int sigaddset(sigset_t *, int); ++int sigprocmask (int, sigset_t *, sigset_t *); ++#endif ++ ++#if HAVE_GETOPT_H ++# include <getopt.h> ++#endif ++ ++#if defined(HAVE_SHADOW_H) && defined(HAVE_SHADOW_PASSWORDS) ++# include <shadow.h> ++#endif ++ ++#if TIME_WITH_SYS_TIME ++# include <sys/time.h> ++# include <time.h> ++#else ++# if HAVE_SYS_TIME_H ++# include <sys/time.h> ++# else ++# include <time.h> ++# endif ++#endif ++ ++/* ++ * prefer srandom/random over srand/rand as there generator has a ++ * better distribution of the numbers on certain systems. ++ * on Linux both generators are identical. ++ */ ++#ifndef HAVE_RANDOM ++# ifdef HAVE_RAND ++# define srandom srand ++# define random rand ++# endif ++#endif ++ ++/* rlib/lock.c */ ++int do_lock_exclusive(FILE *); ++int do_unlock(FILE *); +diff --git a/src/plugins/vbng/include/messages.h b/src/plugins/vbng/include/messages.h +new file mode 100644 +index 00000000..9a5f0e81 +--- /dev/null ++++ b/src/plugins/vbng/include/messages.h +@@ -0,0 +1,53 @@ ++/* ++ * $Id: messages.h,v 1.2 2004/02/23 20:10:39 sobomax Exp $ ++ * ++ * Copyright (C) 1995,1996 Lars Fenneberg ++ * ++ * Copyright 1992 Livingston Enterprises, Inc. ++ * ++ * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan ++ * and Merit Network, Inc. All Rights Reserved ++ * ++ * See the file COPYRIGHT for the respective terms and conditions. ++ * If the file is missing contact me at lf@elemental.net ++ * and I'll send you a copy. ++ * ++ */ ++ ++/* ++ * Only messages that the user gets under normal use are in here. ++ * Error messages and such are still in the source code. ++ */ ++ ++#ifndef MESSAGES_H ++#define MESSAGES_H ++ ++/* radlogin.c */ ++ ++#define SC_LOGIN "login: " ++#define SC_PASSWORD "Password: " ++ ++#define SC_TIMEOUT "\r\nlogin timed out after %d seconds. Bye.\r\n" ++#define SC_EXCEEDED "Maximum login tries exceeded. Go away!\r\n" ++ ++#define SC_RADIUS_OK "RADIUS: Authentication OK\r\n" ++#define SC_RADIUS_FAILED "RADIUS: Authentication failure\r\n" ++ ++#define SC_LOCAL_OK "local: Authentication OK\r\n" ++#define SC_LOCAL_FAILED "local: Authentication failure\r\n" ++#define SC_NOLOGIN "\r\nSystem closed for maintenance. Try again later...\r\n" ++ ++#define SC_SERVER_REPLY "RADIUS: %s" ++ ++#define SC_DEFAULT_ISSUE "(\\I)\r\n\r\n\\S \\R (\\N) (port \\L)\r\n\r\n" ++ ++/* radacct.c */ ++ ++#define SC_ACCT_OK "RADIUS accounting OK\r\n" ++#define SC_ACCT_FAILED "RADIUS accounting failed (RC=%i)\r\n" ++ ++/* radstatus.c */ ++ ++#define SC_STATUS_FAILED "RADIUS: Status failure\r\n" ++ ++#endif /* MESSAGES_H */ +diff --git a/src/plugins/vbng/include/pathnames.h b/src/plugins/vbng/include/pathnames.h +new file mode 100644 +index 00000000..0256d473 +--- /dev/null ++++ b/src/plugins/vbng/include/pathnames.h +@@ -0,0 +1,28 @@ ++/* ++ * $Id: pathnames.h,v 1.2 2004/02/23 20:10:39 sobomax Exp $ ++ * ++ * Copyright (C) 1995,1996 Lars Fenneberg ++ * ++ * Copyright 1992 Livingston Enterprises, Inc. ++ * ++ * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan ++ * and Merit Network, Inc. All Rights Reserved ++ * ++ * See the file COPYRIGHT for the respective terms and conditions. ++ * If the file is missing contact me at lf@elemental.net ++ * and I'll send you a copy. ++ * ++ */ ++ ++#ifndef PATHNAMES_H ++#define PATHNAMES_H ++ ++#define _PATH_DEV_URANDOM "/dev/urandom" /* Linux only */ ++#define _PATH_ETC_ISSUE "/etc/issue" ++ ++/* normally defined in the Makefile */ ++#ifndef _PATH_ETC_RADIUSCLIENT_CONF ++#define _PATH_ETC_RADIUSCLIENT_CONF "/etc/radiusclient.conf" ++#endif ++ ++#endif /* PATHNAMES_H */ +diff --git a/src/plugins/vbng/lib/avpair.c b/src/plugins/vbng/lib/avpair.c +new file mode 100644 +index 00000000..8ce2a8ec +--- /dev/null ++++ b/src/plugins/vbng/lib/avpair.c +@@ -0,0 +1,874 @@ ++/* ++ * $Id: avpair.c,v 1.26 2010/06/15 09:22:52 aland Exp $ ++ * ++ * Copyright (C) 1995 Lars Fenneberg ++ * ++ * Copyright 1992 Livingston Enterprises, Inc. ++ * ++ * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan ++ * and Merit Network, Inc. All Rights Reserved ++ * ++ * See the file COPYRIGHT for the respective terms and conditions. ++ * If the file is missing contact me at lf@elemental.net ++ * and I'll send you a copy. ++ * ++ */ ++ ++#include <config.h> ++#include <includes.h> ++#include <freeradius-client.h> ++ ++/* ++ * Function: rc_avpair_add ++ * ++ * Purpose: add an attribute-value pair to the given list. ++ * ++ * Returns: pointer to added a/v pair upon success, NULL pointer upon failure. ++ * ++ * Remarks: Always appends the new pair to the end of the list. ++ * ++ */ ++ ++VALUE_PAIR *rc_avpair_add (rc_handle const *rh, VALUE_PAIR **list, int attrid, void const *pval, int len, int vendorpec) ++{ ++ VALUE_PAIR *vp; ++ ++ vp = rc_avpair_new (rh, attrid, pval, len, vendorpec); ++ ++ if (vp != NULL) ++ { ++ rc_avpair_insert (list, NULL, vp); ++ } ++ ++ return vp; ++ ++} ++ ++/* ++ * Function: rc_avpair_assign ++ * ++ * Purpose: assign the given value to an attribute-value pair. ++ * ++ * Returns: 0 on success, ++ * -1 on failure. ++ * ++ */ ++ ++int rc_avpair_assign (VALUE_PAIR *vp, void const *pval, int len) ++{ ++ ++ switch (vp->type) ++ { ++ case PW_TYPE_STRING: ++ if (len == -1) ++ len = (uint32_t)strlen((char const *)pval); ++ if (len > AUTH_STRING_LEN) { ++ rc_log(LOG_ERR, "rc_avpair_assign: bad attribute length"); ++ return -1; ++ } ++ memcpy(vp->strvalue, (char const *)pval, len); ++ vp->strvalue[len] = '\0'; ++ vp->lvalue = len; ++ break; ++ ++ case PW_TYPE_DATE: ++ case PW_TYPE_INTEGER: ++ case PW_TYPE_IPADDR: ++ vp->lvalue = * (uint32_t *) pval; ++ break; ++ case PW_TYPE_IPV6ADDR: ++ if (len != 16) { ++ rc_log(LOG_ERR, "rc_avpair_assign: bad IPv6 length"); ++ return -1; ++ } ++ memcpy(vp->strvalue, (char const *)pval, len); ++ vp->lvalue = len; ++ break; ++ ++ case PW_TYPE_IPV6PREFIX: ++ if (len < 2 || len > 18) { ++ rc_log(LOG_ERR, "rc_avpair_assign: bad IPv6 prefix length"); ++ return -1; ++ } ++ memcpy(vp->strvalue, (char const *)pval, len); ++ vp->lvalue = len; ++ break; ++ ++ default: ++ rc_log(LOG_ERR, "rc_avpair_assign: unknown attribute %d", vp->type); ++ return -1; ++ } ++ return 0; ++} ++ ++/* ++ * Function: rc_avpair_new ++ * ++ * Purpose: make a new attribute-value pair with given parameters. ++ * ++ * Returns: pointer to generated a/v pair when successful, NULL when failure. ++ * ++ */ ++ ++VALUE_PAIR *rc_avpair_new (rc_handle const *rh, int attrid, void const *pval, int len, int vendorpec) ++{ ++ VALUE_PAIR *vp = NULL; ++ DICT_ATTR *pda; ++ ++ attrid = attrid | (vendorpec << 16); ++ if ((pda = rc_dict_getattr (rh, attrid)) == NULL) ++ { ++ rc_log(LOG_ERR,"rc_avpair_new: unknown attribute %d", attrid); ++ return NULL; ++ } ++ if (vendorpec != 0 && rc_dict_getvend(rh, vendorpec) == NULL) ++ { ++ rc_log(LOG_ERR,"rc_avpair_new: unknown Vendor-Id %d", vendorpec); ++ return NULL; ++ } ++ if ((vp = malloc (sizeof (VALUE_PAIR))) != NULL) ++ { ++ strncpy (vp->name, pda->name, sizeof (vp->name)); ++ vp->attribute = attrid; ++ vp->next = NULL; ++ vp->type = pda->type; ++ if (rc_avpair_assign (vp, pval, len) == 0) ++ { ++ /* XXX: Fix up Digest-Attributes */ ++ switch (vp->attribute) { ++ case PW_DIGEST_REALM: ++ case PW_DIGEST_NONCE: ++ case PW_DIGEST_METHOD: ++ case PW_DIGEST_URI: ++ case PW_DIGEST_QOP: ++ case PW_DIGEST_ALGORITHM: ++ case PW_DIGEST_BODY_DIGEST: ++ case PW_DIGEST_CNONCE: ++ case PW_DIGEST_NONCE_COUNT: ++ case PW_DIGEST_USER_NAME: ++ /* overlapping! */ ++ if (vp->lvalue > AUTH_STRING_LEN - 2) ++ vp->lvalue = AUTH_STRING_LEN - 2; ++ memmove(&vp->strvalue[2], &vp->strvalue[0], vp->lvalue); ++ vp->strvalue[0] = vp->attribute - PW_DIGEST_REALM + 1; ++ vp->lvalue += 2; ++ vp->strvalue[1] = vp->lvalue; ++ vp->strvalue[vp->lvalue] = '\0'; ++ vp->attribute = PW_DIGEST_ATTRIBUTES; ++ default: ++ break; ++ } ++ return vp; ++ } ++ free (vp); ++ vp = NULL; ++ } ++ else ++ { ++ rc_log(LOG_CRIT,"rc_avpair_new: out of memory"); ++ } ++ ++ return vp; ++} ++ ++/* ++ * ++ * Function: rc_avpair_gen ++ * ++ * Purpose: takes attribute/value pairs from buffer and builds a ++ * value_pair list using allocated memory. Uses recursion. ++ * ++ * Returns: value_pair list or NULL on failure ++ */ ++ ++VALUE_PAIR * ++rc_avpair_gen(rc_handle const *rh, VALUE_PAIR *pair, unsigned char const *ptr, ++ int length, int vendorpec) ++{ ++ int attribute, attrlen, x_len; ++ unsigned char const *x_ptr; ++ uint32_t lvalue; ++ DICT_ATTR *attr; ++ VALUE_PAIR *rpair; ++ char buffer[(AUTH_STRING_LEN * 2) + 1]; ++ /* For hex string conversion. */ ++ char hex[3]; ++ ++ if (length < 2) { ++ rc_log(LOG_ERR, "rc_avpair_gen: received attribute with " ++ "invalid length"); ++ goto shithappens; ++ } ++ attrlen = ptr[1]; ++ if (length < attrlen || attrlen < 2) { ++ rc_log(LOG_ERR, "rc_avpair_gen: received attribute with " ++ "invalid length"); ++ goto shithappens; ++ } ++ ++ /* Advance to the next attribute and process recursively */ ++ if (length != attrlen) { ++ pair = rc_avpair_gen(rh, pair, ptr + attrlen, length - attrlen, ++ vendorpec); ++ if (pair == NULL) ++ return NULL; ++ } ++ ++ /* Actual processing */ ++ attribute = ptr[0] | (vendorpec << 16); ++ ptr += 2; ++ attrlen -= 2; ++ ++ /* VSA */ ++ if (attribute == PW_VENDOR_SPECIFIC) { ++ if (attrlen < 4) { ++ rc_log(LOG_ERR, "rc_avpair_gen: received VSA " ++ "attribute with invalid length"); ++ goto shithappens; ++ } ++ memcpy(&lvalue, ptr, 4); ++ vendorpec = ntohl(lvalue); ++ if (rc_dict_getvend(rh, vendorpec) == NULL) { ++ /* Warn and skip over the unknown VSA */ ++ rc_log(LOG_WARNING, "rc_avpair_gen: received VSA " ++ "attribute with unknown Vendor-Id %d", vendorpec); ++ return pair; ++ } ++ /* Process recursively */ ++ return rc_avpair_gen(rh, pair, ptr + 4, attrlen - 4, ++ vendorpec); ++ } ++ ++ /* Normal */ ++ attr = rc_dict_getattr(rh, attribute); ++ if (attr == NULL) { ++ buffer[0] = '\0'; /* Initial length. */ ++ x_ptr = ptr; ++ for (x_len = attrlen; x_len > 0; x_len--, x_ptr++) { ++ snprintf(hex, sizeof(hex), "%2.2X", x_ptr[0]); ++ strcat(buffer, hex); ++ } ++ if (vendorpec == 0) { ++ rc_log(LOG_WARNING, "rc_avpair_gen: received " ++ "unknown attribute %d of length %d: 0x%s", ++ attribute, attrlen + 2, buffer); ++ } else { ++ rc_log(LOG_WARNING, "rc_avpair_gen: received " ++ "unknown VSA attribute %d, vendor %d of " ++ "length %d: 0x%s", attribute & 0xffff, ++ VENDOR(attribute), attrlen + 2, buffer); ++ } ++ goto shithappens; ++ } ++ ++ rpair = malloc(sizeof(*rpair)); ++ if (rpair == NULL) { ++ rc_log(LOG_CRIT, "rc_avpair_gen: out of memory"); ++ goto shithappens; ++ } ++ memset(rpair, '\0', sizeof(*rpair)); ++ ++ /* Insert this new pair at the beginning of the list */ ++ rpair->next = pair; ++ pair = rpair; ++ strcpy(pair->name, attr->name); ++ pair->attribute = attr->value; ++ pair->type = attr->type; ++ ++ switch (attr->type) { ++ case PW_TYPE_STRING: ++ memcpy(pair->strvalue, (char *)ptr, (size_t)attrlen); ++ pair->strvalue[attrlen] = '\0'; ++ pair->lvalue = attrlen; ++ break; ++ ++ case PW_TYPE_INTEGER: ++ if (attrlen != 4) { ++ rc_log(LOG_ERR, "rc_avpair_gen: received INT " ++ "attribute with invalid length"); ++ goto shithappens; ++ } ++ case PW_TYPE_IPADDR: ++ if (attrlen != 4) { ++ rc_log(LOG_ERR, "rc_avpair_gen: received IPADDR" ++ " attribute with invalid length"); ++ goto shithappens; ++ } ++ memcpy((char *)&lvalue, (char *)ptr, 4); ++ pair->lvalue = ntohl(lvalue); ++ break; ++ case PW_TYPE_IPV6ADDR: ++ if (attrlen != 16) { ++ rc_log(LOG_ERR, "rc_avpair_gen: received IPV6ADDR" ++ " attribute with invalid length"); ++ goto shithappens; ++ } ++ memcpy(pair->strvalue, (char *)ptr, 16); ++ pair->lvalue = attrlen; ++ break; ++ case PW_TYPE_IPV6PREFIX: ++ if (attrlen > 18 || attrlen < 2) { ++ rc_log(LOG_ERR, "rc_avpair_gen: received IPV6PREFIX" ++ " attribute with invalid length: %d", attrlen); ++ goto shithappens; ++ } ++ memcpy(pair->strvalue, (char *)ptr, attrlen); ++ pair->lvalue = attrlen; ++ break; ++ case PW_TYPE_DATE: ++ if (attrlen != 4) { ++ rc_log(LOG_ERR, "rc_avpair_gen: received DATE " ++ "attribute with invalid length"); ++ goto shithappens; ++ } ++ ++ default: ++ rc_log(LOG_WARNING, "rc_avpair_gen: %s has unknown type", ++ attr->name); ++ goto shithappens; ++ } ++ return pair; ++ ++shithappens: ++ while (pair != NULL) { ++ rpair = pair->next; ++ free(pair); ++ pair = rpair; ++ } ++ return NULL; ++} ++ ++/* ++ * Function: rc_avpair_get ++ * ++ * Purpose: Find the first attribute value-pair (which matches the given ++ * attribute) from the specified value-pair list. ++ * ++ * Returns: found value_pair ++ * ++ */ ++ ++VALUE_PAIR *rc_avpair_get (VALUE_PAIR *vp, int attrid, int vendorpec) ++{ ++ for (; vp != NULL && !(ATTRID(vp->attribute) == ATTRID(attrid) && ++ VENDOR(vp->attribute) == vendorpec); vp = vp->next) ++ { ++ continue; ++ } ++ return vp; ++} ++ ++/* ++ * Function: rc_avpair_insert ++ * ++ * Purpose: Given the address of an existing list "a" and a pointer ++ * to an entry "p" in that list, add the value pair "b" to ++ * the "a" list after the "p" entry. If "p" is NULL, add ++ * the value pair "b" to the end of "a". ++ * ++ */ ++ ++void rc_avpair_insert (VALUE_PAIR **a, VALUE_PAIR *p, VALUE_PAIR *b) ++{ ++ VALUE_PAIR *this_node = NULL; ++ VALUE_PAIR *vp; ++ ++ if (b->next != NULL) ++ { ++ rc_log(LOG_CRIT, "rc_avpair_insert: value pair (0x%p) next ptr. (0x%p) not NULL", b, b->next); ++ abort (); ++ } ++ ++ if (*a == NULL) ++ { ++ *a = b; ++ return; ++ } ++ ++ vp = *a; ++ ++ if ( p == NULL) /* run to end of "a" list */ ++ { ++ while (vp != NULL) ++ { ++ this_node = vp; ++ vp = vp->next; ++ } ++ } ++ else /* look for the "p" entry in the "a" list */ ++ { ++ this_node = *a; ++ while (this_node != NULL) ++ { ++ if (this_node == p) ++ { ++ break; ++ } ++ this_node = this_node->next; ++ } ++ } ++ ++ b->next = this_node->next; ++ this_node->next = b; ++ ++ return; ++} ++ ++/* ++ * Function: rc_avpair_free ++ * ++ * Purpose: frees all value_pairs in the list ++ * ++ */ ++ ++void rc_avpair_free (VALUE_PAIR *pair) ++{ ++ VALUE_PAIR *next; ++ ++ while (pair != NULL) ++ { ++ next = pair->next; ++ free (pair); ++ pair = next; ++ } ++} ++ ++/* ++ * Function: rc_fieldcpy ++ * ++ * Purpose: Copy a data field from the buffer. Advance the buffer ++ * past the data field. Ensure that no more than len - 1 ++ * bytes are copied and that resulting string is terminated ++ * with '\0'. ++ * ++ */ ++ ++static void ++rc_fieldcpy(char *string, char const **uptr, char const *stopat, size_t len) ++{ ++ char const *ptr, *estring; ++ ++ ptr = *uptr; ++ estring = string + len - 1; ++ if (*ptr == '"') ++ { ++ ptr++; ++ while (*ptr != '"' && *ptr != '\0' && *ptr != '\n') ++ { ++ if (string < estring) ++ *string++ = *ptr; ++ ptr++; ++ } ++ if (*ptr == '"') ++ { ++ ptr++; ++ } ++ *string = '\0'; ++ *uptr = ptr; ++ return; ++ } ++ ++ while (*ptr != '\0' && strchr(stopat, *ptr) == NULL) ++ { ++ if (string < estring) ++ *string++ = *ptr; ++ ptr++; ++ } ++ *string = '\0'; ++ *uptr = ptr; ++ return; ++} ++ ++ ++/* ++ * Function: rc_avpair_parse ++ * ++ * Purpose: parses the buffer to extract the attribute-value pairs. ++ * ++ * Returns: 0 = successful parse of attribute-value pair, ++ * -1 = syntax (or other) error detected. ++ * ++ */ ++ ++#define PARSE_MODE_NAME 0 ++#define PARSE_MODE_EQUAL 1 ++#define PARSE_MODE_VALUE 2 ++#define PARSE_MODE_INVALID 3 ++ ++int rc_avpair_parse (rc_handle const *rh, char const *buffer, VALUE_PAIR **first_pair) ++{ ++ int mode; ++ char attrstr[AUTH_ID_LEN]; ++ char valstr[AUTH_STRING_LEN + 1], *p; ++ DICT_ATTR *attr = NULL; ++ DICT_VALUE *dval; ++ VALUE_PAIR *pair; ++ VALUE_PAIR *link; ++ struct tm *tm; ++ time_t timeval; ++ ++ mode = PARSE_MODE_NAME; ++ while (*buffer != '\n' && *buffer != '\0') ++ { ++ if (*buffer == ' ' || *buffer == '\t') ++ { ++ buffer++; ++ continue; ++ } ++ ++ switch (mode) ++ { ++ case PARSE_MODE_NAME: /* Attribute Name */ ++ rc_fieldcpy (attrstr, &buffer, " \t\n=,", sizeof(attrstr)); ++ if ((attr = ++ rc_dict_findattr (rh, attrstr)) == NULL) ++ { ++ rc_log(LOG_ERR, "rc_avpair_parse: unknown attribute"); ++ if (*first_pair) { ++ rc_avpair_free(*first_pair); ++ *first_pair = NULL; ++ } ++ return -1; ++ } ++ mode = PARSE_MODE_EQUAL; ++ break; ++ ++ case PARSE_MODE_EQUAL: /* Equal sign */ ++ if (*buffer == '=') ++ { ++ mode = PARSE_MODE_VALUE; ++ buffer++; ++ } ++ else ++ { ++ rc_log(LOG_ERR, "rc_avpair_parse: missing or misplaced equal sign"); ++ if (*first_pair) { ++ rc_avpair_free(*first_pair); ++ *first_pair = NULL; ++ } ++ return -1; ++ } ++ break; ++ ++ case PARSE_MODE_VALUE: /* Value */ ++ rc_fieldcpy (valstr, &buffer, " \t\n,", sizeof(valstr)); ++ ++ if ((pair = malloc (sizeof (VALUE_PAIR))) == NULL) ++ { ++ rc_log(LOG_CRIT, "rc_avpair_parse: out of memory"); ++ if (*first_pair) { ++ rc_avpair_free(*first_pair); ++ *first_pair = NULL; ++ } ++ return -1; ++ } ++ strcpy (pair->name, attr->name); ++ pair->attribute = attr->value; ++ pair->type = attr->type; ++ ++ switch (pair->type) ++ { ++ ++ case PW_TYPE_STRING: ++ strcpy (pair->strvalue, valstr); ++ pair->lvalue = (uint32_t)strlen(valstr); ++ break; ++ ++ case PW_TYPE_INTEGER: ++ if (isdigit (*valstr)) ++ { ++ pair->lvalue = atoi (valstr); ++ } ++ else ++ { ++ if ((dval = rc_dict_findval (rh, valstr)) ++ == NULL) ++ { ++ rc_log(LOG_ERR, "rc_avpair_parse: unknown attribute value: %s", valstr); ++ if (*first_pair) { ++ rc_avpair_free(*first_pair); ++ *first_pair = NULL; ++ } ++ free (pair); ++ return -1; ++ } ++ else ++ { ++ pair->lvalue = dval->value; ++ } ++ } ++ break; ++ ++ case PW_TYPE_IPADDR: ++ pair->lvalue = rc_get_ipaddr(valstr); ++ break; ++ ++ case PW_TYPE_IPV6ADDR: ++ if (inet_pton(AF_INET6, valstr, pair->strvalue) == 0) { ++ rc_log(LOG_ERR, "rc_avpair_parse: invalid IPv6 address %s", valstr); ++ free(pair); ++ return -1; ++ } ++ pair->lvalue = 16; ++ break; ++ ++ case PW_TYPE_IPV6PREFIX: ++ p = strchr(valstr, '/'); ++ if (p == NULL) { ++ rc_log(LOG_ERR, "rc_avpair_parse: invalid IPv6 prefix %s", valstr); ++ free(pair); ++ return -1; ++ } ++ *p = 0; ++ p++; ++ pair->strvalue[0] = 0; ++ pair->strvalue[1] = atoi(p); ++ ++ if (inet_pton(AF_INET6, valstr, pair->strvalue+2) == 0) { ++ rc_log(LOG_ERR, "rc_avpair_parse: invalid IPv6 prefix %s", valstr); ++ free(pair); ++ return -1; ++ } ++ pair->lvalue = 2+16; ++ break; ++ ++ case PW_TYPE_DATE: ++ timeval = time (0); ++ tm = localtime (&timeval); ++ tm->tm_hour = 0; ++ tm->tm_min = 0; ++ tm->tm_sec = 0; ++ rc_str2tm (valstr, tm); ++#ifdef TIMELOCAL ++ pair->lvalue = (uint32_t) timelocal (tm); ++#else /* TIMELOCAL */ ++ pair->lvalue = (uint32_t) mktime (tm); ++#endif /* TIMELOCAL */ ++ break; ++ ++ default: ++ rc_log(LOG_ERR, "rc_avpair_parse: unknown attribute type %d", pair->type); ++ if (*first_pair) { ++ rc_avpair_free(*first_pair); ++ *first_pair = NULL; ++ } ++ free (pair); ++ return -1; ++ } ++ ++ /* XXX: Fix up Digest-Attributes */ ++ switch (pair->attribute) { ++ case PW_DIGEST_REALM: ++ case PW_DIGEST_NONCE: ++ case PW_DIGEST_METHOD: ++ case PW_DIGEST_URI: ++ case PW_DIGEST_QOP: ++ case PW_DIGEST_ALGORITHM: ++ case PW_DIGEST_BODY_DIGEST: ++ case PW_DIGEST_CNONCE: ++ case PW_DIGEST_NONCE_COUNT: ++ case PW_DIGEST_USER_NAME: ++ /* overlapping! */ ++ if (pair->lvalue > AUTH_STRING_LEN - 2) ++ pair->lvalue = AUTH_STRING_LEN - 2; ++ memmove(&pair->strvalue[2], &pair->strvalue[0], pair->lvalue); ++ pair->strvalue[0] = pair->attribute - PW_DIGEST_REALM + 1; ++ pair->lvalue += 2; ++ pair->strvalue[1] = pair->lvalue; ++ pair->strvalue[pair->lvalue] = '\0'; ++ pair->attribute = PW_DIGEST_ATTRIBUTES; ++ } ++ ++ pair->next = NULL; ++ ++ if (*first_pair == NULL) ++ { ++ *first_pair = pair; ++ } ++ else ++ { ++ link = *first_pair; ++ while (link->next != NULL) ++ { ++ link = link->next; ++ } ++ link->next = pair; ++ } ++ ++ mode = PARSE_MODE_NAME; ++ break; ++ ++ default: ++ mode = PARSE_MODE_NAME; ++ break; ++ } ++ } ++ return 0; ++} ++ ++/* ++ * Function: rc_avpair_tostr ++ * ++ * Purpose: Translate an av_pair into two strings ++ * ++ * Returns: 0 on success, -1 on failure ++ * ++ */ ++ ++int rc_avpair_tostr (rc_handle const *rh, VALUE_PAIR *pair, char *name, int ln, char *value, int lv) ++{ ++ DICT_VALUE *dval; ++ char buffer[32]; ++ struct in_addr inad; ++ unsigned char *ptr; ++ ++ *name = *value = '\0'; ++ ++ if (!pair || pair->name[0] == '\0') { ++ rc_log(LOG_ERR, "rc_avpair_tostr: pair is NULL or empty"); ++ return -1; ++ } ++ ++ strncpy(name, pair->name, (size_t) ln); ++ ++ switch (pair->type) ++ { ++ case PW_TYPE_STRING: ++ lv--; ++ ptr = (unsigned char *) pair->strvalue; ++ if (pair->attribute == PW_DIGEST_ATTRIBUTES) { ++ pair->strvalue[*(ptr + 1)] = '\0'; ++ ptr += 2; ++ } ++ while (*ptr != '\0') ++ { ++ if (!(isprint (*ptr))) ++ { ++ snprintf (buffer, sizeof(buffer), "\\%03o", *ptr); ++ strncat(value, buffer, (size_t) lv); ++ lv -= 4; ++ if (lv < 0) break; ++ } ++ else ++ { ++ strncat(value, (char *)ptr, 1); ++ lv--; ++ if (lv <= 0) break; ++ } ++ ptr++; ++ } ++ break; ++ ++ case PW_TYPE_INTEGER: ++ dval = rc_dict_getval (rh, pair->lvalue, pair->name); ++ if (dval != NULL) ++ { ++ strncpy(value, dval->name, (size_t) lv-1); ++ } ++ else ++ { ++ snprintf(buffer, sizeof(buffer), "%ld", (long int)pair->lvalue); ++ strncpy(value, buffer, (size_t) lv); ++ } ++ break; ++ ++ case PW_TYPE_IPADDR: ++ inad.s_addr = htonl(pair->lvalue); ++ strncpy (value, inet_ntoa (inad), (size_t) lv-1); ++ break; ++ ++ case PW_TYPE_IPV6ADDR: ++ if (inet_ntop(AF_INET6, pair->strvalue, value, lv-1) == NULL) ++ return -1; ++ break; ++ ++ case PW_TYPE_IPV6PREFIX: { ++ uint8_t ip[16]; ++ uint8_t txt[48]; ++ if (pair->lvalue < 2) ++ return -1; ++ ++ memset(ip, 0, sizeof(ip)); ++ memcpy(ip, pair->strvalue+2, pair->lvalue-2); ++ ++ if (inet_ntop(AF_INET6, ip, txt, sizeof(txt)) == NULL) ++ return -1; ++ snprintf(value, lv-1, "%s/%u", txt, (unsigned)pair->strvalue[1]); ++ ++ break; ++ } ++ case PW_TYPE_DATE: ++ strftime (buffer, sizeof (buffer), "%m/%d/%y %H:%M:%S", ++ gmtime ((time_t *) & pair->lvalue)); ++ strncpy(value, buffer, lv-1); ++ break; ++ ++ default: ++ rc_log(LOG_ERR, "rc_avpair_tostr: unknown attribute type %d", pair->type); ++ return -1; ++ break; ++ } ++ ++ return 0; ++} ++ ++/* ++ * Function: rc_avpair_log ++ * ++ * Purpose: format sequence of attribute value pairs into printable ++ * string. The caller should provide a storage buffer and the buffer length. ++ * Returns pointer to provided storage buffer. ++ * ++ */ ++char * ++rc_avpair_log(rc_handle const *rh, VALUE_PAIR *pair, char *buf, size_t buf_len) ++{ ++ size_t len, nlen; ++ VALUE_PAIR *vp; ++ char name[33], value[256]; ++ ++ len = 0; ++ for (vp = pair; vp != NULL; vp = vp->next) { ++ if (rc_avpair_tostr(rh, vp, name, sizeof(name), value, ++ sizeof(value)) == -1) ++ return NULL; ++ nlen = len + 32 + 3 + strlen(value) + 2 + 2; ++ if(nlen<buf_len-1) { ++ sprintf(buf + len, "%-32s = '%s'\n", name, value); ++ } else return buf; ++ len = nlen - 1; ++ } ++ return buf; ++} ++ ++/* ++ * Function: rc_avpair_readin ++ * ++ * Purpose: get a sequence of attribute value pairs from the file input ++ * and make them into a list of value_pairs ++ * ++ */ ++ ++VALUE_PAIR *rc_avpair_readin(rc_handle const *rh, FILE *input) ++{ ++ VALUE_PAIR *vp = NULL; ++ char buffer[1024], *q; ++ ++ while (fgets(buffer, sizeof(buffer), input) != NULL) ++ { ++ q = buffer; ++ ++ while(*q && isspace(*q)) q++; ++ ++ if ((*q == '\n') || (*q == '#') || (*q == '\0')) ++ continue; ++ ++ if (rc_avpair_parse(rh, q, &vp) < 0) { ++ rc_log(LOG_ERR, "rc_avpair_readin: malformed attribute: %s", buffer); ++ rc_avpair_free(vp); ++ return NULL; ++ } ++ } ++ ++ return vp; ++} +diff --git a/src/plugins/vbng/lib/buildreq.c b/src/plugins/vbng/lib/buildreq.c +new file mode 100644 +index 00000000..a71b1f99 +--- /dev/null ++++ b/src/plugins/vbng/lib/buildreq.c +@@ -0,0 +1,276 @@ ++/* ++ * $Id: buildreq.c,v 1.17 2010/02/04 10:27:09 aland Exp $ ++ * ++ * Copyright (C) 1995,1997 Lars Fenneberg ++ * ++ * See the file COPYRIGHT for the respective terms and conditions. ++ * If the file is missing contact me at lf@elemental.net ++ * and I'll send you a copy. ++ * ++ */ ++ ++#include <config.h> ++#include <includes.h> ++#include <freeradius-client.h> ++ ++unsigned char rc_get_id(); ++ ++/* ++ * Function: rc_buildreq ++ * ++ * Purpose: builds a skeleton RADIUS request using information from the ++ * config file. ++ * ++ */ ++ ++void rc_buildreq(rc_handle const *rh, SEND_DATA *data, int code, char *server, unsigned short port, ++ char *secret, int timeout, int retries) ++{ ++ data->server = server; ++ data->secret = secret; ++ data->svc_port = port; ++ data->seq_nbr = rc_get_id(); ++ data->timeout = timeout; ++ data->retries = retries; ++ data->code = code; ++} ++ ++/* ++ * Function: rc_get_id ++ * ++ * Purpose: generate random id ++ * ++ */ ++ ++unsigned char rc_get_id() ++{ ++ return (unsigned char)(random() & UCHAR_MAX); ++} ++ ++/* ++ * Function: rc_aaa ++ * ++ * Purpose: Builds an authentication/accounting request for port id client_port ++ * with the value_pairs send and submits it to a server ++ * ++ * Returns: received value_pairs in received, messages from the server in msg ++ * and 0 on success, negative on failure as return value ++ * ++ */ ++ ++int rc_aaa(rc_handle *rh, uint32_t client_port, VALUE_PAIR *send, VALUE_PAIR **received, ++ char *msg, int add_nas_port, int request_type) ++{ ++ SEND_DATA data; ++ VALUE_PAIR *adt_vp = NULL; ++ int result; ++ int i, skip_count; ++ SERVER *aaaserver; ++ int timeout = rc_conf_int(rh, "radius_timeout"); ++ int retries = rc_conf_int(rh, "radius_retries"); ++ int radius_deadtime = rc_conf_int(rh, "radius_deadtime"); ++ double start_time = 0; ++ double now = 0; ++ time_t dtime; ++ ++ if (request_type != PW_ACCOUNTING_REQUEST) { ++ aaaserver = rc_conf_srv(rh, "authserver"); ++ } else { ++ aaaserver = rc_conf_srv(rh, "acctserver"); ++ } ++ if (aaaserver == NULL) ++ return ERROR_RC; ++ ++ data.send_pairs = send; ++ data.receive_pairs = NULL; ++ ++ if (add_nas_port != 0) { ++ /* ++ * Fill in NAS-Port ++ */ ++ if (rc_avpair_add(rh, &(data.send_pairs), PW_NAS_PORT, ++ &client_port, 0, 0) == NULL) ++ return ERROR_RC; ++ } ++ ++ if (request_type == PW_ACCOUNTING_REQUEST) { ++ /* ++ * Fill in Acct-Delay-Time ++ */ ++ dtime = 0; ++ now = rc_getctime(); ++ adt_vp = rc_avpair_get(data.send_pairs, PW_ACCT_DELAY_TIME, 0); ++ if (adt_vp == NULL) { ++ adt_vp = rc_avpair_add(rh, &(data.send_pairs), ++ PW_ACCT_DELAY_TIME, &dtime, 0, 0); ++ if (adt_vp == NULL) ++ return ERROR_RC; ++ start_time = now; ++ } else { ++ start_time = now - adt_vp->lvalue; ++ } ++ } ++ ++ skip_count = 0; ++ result = ERROR_RC; ++ for (i=0; (i < aaaserver->max) && (result != OK_RC) && (result != BADRESP_RC) ++ ; i++, now = rc_getctime()) ++ { ++ if (aaaserver->deadtime_ends[i] != -1 && ++ aaaserver->deadtime_ends[i] > start_time) { ++ skip_count++; ++ continue; ++ } ++ if (data.receive_pairs != NULL) { ++ rc_avpair_free(data.receive_pairs); ++ data.receive_pairs = NULL; ++ } ++ rc_buildreq(rh, &data, request_type, aaaserver->name[i], ++ aaaserver->port[i], aaaserver->secret[i], timeout, retries); ++ ++ if (request_type == PW_ACCOUNTING_REQUEST) { ++ dtime = now - start_time; ++ rc_avpair_assign(adt_vp, &dtime, 0); ++ } ++ ++ result = rc_send_server (rh, &data, msg); ++ if (result == TIMEOUT_RC && radius_deadtime > 0) ++ aaaserver->deadtime_ends[i] = start_time + (double)radius_deadtime; ++ } ++ if (result == OK_RC || result == BADRESP_RC || skip_count == 0) ++ goto exit; ++ ++ result = ERROR_RC; ++ for (i=0; (i < aaaserver->max) && (result != OK_RC) && (result != BADRESP_RC) ++ ; i++) ++ { ++ if (aaaserver->deadtime_ends[i] == -1 || ++ aaaserver->deadtime_ends[i] <= start_time) { ++ continue; ++ } ++ if (data.receive_pairs != NULL) { ++ rc_avpair_free(data.receive_pairs); ++ data.receive_pairs = NULL; ++ } ++ rc_buildreq(rh, &data, request_type, aaaserver->name[i], ++ aaaserver->port[i], aaaserver->secret[i], timeout, retries); ++ ++ if (request_type == PW_ACCOUNTING_REQUEST) { ++ dtime = rc_getctime() - start_time; ++ rc_avpair_assign(adt_vp, &dtime, 0); ++ } ++ ++ result = rc_send_server (rh, &data, msg); ++ if (result != TIMEOUT_RC) ++ aaaserver->deadtime_ends[i] = -1; ++ } ++ ++exit: ++ if (request_type != PW_ACCOUNTING_REQUEST) { ++ *received = data.receive_pairs; ++ } else { ++ rc_avpair_free(data.receive_pairs); ++ } ++ ++ return result; ++} ++ ++/* ++ * Function: rc_auth ++ * ++ * Purpose: Builds an authentication request for port id client_port ++ * with the value_pairs send and submits it to a server ++ * ++ * Returns: received value_pairs in received, messages from the server in msg (if non-NULL), ++ * and 0 on success, negative on failure as return value ++ * ++ */ ++ ++int rc_auth(rc_handle *rh, uint32_t client_port, VALUE_PAIR *send, VALUE_PAIR **received, ++ char *msg) ++{ ++ ++ return rc_aaa(rh, client_port, send, received, msg, 1, PW_ACCESS_REQUEST); ++} ++ ++/* ++ * Function: rc_auth_proxy ++ * ++ * Purpose: Builds an authentication request ++ * with the value_pairs send and submits it to a server. ++ * Works for a proxy; does not add IP address, and does ++ * does not rely on config file. ++ * ++ * Returns: received value_pairs in received, messages from the server in msg (if non-NULL) ++ * and 0 on success, negative on failure as return value ++ * ++ */ ++ ++int rc_auth_proxy(rc_handle *rh, VALUE_PAIR *send, VALUE_PAIR **received, char *msg) ++{ ++ ++ return rc_aaa(rh, 0, send, received, msg, 0, PW_ACCESS_REQUEST); ++} ++ ++ ++/* ++ * Function: rc_acct ++ * ++ * Purpose: Builds an accounting request for port id client_port ++ * with the value_pairs send ++ * ++ * Remarks: NAS-IP-Address, NAS-Port and Acct-Delay-Time get filled ++ * in by this function, the rest has to be supplied. ++ */ ++ ++int rc_acct(rc_handle *rh, uint32_t client_port, VALUE_PAIR *send) ++{ ++ ++ return rc_aaa(rh, client_port, send, NULL, NULL, 1, PW_ACCOUNTING_REQUEST); ++} ++ ++/* ++ * Function: rc_acct_proxy ++ * ++ * Purpose: Builds an accounting request with the value_pairs send ++ * ++ */ ++ ++int rc_acct_proxy(rc_handle *rh, VALUE_PAIR *send) ++{ ++ ++ return rc_aaa(rh, 0, send, NULL, NULL, 0, PW_ACCOUNTING_REQUEST); ++} ++ ++/* ++ * Function: rc_check ++ * ++ * Purpose: ask the server hostname on the specified port for a ++ * status message ++ * ++ */ ++ ++int rc_check(rc_handle *rh, char *host, char *secret, unsigned short port, char *msg) ++{ ++ SEND_DATA data; ++ int result; ++ uint32_t service_type; ++ int timeout = rc_conf_int(rh, "radius_timeout"); ++ int retries = rc_conf_int(rh, "radius_retries"); ++ ++ data.send_pairs = data.receive_pairs = NULL; ++ ++ /* ++ * Fill in Service-Type ++ */ ++ ++ service_type = PW_ADMINISTRATIVE; ++ rc_avpair_add(rh, &(data.send_pairs), PW_SERVICE_TYPE, &service_type, 0, 0); ++ ++ rc_buildreq(rh, &data, PW_STATUS_SERVER, host, port, secret, timeout, retries); ++ result = rc_send_server (rh, &data, msg); ++ ++ rc_avpair_free(data.receive_pairs); ++ ++ return result; ++} +diff --git a/src/plugins/vbng/lib/clientid.c b/src/plugins/vbng/lib/clientid.c +new file mode 100644 +index 00000000..6901a04b +--- /dev/null ++++ b/src/plugins/vbng/lib/clientid.c +@@ -0,0 +1,146 @@ ++/* ++ * $Id: clientid.c,v 1.7 2007/07/11 17:29:29 cparker Exp $ ++ * ++ * Copyright (C) 1995,1996,1997 Lars Fenneberg ++ * ++ * See the file COPYRIGHT for the respective terms and conditions. ++ * If the file is missing contact me at lf@elemental.net ++ * and I'll send you a copy. ++ * ++ */ ++ ++#include <config.h> ++#include <includes.h> ++#include <freeradius-client.h> ++ ++struct map2id_s { ++ char *name; ++ uint32_t id; ++ ++ struct map2id_s *next; ++}; ++ ++/* ++ * Function: rc_read_mapfile ++ * ++ * Purpose: Read in the ttyname to port id map file ++ * ++ * Arguments: the file name of the map file ++ * ++ * Returns: zero on success, negative integer on failure ++ */ ++ ++int rc_read_mapfile(rc_handle *rh, char const *filename) ++{ ++ char buffer[1024]; ++ FILE *mapfd; ++ char *c, *name, *id, *q; ++ struct map2id_s *p; ++ int lnr = 0; ++ ++ if ((mapfd = fopen(filename,"r")) == NULL) ++ { ++ rc_log(LOG_ERR,"rc_read_mapfile: can't read %s: %s", filename, strerror(errno)); ++ return -1; ++ } ++ ++#define SKIP(p) while(*p && isspace(*p)) p++; ++ ++ while (fgets(buffer, sizeof(buffer), mapfd) != NULL) ++ { ++ lnr++; ++ ++ q = buffer; ++ ++ SKIP(q); ++ ++ if ((*q == '\n') || (*q == '#') || (*q == '\0')) ++ continue; ++ ++ if (( c = strchr(q, ' ')) || (c = strchr(q,'\t'))) { ++ ++ *c = '\0'; c++; ++ SKIP(c); ++ ++ name = q; ++ id = c; ++ ++ if ((p = (struct map2id_s *)malloc(sizeof(*p))) == NULL) { ++ rc_log(LOG_CRIT,"rc_read_mapfile: out of memory"); ++ fclose(mapfd); ++ return -1; ++ } ++ ++ p->name = strdup(name); ++ p->id = atoi(id); ++ p->next = rh->map2id_list; ++ rh->map2id_list = p; ++ ++ } else { ++ ++ rc_log(LOG_ERR, "rc_read_mapfile: malformed line in %s, line %d", filename, lnr); ++ fclose(mapfd); ++ return -1; ++ ++ } ++ } ++ ++#undef SKIP ++ ++ fclose(mapfd); ++ ++ return 0; ++} ++ ++/* ++ * Function: rc_map2id ++ * ++ * Purpose: Map ttyname to port id ++ * ++ * Arguments: full pathname of the tty ++ * ++ * Returns: port id, zero if no entry found ++ */ ++ ++uint32_t rc_map2id(rc_handle const *rh, char const *name) ++{ ++ struct map2id_s *p; ++ char ttyname[PATH_MAX]; ++ ++ *ttyname = '\0'; ++ if (*name != '/') ++ strcpy(ttyname, "/dev/"); ++ ++ strncat(ttyname, name, sizeof(ttyname)-strlen(ttyname)-1); ++ ++ for(p = rh->map2id_list; p; p = p->next) ++ if (!strcmp(ttyname, p->name)) return p->id; ++ ++ rc_log(LOG_WARNING,"rc_map2id: can't find tty %s in map database", ttyname); ++ ++ return 0; ++} ++ ++/* ++ * Function: rc_map2id_free ++ * ++ * Purpose: Free allocated map2id list ++ * ++ * Arguments: Radius Client handle ++ */ ++ ++void ++rc_map2id_free(rc_handle *rh) ++{ ++ struct map2id_s *p, *np; ++ ++ if (rh->map2id_list == NULL) ++ return; ++ ++ for(p = rh->map2id_list; p != NULL; p = np) { ++ np = p->next; ++ free(p->name); ++ free(p); ++ } ++ rh->map2id_list = NULL; ++} +diff --git a/src/plugins/vbng/lib/config.c b/src/plugins/vbng/lib/config.c +new file mode 100644 +index 00000000..1db78608 +--- /dev/null ++++ b/src/plugins/vbng/lib/config.c +@@ -0,0 +1,925 @@ ++/* ++ * $Id: config.c,v 1.23 2010/04/28 14:26:15 aland Exp $ ++ * ++ * Copyright (C) 1995,1996,1997 Lars Fenneberg ++ * ++ * Copyright 1992 Livingston Enterprises, Inc. ++ * ++ * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan ++ * and Merit Network, Inc. All Rights Reserved ++ * ++ * See the file COPYRIGHT for the respective terms and conditions. ++ * If the file is missing contact me at lf@elemental.net ++ * and I'll send you a copy. ++ * ++ */ ++ ++#include <config.h> ++#include <includes.h> ++#include <freeradius-client.h> ++#include <options.h> ++ ++/* ++ * Function: find_option ++ * ++ * Purpose: find an option in the option list ++ * ++ * Returns: pointer to option on success, NULL otherwise ++ */ ++ ++static OPTION *find_option(rc_handle const *rh, char const *optname, unsigned int type) ++{ ++ int i; ++ ++ /* there're so few options that a binary search seems not necessary */ ++ for (i = 0; i < NUM_OPTIONS; i++) { ++ if (!strcmp(rh->config_options[i].name, optname) && ++ (rh->config_options[i].type & type)) ++ { ++ return &rh->config_options[i]; ++ } ++ } ++ ++ return NULL; ++} ++ ++/* ++ * Function: set_option_... ++ * ++ * Purpose: set a specific option doing type conversions ++ * ++ * Returns: 0 on success, -1 on failure ++ */ ++ ++static int set_option_str(char const *filename, int line, OPTION *option, char const *p) ++{ ++ if (p) { ++ option->val = (void *) strdup(p); ++ if (option->val == NULL) { ++ rc_log(LOG_CRIT, "read_config: out of memory"); ++ return -1; ++ } ++ } else { ++ option->val = NULL; ++ } ++ ++ return 0; ++} ++ ++static int set_option_int(char const *filename, int line, OPTION *option, char const *p) ++{ ++ int *iptr; ++ ++ if (p == NULL) { ++ rc_log(LOG_ERR, "%s: line %d: bogus option value", filename, line); ++ return -1; ++ } ++ ++ if ((iptr = malloc(sizeof(*iptr))) == NULL) { ++ rc_log(LOG_CRIT, "read_config: out of memory"); ++ return -1; ++ } ++ ++ *iptr = atoi(p); ++ option->val = (void *) iptr; ++ ++ return 0; ++} ++ ++static int set_option_srv(char const *filename, int line, OPTION *option, char const *p) ++{ ++ SERVER *serv; ++ char *p_pointer; ++ char *p_dupe; ++ char *p_save; ++ char *q; ++ char *s; ++ struct servent *svp; ++ ++ p_dupe = strdup(p); ++ ++ if (p_dupe == NULL) { ++ rc_log(LOG_ERR, "%s: line %d: Invalid option or memory failure", filename, line); ++ return -1; ++ } ++ ++ serv = (SERVER *) option->val; ++ if (serv == NULL) { ++ DEBUG(LOG_ERR, "option->val / server is NULL, allocating memory"); ++ serv = malloc(sizeof(*serv)); ++ if (serv == NULL) { ++ rc_log(LOG_CRIT, "read_config: out of memory"); ++ free(p_dupe); ++ return -1; ++ } ++ memset(serv, 0, sizeof(*serv)); ++ serv->max = 0; ++ } ++ ++ p_pointer = strtok_r(p_dupe, ", \t", &p_save); ++ ++ /* Check to see if we have 'servername:port' syntax */ ++ if ((q = strchr(p_pointer,':')) != NULL) { ++ *q = '\0'; ++ q++; ++ ++ /* Check to see if we have 'servername:port:secret' syntax */ ++ if((s = strchr(q,':')) != NULL) { ++ *s = '\0'; ++ s++; ++ serv->secret[serv->max] = strdup(s); ++ if (serv->secret[serv->max] == NULL) { ++ rc_log(LOG_CRIT, "read_config: out of memory"); ++ if (option->val == NULL) { ++ free(p_dupe); ++ free(serv); ++ } ++ return -1; ++ } ++ } ++ } ++ if(q && strlen(q) > 0) { ++ serv->port[serv->max] = atoi(q); ++ } else { ++ if (!strcmp(option->name,"authserver")) ++ if ((svp = getservbyname ("radius", "udp")) == NULL) ++ serv->port[serv->max] = PW_AUTH_UDP_PORT; ++ else ++ serv->port[serv->max] = ntohs ((unsigned int) svp->s_port); ++ else if (!strcmp(option->name, "acctserver")) ++ if ((svp = getservbyname ("radacct", "udp")) == NULL) ++ serv->port[serv->max] = PW_ACCT_UDP_PORT; ++ else ++ serv->port[serv->max] = ntohs ((unsigned int) svp->s_port); ++ else { ++ rc_log(LOG_ERR, "%s: line %d: no default port for %s", filename, line, option->name); ++ if (option->val == NULL) { ++ free(p_dupe); ++ free(serv); ++ } ++ return -1; ++ } ++ } ++ ++ serv->name[serv->max] = strdup(p_pointer); ++ if (serv->name[serv->max] == NULL) { ++ rc_log(LOG_CRIT, "read_config: out of memory"); ++ if (option->val == NULL) { ++ free(p_dupe); ++ free(serv); ++ } ++ return -1; ++ } ++ free(p_dupe); ++ ++ serv->deadtime_ends[serv->max] = -1; ++ serv->max++; ++ ++ if (option->val == NULL) ++ option->val = (void *)serv; ++ ++ return 0; ++} ++ ++static int set_option_auo(char const *filename, int line, OPTION *option, char const *p) ++{ ++ int *iptr; ++ char *p_dupe = NULL; ++ char *p_pointer = NULL; ++ char *p_save = NULL; ++ ++ p_dupe = strdup(p); ++ ++ if (p_dupe == NULL) { ++ rc_log(LOG_WARNING, "%s: line %d: bogus option value", filename, line); ++ return -1; ++ } ++ ++ if ((iptr = malloc(sizeof(iptr))) == NULL) { ++ rc_log(LOG_CRIT, "read_config: out of memory"); ++ free(p_dupe); ++ return -1; ++ } ++ ++ *iptr = 0; ++ /*if(strstr(p_dupe,", \t") != NULL) {*/ ++ p_pointer = strtok_r(p_dupe, ", \t", &p_save); ++ /*}*/ ++ ++ if (!strncmp(p_pointer, "local", 5)) ++ *iptr = AUTH_LOCAL_FST; ++ else if (!strncmp(p_pointer, "radius", 6)) ++ *iptr = AUTH_RADIUS_FST; ++ else { ++ rc_log(LOG_ERR,"%s: auth_order: unknown keyword: %s", filename, p); ++ free(iptr); ++ free(p_dupe); ++ return -1; ++ } ++ ++ p_pointer = strtok_r(NULL, ", \t", &p_save); ++ ++ if (p_pointer && (*p_pointer != '\0')) { ++ if ((*iptr & AUTH_RADIUS_FST) && !strcmp(p_pointer, "local")) ++ *iptr = (*iptr) | AUTH_LOCAL_SND; ++ else if ((*iptr & AUTH_LOCAL_FST) && !strcmp(p_pointer, "radius")) ++ *iptr = (*iptr) | AUTH_RADIUS_SND; ++ else { ++ rc_log(LOG_ERR,"%s: auth_order: unknown or unexpected keyword: %s", filename, p); ++ free(iptr); ++ free(p_dupe); ++ return -1; ++ } ++ } ++ ++ option->val = (void *) iptr; ++ ++ free(p_dupe); ++ return 0; ++} ++ ++ ++/* Function: rc_add_config ++ * ++ * Purpose: allow a config option to be added to rc_handle from inside a program ++ * ++ * Returns: 0 on success, -1 on failure ++ */ ++ ++int rc_add_config(rc_handle *rh, char const *option_name, char const *option_val, char const *source, int line) ++{ ++ OPTION *option; ++ ++ if ((option = find_option(rh, option_name, OT_ANY)) == NULL) ++ { ++ rc_log(LOG_ERR, "ERROR: unrecognized option: %s", option_name); ++ return -1; ++ } ++ ++ if (option->status != ST_UNDEF) ++ { ++ rc_log(LOG_ERR, "ERROR: duplicate option: %s", option_name); ++ return -1; ++ } ++ ++ switch (option->type) { ++ case OT_STR: ++ if (set_option_str(source, line, option, option_val) < 0) { ++ return -1; ++ } ++ break; ++ case OT_INT: ++ if (set_option_int(source, line, option, option_val) < 0) { ++ return -1; ++ } ++ break; ++ case OT_SRV: ++ if (set_option_srv(source, line, option, option_val) < 0) { ++ return -1; ++ } ++ break; ++ case OT_AUO: ++ if (set_option_auo(source, line, option, option_val) < 0) { ++ return -1; ++ } ++ break; ++ default: ++ rc_log(LOG_CRIT, "rc_add_config: impossible case branch!"); ++ abort(); ++ } ++ return 0; ++} ++ ++/* ++ * Function: rc_config_init ++ * ++ * Purpose: initialize the configuration structure from an external program. For use when not ++ * running a standalone client that reads from a config file. ++ * ++ * Returns: rc_handle on success, NULL on failure ++ */ ++ ++rc_handle * ++rc_config_init(rc_handle *rh) ++{ ++ int i; ++ SERVER *authservers; ++ SERVER *acctservers; ++ OPTION *acct; ++ OPTION *auth; ++ ++ rh->config_options = malloc(sizeof(config_options_default)); ++ if (rh->config_options == NULL) ++ { ++ rc_log(LOG_CRIT, "rc_config_init: out of memory"); ++ rc_destroy(rh); ++ return NULL; ++ } ++ memcpy(rh->config_options, &config_options_default, sizeof(config_options_default)); ++ ++ acct = find_option(rh, "acctserver", OT_ANY); ++ auth = find_option(rh, "authserver", OT_ANY); ++ authservers = malloc(sizeof(SERVER)); ++ acctservers = malloc(sizeof(SERVER)); ++ ++ if(authservers == NULL || acctservers == NULL) ++ { ++ rc_log(LOG_CRIT, "rc_config_init: error initializing server structs"); ++ rc_destroy(rh); ++ if(authservers) free(authservers); ++ if(acctservers) free(acctservers); ++ return NULL; ++ } ++ ++ ++ authservers->max = 0; ++ acctservers->max = 0; ++ ++ for(i=0; i < SERVER_MAX; i++) ++ { ++ authservers->name[i] = NULL; ++ authservers->secret[i] = NULL; ++ acctservers->name[i] = NULL; ++ acctservers->secret[i] = NULL; ++ } ++ acct->val = acctservers; ++ auth->val = authservers; ++ return rh; ++} ++ ++ ++/* ++ * Function: rc_read_config ++ * ++ * Purpose: read the global config file ++ * ++ * Returns: new rc_handle on success, NULL when failure ++ */ ++ ++rc_handle * ++rc_read_config(char const *filename) ++{ ++ FILE *configfd; ++ char buffer[512], *p; ++ OPTION *option; ++ int line; ++ size_t pos; ++ rc_handle *rh; ++ ++ srandom((unsigned int)(time(NULL)+getpid())); ++ ++ rh = rc_new(); ++ if (rh == NULL) ++ return NULL; ++ ++ rh->config_options = malloc(sizeof(config_options_default)); ++ if (rh->config_options == NULL) { ++ rc_log(LOG_CRIT, "rc_read_config: out of memory"); ++ rc_destroy(rh); ++ return NULL; ++ } ++ memcpy(rh->config_options, &config_options_default, sizeof(config_options_default)); ++ ++ if ((configfd = fopen(filename,"r")) == NULL) ++ { ++ rc_log(LOG_ERR,"rc_read_config: can't open %s: %s", filename, strerror(errno)); ++ rc_destroy(rh); ++ return NULL; ++ } ++ ++ line = 0; ++ while ((fgets(buffer, sizeof(buffer), configfd) != NULL)) ++ { ++ line++; ++ p = buffer; ++ ++ if ((*p == '\n') || (*p == '#') || (*p == '\0')) ++ continue; ++ ++ p[strlen(p)-1] = '\0'; ++ ++ ++ if ((pos = strcspn(p, "\t ")) == 0) { ++ rc_log(LOG_ERR, "%s: line %d: bogus format: %s", filename, line, p); ++ fclose(configfd); ++ rc_destroy(rh); ++ return NULL; ++ } ++ ++ p[pos] = '\0'; ++ ++ if ((option = find_option(rh, p, OT_ANY)) == NULL) { ++ rc_log(LOG_ERR, "%s: line %d: unrecognized keyword: %s", filename, line, p); ++ fclose(configfd); ++ rc_destroy(rh); ++ return NULL; ++ } ++ ++ if (option->status != ST_UNDEF) { ++ rc_log(LOG_ERR, "%s: line %d: duplicate option line: %s", filename, line, p); ++ fclose(configfd); ++ rc_destroy(rh); ++ return NULL; ++ } ++ ++ p += pos+1; ++ while (isspace(*p)) ++ p++; ++ pos = strlen(p) - 1; ++ while(pos != 0 && isspace(p[pos])) ++ pos--; ++ p[pos + 1] = '\0'; ++ ++ switch (option->type) { ++ case OT_STR: ++ if (set_option_str(filename, line, option, p) < 0) { ++ fclose(configfd); ++ rc_destroy(rh); ++ return NULL; ++ } ++ break; ++ case OT_INT: ++ if (set_option_int(filename, line, option, p) < 0) { ++ fclose(configfd); ++ rc_destroy(rh); ++ return NULL; ++ } ++ break; ++ case OT_SRV: ++ if (set_option_srv(filename, line, option, p) < 0) { ++ fclose(configfd); ++ rc_destroy(rh); ++ return NULL; ++ } ++ break; ++ case OT_AUO: ++ if (set_option_auo(filename, line, option, p) < 0) { ++ fclose(configfd); ++ rc_destroy(rh); ++ return NULL; ++ } ++ break; ++ default: ++ rc_log(LOG_CRIT, "rc_read_config: impossible case branch!"); ++ abort(); ++ } ++ } ++ fclose(configfd); ++ ++ if (test_config(rh, filename) == -1) { ++ rc_destroy(rh); ++ return NULL; ++ } ++ return rh; ++} ++ ++/* ++ * Function: rc_conf_str, rc_conf_int, rc_conf_src ++ * ++ * Purpose: get the value of a config option ++ * ++ * Returns: config option value ++ */ ++ ++char *rc_conf_str(rc_handle const *rh, char const *optname) ++{ ++ OPTION *option; ++ ++ option = find_option(rh, optname, OT_STR); ++ ++ if (option != NULL) { ++ return (char *)option->val; ++ } else { ++ rc_log(LOG_CRIT, "rc_conf_str: unkown config option requested: %s", optname); ++ abort(); ++ return NULL; ++ } ++} ++ ++int rc_conf_int(rc_handle const *rh, char const *optname) ++{ ++ OPTION *option; ++ ++ option = find_option(rh, optname, OT_INT|OT_AUO); ++ ++ if (option != NULL) { ++ if (option->val) { ++ return *((int *)option->val); ++ } else { ++ rc_log(LOG_ERR, "rc_conf_int: config option %s was not set", optname); ++ return 0; ++ } ++ } else { ++ rc_log(LOG_CRIT, "rc_conf_int: unkown config option requested: %s", optname); ++ abort(); ++ return 0; ++ } ++} ++ ++SERVER *rc_conf_srv(rc_handle const *rh, char const *optname) ++{ ++ OPTION *option; ++ ++ option = find_option(rh, optname, OT_SRV); ++ ++ if (option != NULL) { ++ return (SERVER *)option->val; ++ } else { ++ rc_log(LOG_CRIT, "rc_conf_srv: unkown config option requested: %s", optname); ++ abort(); ++ return NULL; ++ } ++} ++ ++/* ++ * Function: test_config ++ * ++ * Purpose: test the configuration the user supplied ++ * ++ * Returns: 0 on success, -1 when failure ++ */ ++ ++int test_config(rc_handle const *rh, char const *filename) ++{ ++#if 0 ++ struct stat st; ++ char *file; ++#endif ++ ++ if (!(rc_conf_srv(rh, "authserver")->max)) ++ { ++ rc_log(LOG_ERR,"%s: no authserver specified", filename); ++ return -1; ++ } ++ if (!(rc_conf_srv(rh, "acctserver")->max)) ++ { ++ rc_log(LOG_ERR,"%s: no acctserver specified", filename); ++ return -1; ++ } ++ if (!rc_conf_str(rh, "servers")) ++ { ++ rc_log(LOG_ERR,"%s: no servers file specified", filename); ++ return -1; ++ } ++ if (!rc_conf_str(rh, "dictionary")) ++ { ++ rc_log(LOG_ERR,"%s: no dictionary specified", filename); ++ return -1; ++ } ++ ++ if (rc_conf_int(rh, "radius_timeout") <= 0) ++ { ++ rc_log(LOG_ERR,"%s: radius_timeout <= 0 is illegal", filename); ++ return -1; ++ } ++ if (rc_conf_int(rh, "radius_retries") <= 0) ++ { ++ rc_log(LOG_ERR,"%s: radius_retries <= 0 is illegal", filename); ++ return -1; ++ } ++ if (rc_conf_int(rh, "radius_deadtime") < 0) ++ { ++ rc_log(LOG_ERR,"%s: radius_deadtime is illegal", filename); ++ return -1; ++ } ++#if 0 ++ file = rc_conf_str(rh, "login_local"); ++ if (stat(file, &st) == 0) ++ { ++ if (!S_ISREG(st.st_mode)) { ++ rc_log(LOG_ERR,"%s: not a regular file: %s", filename, file); ++ return -1; ++ } ++ } else { ++ rc_log(LOG_ERR,"%s: file not found: %s", filename, file); ++ return -1; ++ } ++ file = rc_conf_str(rh, "login_radius"); ++ if (stat(file, &st) == 0) ++ { ++ if (!S_ISREG(st.st_mode)) { ++ rc_log(LOG_ERR,"%s: not a regular file: %s", filename, file); ++ return -1; ++ } ++ } else { ++ rc_log(LOG_ERR,"%s: file not found: %s", filename, file); ++ return -1; ++ } ++#endif ++ ++ if (rc_conf_int(rh, "login_tries") <= 0) ++ { ++ rc_log(LOG_ERR,"%s: login_tries <= 0 is illegal", filename); ++ return -1; ++ } ++ if (rc_conf_str(rh, "seqfile") == NULL) ++ { ++ rc_log(LOG_ERR,"%s: seqfile not specified", filename); ++ return -1; ++ } ++ if (rc_conf_int(rh, "login_timeout") <= 0) ++ { ++ rc_log(LOG_ERR,"%s: login_timeout <= 0 is illegal", filename); ++ return -1; ++ } ++ if (rc_conf_str(rh, "mapfile") == NULL) ++ { ++ rc_log(LOG_ERR,"%s: mapfile not specified", filename); ++ return -1; ++ } ++ if (rc_conf_str(rh, "nologin") == NULL) ++ { ++ rc_log(LOG_ERR,"%s: nologin not specified", filename); ++ return -1; ++ } ++ ++ return 0; ++} ++ ++/* ++ * Function: rc_find_match ++ * ++ * Purpose: see if ip_addr is one of the ip addresses of hostname ++ * ++ * Returns: 0 on success, -1 when failure ++ * ++ */ ++ ++static int find_match (uint32_t *ip_addr, char const *hostname) ++{ ++ ++ uint32_t addr; ++ char **paddr; ++ struct hostent *hp; ++ ++ if (rc_good_ipaddr (hostname) == 0) ++ { ++ if (*ip_addr == ntohl(inet_addr (hostname))) ++ { ++ return 0; ++ } ++ return -1; ++ } ++ ++ if ((hp = rc_gethostbyname(hostname)) == NULL) ++ { ++ return -1; ++ } ++ ++ for (paddr = hp->h_addr_list; *paddr; paddr++) ++ { ++ addr = ** (uint32_t **) paddr; ++ if (ntohl(addr) == *ip_addr) ++ { ++ return 0; ++ } ++ } ++ return -1; ++} ++ ++/* ++ * Function: rc_ipaddr_local ++ * ++ * Purpose: checks if provided address is local address ++ * ++ * Returns: 0 if local, 1 if not local, -1 on failure ++ * ++ */ ++ ++static int ++rc_ipaddr_local(uint32_t ip_addr) ++{ ++ int temp_sock, res, serrno; ++ struct sockaddr_in sin; ++ ++ temp_sock = socket(AF_INET, SOCK_DGRAM, 0); ++ if (temp_sock == -1) ++ return -1; ++ memset(&sin, '\0', sizeof(sin)); ++ sin.sin_family = AF_INET; ++ sin.sin_addr.s_addr = htonl(ip_addr); ++ sin.sin_port = htons(0); ++ res = bind(temp_sock, (struct sockaddr *)&sin, sizeof(sin)); ++ serrno = errno; ++ close(temp_sock); ++ if (res == 0) ++ return 0; ++ if (serrno == EADDRNOTAVAIL) ++ return 1; ++ return -1; ++} ++ ++/* ++ * Function: rc_is_myname ++ * ++ * Purpose: check if provided name refers to ourselves ++ * ++ * Returns: 0 if yes, 1 if no and -1 on failure ++ * ++ */ ++ ++static int ++rc_is_myname(char const *hostname) ++{ ++ uint32_t addr; ++ char **paddr; ++ struct hostent *hp; ++ int res; ++ ++ if (rc_good_ipaddr(hostname) == 0) ++ return rc_ipaddr_local(ntohl(inet_addr(hostname))); ++ ++ if ((hp = rc_gethostbyname(hostname)) == NULL) ++ return -1; ++ for (paddr = hp->h_addr_list; *paddr; paddr++) { ++ addr = **(uint32_t **)paddr; ++ res = rc_ipaddr_local(ntohl(addr)); ++ if (res == 0 || res == -1) ++ return res; ++ } ++ return 1; ++} ++ ++/* ++ * Function: rc_find_server ++ * ++ * Purpose: locate a server in the rh config or if not found, check for a servers file ++ * ++ * Returns: 0 on success, -1 on failure ++ * ++ */ ++ ++int rc_find_server (rc_handle const *rh, char const *server_name, uint32_t *ip_addr, char *secret) ++{ ++ int i; ++ size_t len; ++ int result = 0; ++ FILE *clientfd; ++ char *h; ++ char *s; ++ char buffer[128]; ++ char hostnm[AUTH_ID_LEN + 1]; ++ char *buffer_save; ++ char *hostnm_save; ++ SERVER *authservers; ++ SERVER *acctservers; ++ ++ /* Lookup the IP address of the radius server */ ++ if ((*ip_addr = rc_get_ipaddr (server_name)) == (uint32_t) 0) ++ return -1; ++ ++ /* Check to see if the server secret is defined in the rh config */ ++ if( (authservers = rc_conf_srv(rh, "authserver")) != NULL ) ++ { ++ for( i = 0; i < authservers->max; i++ ) ++ { ++ if( (strncmp(server_name, authservers->name[i], strlen(server_name)) == 0) && ++ (authservers->secret[i] != NULL) ) ++ { ++ memset (secret, '\0', MAX_SECRET_LENGTH); ++ len = strlen (authservers->secret[i]); ++ if (len > MAX_SECRET_LENGTH) ++ { ++ len = MAX_SECRET_LENGTH; ++ } ++ strncpy (secret, authservers->secret[i], (size_t) len); ++ secret[MAX_SECRET_LENGTH] = '\0'; ++ return 0; ++ } ++ } ++ } ++ ++ if( (acctservers = rc_conf_srv(rh, "acctserver")) != NULL ) ++ { ++ for( i = 0; i < acctservers->max; i++ ) ++ { ++ if( (strncmp(server_name, acctservers->name[i], strlen(server_name)) == 0) && ++ (acctservers->secret[i] != NULL) ) ++ { ++ memset (secret, '\0', MAX_SECRET_LENGTH); ++ len = strlen (acctservers->secret[i]); ++ if (len > MAX_SECRET_LENGTH) ++ { ++ len = MAX_SECRET_LENGTH; ++ } ++ strncpy (secret, acctservers->secret[i], (size_t) len); ++ secret[MAX_SECRET_LENGTH] = '\0'; ++ return 0; ++ } ++ } ++ } ++ ++ /* We didn't find it in the rh_config or the servername is too long so look for a ++ * servers file to define the secret(s) ++ */ ++ ++ if ((clientfd = fopen (rc_conf_str(rh, "servers"), "r")) == NULL) ++ { ++ rc_log(LOG_ERR, "rc_find_server: couldn't open file: %s: %s", strerror(errno), rc_conf_str(rh, "servers")); ++ return -1; ++ } ++ ++ while (fgets (buffer, sizeof (buffer), clientfd) != NULL) ++ { ++ if (*buffer == '#') ++ continue; ++ ++ if ((h = strtok_r(buffer, " \t\n", &buffer_save)) == NULL) /* first hostname */ ++ continue; ++ ++ memset (hostnm, '\0', AUTH_ID_LEN); ++ len = strlen (h); ++ if (len > AUTH_ID_LEN) ++ { ++ len = AUTH_ID_LEN; ++ } ++ strncpy (hostnm, h, (size_t) len); ++ hostnm[AUTH_ID_LEN] = '\0'; ++ ++ if ((s = strtok_r (NULL, " \t\n", &buffer_save)) == NULL) /* and secret field */ ++ continue; ++ ++ memset (secret, '\0', MAX_SECRET_LENGTH); ++ len = strlen (s); ++ if (len > MAX_SECRET_LENGTH) ++ { ++ len = MAX_SECRET_LENGTH; ++ } ++ strncpy (secret, s, (size_t) len); ++ secret[MAX_SECRET_LENGTH] = '\0'; ++ ++ if (!strchr (hostnm, '/')) /* If single name form */ ++ { ++ if (find_match (ip_addr, hostnm) == 0) ++ { ++ result++; ++ break; ++ } ++ } ++ else /* <name1>/<name2> "paired" form */ ++ { ++ strtok_r(hostnm, "/", &hostnm_save); ++ if (rc_is_myname(hostnm) == 0) ++ { /* If we're the 1st name, target is 2nd */ ++ if (find_match (ip_addr, hostnm_save) == 0) ++ { ++ result++; ++ break; ++ } ++ } ++ else /* If we were 2nd name, target is 1st name */ ++ { ++ if (find_match (ip_addr, hostnm) == 0) ++ { ++ result++; ++ break; ++ } ++ } ++ } ++ } ++ fclose (clientfd); ++ if (result == 0) ++ { ++ memset (buffer, '\0', sizeof (buffer)); ++ memset (secret, '\0', MAX_SECRET_LENGTH); ++ rc_log(LOG_ERR, "rc_find_server: couldn't find RADIUS server %s in %s", ++ server_name, rc_conf_str(rh, "servers")); ++ return -1; ++ } ++ return 0; ++} ++ ++/* ++ * Function: rc_config_free ++ * ++ * Purpose: Free allocated config values ++ * ++ * Arguments: Radius Client handle ++ */ ++ ++void ++rc_config_free(rc_handle *rh) ++{ ++ int i, j; ++ SERVER *serv; ++ ++ if (rh->config_options == NULL) ++ return; ++ ++ for (i = 0; i < NUM_OPTIONS; i++) { ++ if (rh->config_options[i].val == NULL) ++ continue; ++ if (rh->config_options[i].type == OT_SRV) { ++ serv = (SERVER *)rh->config_options[i].val; ++ for (j = 0; j < serv->max; j++){ ++ free(serv->name[j]); ++ if(serv->secret[j]) free(serv->secret[j]); ++ } ++ free(serv); ++ } else { ++ free(rh->config_options[i].val); ++ } ++ } ++ free(rh->config_options); ++ rh->config_options = NULL; ++} +diff --git a/src/plugins/vbng/lib/dict.c b/src/plugins/vbng/lib/dict.c +new file mode 100644 +index 00000000..84dbba0e +--- /dev/null ++++ b/src/plugins/vbng/lib/dict.c +@@ -0,0 +1,519 @@ ++/* ++ * $Id: dict.c,v 1.10 2007/07/11 17:29:29 cparker Exp $ ++ * ++ * Copyright (C) 1995,1996,1997 Lars Fenneberg ++ * ++ * Copyright 1992 Livingston Enterprises, Inc. ++ * ++ * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan ++ * and Merit Network, Inc. All Rights Reserved ++ * ++ * See the file COPYRIGHT for the respective terms and conditions. ++ * If the file is missing contact me at lf@elemental.net ++ * and I'll send you a copy. ++ * ++ */ ++ ++#include <config.h> ++#include <includes.h> ++#include <freeradius-client.h> ++ ++/* ++ * Function: rc_read_dictionary ++ * ++ * Purpose: Initialize the dictionary. Read all ATTRIBUTES into ++ * the dictionary_attributes list. Read all VALUES into ++ * the dictionary_values list. ++ * ++ */ ++ ++int rc_read_dictionary (rc_handle *rh, char const *filename) ++{ ++ FILE *dictfd; ++ char dummystr[AUTH_ID_LEN]; ++ char namestr[AUTH_ID_LEN]; ++ char valstr[AUTH_ID_LEN]; ++ char attrstr[AUTH_ID_LEN]; ++ char typestr[AUTH_ID_LEN]; ++ char optstr[AUTH_ID_LEN]; ++ char *cp, *ifilename; ++ int line_no; ++ DICT_ATTR *attr; ++ DICT_VALUE *dval; ++ DICT_VENDOR *dvend; ++ char buffer[256]; ++ int value; ++ int type; ++ unsigned attr_vendorspec = 0; ++ ++ if ((dictfd = fopen (filename, "r")) == NULL) ++ { ++ rc_log(LOG_ERR, "rc_read_dictionary: couldn't open dictionary %s: %s", ++ filename, strerror(errno)); ++ return -1; ++ } ++ ++ line_no = 0; ++ while (fgets (buffer, sizeof (buffer), dictfd) != NULL) ++ { ++ line_no++; ++ ++ /* Skip empty space */ ++ if (*buffer == '#' || *buffer == '\0' || *buffer == '\n' || \ ++ *buffer == '\r') ++ { ++ continue; ++ } ++ ++ /* Strip out comments */ ++ cp = strchr(buffer, '#'); ++ if (cp != NULL) ++ { ++ *cp = '\0'; ++ } ++ ++ if (strncmp (buffer, "ATTRIBUTE", 9) == 0) ++ { ++ optstr[0] = '\0'; ++ /* Read the ATTRIBUTE line */ ++ if (sscanf (buffer, "%63s%63s%63s%63s%63s", dummystr, namestr, ++ valstr, typestr, optstr) < 4) ++ { ++ rc_log(LOG_ERR, "rc_read_dictionary: invalid attribute on line %d of dictionary %s", ++ line_no, filename); ++ fclose(dictfd); ++ return -1; ++ } ++ ++ /* ++ * Validate all entries ++ */ ++ if (strlen (namestr) > NAME_LENGTH) ++ { ++ rc_log(LOG_ERR, "rc_read_dictionary: invalid name length on line %d of dictionary %s", ++ line_no, filename); ++ fclose(dictfd); ++ return -1; ++ } ++ ++ if (!isdigit (*valstr)) ++ { ++ rc_log(LOG_ERR, ++ "rc_read_dictionary: invalid value on line %d of dictionary %s", ++ line_no, filename); ++ fclose(dictfd); ++ return -1; ++ } ++ value = atoi (valstr); ++ ++ if (strcmp (typestr, "string") == 0) ++ { ++ type = PW_TYPE_STRING; ++ } ++ else if (strcmp (typestr, "integer") == 0) ++ { ++ type = PW_TYPE_INTEGER; ++ } ++ else if (strcmp (typestr, "ipaddr") == 0) ++ { ++ type = PW_TYPE_IPADDR; ++ } ++ else if (strcmp (typestr, "ipv6addr") == 0) ++ { ++ type = PW_TYPE_IPV6ADDR; ++ } ++ else if (strcmp (typestr, "ipv6prefix") == 0) ++ { ++ type = PW_TYPE_IPV6PREFIX; ++ } ++ else if (strcmp (typestr, "date") == 0) ++ { ++ type = PW_TYPE_DATE; ++ } ++ else ++ { ++ rc_log(LOG_ERR, ++ "rc_read_dictionary: invalid type on line %d of dictionary %s", ++ line_no, filename); ++ fclose(dictfd); ++ return -1; ++ } ++ ++ dvend = NULL; ++ if (optstr[0] != '\0') { ++ char *cp1; ++ for (cp1 = optstr; cp1 != NULL; cp1 = cp) { ++ cp = strchr(cp1, ','); ++ if (cp != NULL) { ++ *cp = '\0'; ++ cp++; ++ } ++ if (strncmp(cp1, "vendor=", 7) == 0) ++ cp1 += 7; ++ dvend = rc_dict_findvend(rh, cp1); ++ if (dvend == NULL) { ++ rc_log(LOG_ERR, ++ "rc_read_dictionary: unknown Vendor-Id %s on line %d of dictionary %s", ++ cp1, line_no, filename); ++ fclose(dictfd); ++ return -1; ++ } ++ } ++ } ++ ++ /* Create a new attribute for the list */ ++ if ((attr = malloc (sizeof (DICT_ATTR))) == NULL) ++ { ++ rc_log(LOG_CRIT, "rc_read_dictionary: out of memory"); ++ fclose(dictfd); ++ return -1; ++ } ++ strcpy (attr->name, namestr); ++ attr->value = value | (attr_vendorspec << 16); ++ attr->type = type; ++ ++ if (dvend != NULL) { ++ attr->value = value | (dvend->vendorpec << 16); ++ } else { ++ attr->value = value | (attr_vendorspec << 16); ++ } ++ ++ /* Insert it into the list */ ++ attr->next = rh->dictionary_attributes; ++ rh->dictionary_attributes = attr; ++ } ++ else if (strncmp (buffer, "VALUE", 5) == 0) ++ { ++ /* Read the VALUE line */ ++ if (sscanf (buffer, "%63s%63s%63s%63s", dummystr, attrstr, ++ namestr, valstr) != 4) ++ { ++ rc_log(LOG_ERR, ++ "rc_read_dictionary: invalid value entry on line %d of dictionary %s", ++ line_no, filename); ++ fclose(dictfd); ++ return -1; ++ } ++ ++ /* ++ * Validate all entries ++ */ ++ if (strlen (attrstr) > NAME_LENGTH) ++ { ++ rc_log(LOG_ERR, ++ "rc_read_dictionary: invalid attribute length on line %d of dictionary %s", ++ line_no, filename); ++ fclose(dictfd); ++ return -1; ++ } ++ ++ if (strlen (namestr) > NAME_LENGTH) ++ { ++ rc_log(LOG_ERR, ++ "rc_read_dictionary: invalid name length on line %d of dictionary %s", ++ line_no, filename); ++ fclose(dictfd); ++ return -1; ++ } ++ ++ if (!isdigit (*valstr)) ++ { ++ rc_log(LOG_ERR, ++ "rc_read_dictionary: invalid value on line %d of dictionary %s", ++ line_no, filename); ++ fclose(dictfd); ++ return -1; ++ } ++ value = atoi (valstr); ++ ++ /* Create a new VALUE entry for the list */ ++ if ((dval = malloc (sizeof (DICT_VALUE))) == NULL) ++ { ++ rc_log(LOG_CRIT, "rc_read_dictionary: out of memory"); ++ fclose(dictfd); ++ return -1; ++ } ++ strcpy (dval->attrname, attrstr); ++ strcpy (dval->name, namestr); ++ dval->value = value; ++ ++ /* Insert it into the list */ ++ dval->next = rh->dictionary_values; ++ rh->dictionary_values = dval; ++ } ++ else if (strncmp (buffer, "$INCLUDE", 8) == 0) ++ { ++ /* Read the $INCLUDE line */ ++ if (sscanf (buffer, "%63s%63s", dummystr, namestr) != 2) ++ { ++ rc_log(LOG_ERR, ++ "rc_read_dictionary: invalid include entry on line %d of dictionary %s", ++ line_no, filename); ++ fclose(dictfd); ++ return -1; ++ } ++ ifilename = namestr; ++ /* Append directory if necessary */ ++ if (namestr[0] != '/') { ++ cp = strrchr(filename, '/'); ++ if (cp != NULL) { ++ ifilename = alloca(AUTH_ID_LEN); ++ *cp = '\0'; ++ snprintf(ifilename, AUTH_ID_LEN, "%s/%s", filename, namestr); ++ *cp = '/'; ++ } ++ } ++ if (rc_read_dictionary(rh, ifilename) < 0) ++ { ++ fclose(dictfd); ++ return -1; ++ } ++ } ++ else if (strncmp (buffer, "END-VENDOR", 10) == 0) ++ { ++ attr_vendorspec = 0; ++ } ++ else if (strncmp (buffer, "BEGIN-VENDOR", 12) == 0) ++ { ++ DICT_VENDOR *v; ++ /* Read the vendor name */ ++ if (sscanf (buffer+12, "%63s", dummystr) != 1) ++ { ++ rc_log(LOG_ERR, ++ "rc_read_dictionary: invalid Vendor-Id on line %d of dictionary %s", ++ line_no, filename); ++ fclose(dictfd); ++ return -1; ++ } ++ ++ v = rc_dict_findvend(rh, dummystr); ++ if (v == NULL) { ++ rc_log(LOG_ERR, ++ "rc_read_dictionary: unknown Vendor %s on line %d of dictionary %s", ++ dummystr, line_no, filename); ++ fclose(dictfd); ++ return -1; ++ } ++ ++ attr_vendorspec = v->vendorpec; ++ } ++ else if (strncmp (buffer, "VENDOR", 6) == 0) ++ { ++ /* Read the VALUE line */ ++ if (sscanf (buffer, "%63s%63s%63s", dummystr, attrstr, valstr) != 3) ++ { ++ rc_log(LOG_ERR, ++ "rc_read_dictionary: invalid Vendor-Id on line %d of dictionary %s", ++ line_no, filename); ++ fclose(dictfd); ++ return -1; ++ } ++ ++ /* Validate all entries */ ++ if (strlen (attrstr) > NAME_LENGTH) ++ { ++ rc_log(LOG_ERR, ++ "rc_read_dictionary: invalid attribute length on line %d of dictionary %s", ++ line_no, filename); ++ fclose(dictfd); ++ return -1; ++ } ++ ++ if (!isdigit (*valstr)) ++ { ++ rc_log(LOG_ERR, ++ "rc_read_dictionary: invalid Vendor-Id on line %d of dictionary %s", ++ line_no, filename); ++ fclose(dictfd); ++ return -1; ++ } ++ value = atoi (valstr); ++ ++ /* Create a new VENDOR entry for the list */ ++ dvend = malloc(sizeof(DICT_VENDOR)); ++ if (dvend == NULL) ++ { ++ rc_log(LOG_CRIT, "rc_read_dictionary: out of memory"); ++ fclose(dictfd); ++ return -1; ++ } ++ strcpy (dvend->vendorname, attrstr); ++ dvend->vendorpec = value; ++ ++ /* Insert it into the list */ ++ dvend->next = rh->dictionary_vendors; ++ rh->dictionary_vendors = dvend; ++ } ++ } ++ fclose (dictfd); ++ return 0; ++} ++ ++/* ++ * Function: rc_dict_getattr ++ * ++ * Purpose: Return the full attribute structure based on the ++ * attribute id number. ++ * ++ */ ++ ++DICT_ATTR *rc_dict_getattr (rc_handle const *rh, int attribute) ++{ ++ DICT_ATTR *attr; ++ ++ attr = rh->dictionary_attributes; ++ while (attr != NULL) ++ { ++ if (attr->value == attribute) ++ { ++ return attr; ++ } ++ attr = attr->next; ++ } ++ return NULL; ++} ++ ++/* ++ * Function: rc_dict_findattr ++ * ++ * Purpose: Return the full attribute structure based on the ++ * attribute name. ++ * ++ */ ++ ++DICT_ATTR *rc_dict_findattr (rc_handle const *rh, char const *attrname) ++{ ++ DICT_ATTR *attr; ++ ++ attr = rh->dictionary_attributes; ++ while (attr != NULL) ++ { ++ if (strcasecmp (attr->name, attrname) == 0) ++ { ++ return attr; ++ } ++ attr = attr->next; ++ } ++ return NULL; ++} ++ ++ ++/* ++ * Function: rc_dict_findval ++ * ++ * Purpose: Return the full value structure based on the ++ * value name. ++ * ++ */ ++ ++DICT_VALUE *rc_dict_findval (rc_handle const *rh, char const *valname) ++{ ++ DICT_VALUE *val; ++ ++ val = rh->dictionary_values; ++ while (val != NULL) ++ { ++ if (strcasecmp (val->name, valname) == 0) ++ { ++ return val; ++ } ++ val = val->next; ++ } ++ return NULL; ++} ++ ++/* ++ * Function: rc_dict_findvend ++ * ++ * Purpose: Return the full vendor structure based on the ++ * vendor name. ++ * ++ */ ++ ++DICT_VENDOR * ++rc_dict_findvend(rc_handle const *rh, char const *vendorname) ++{ ++ DICT_VENDOR *vend; ++ ++ for (vend = rh->dictionary_vendors; vend != NULL; vend = vend->next) ++ if (strcasecmp(vend->vendorname, vendorname) == 0) ++ return vend; ++ return NULL; ++} ++ ++/* ++ * Function: rc_dict_getvend ++ * ++ * Purpose: Return the full vendor structure based on the ++ * vendor id number. ++ * ++ */ ++ ++DICT_VENDOR * ++rc_dict_getvend (rc_handle const *rh, int vendorpec) ++{ ++ DICT_VENDOR *vend; ++ ++ for (vend = rh->dictionary_vendors; vend != NULL; vend = vend->next) ++ if (vend->vendorpec == vendorpec) ++ return vend; ++ return NULL; ++} ++ ++/* ++ * Function: dict_getval ++ * ++ * Purpose: Return the full value structure based on the ++ * actual value and the associated attribute name. ++ * ++ */ ++ ++DICT_VALUE * ++rc_dict_getval (rc_handle const *rh, uint32_t value, char const *attrname) ++{ ++ DICT_VALUE *val; ++ ++ val = rh->dictionary_values; ++ while (val != NULL) ++ { ++ if (strcmp (val->attrname, attrname) == 0 && ++ val->value == value) ++ { ++ return val; ++ } ++ val = val->next; ++ } ++ return NULL; ++} ++ ++/* ++ * Function: rc_dict_free ++ * ++ * Purpose: Free allocated av lists ++ * ++ * Arguments: Radius Client handle ++ */ ++ ++void ++rc_dict_free(rc_handle *rh) ++{ ++ DICT_ATTR *attr, *nattr; ++ DICT_VALUE *val, *nval; ++ DICT_VENDOR *vend, *nvend; ++ ++ for (attr = rh->dictionary_attributes; attr != NULL; attr = nattr) { ++ nattr = attr->next; ++ free(attr); ++ } ++ for (val = rh->dictionary_values; val != NULL; val = nval) { ++ nval = val->next; ++ free(val); ++ } ++ for (vend = rh->dictionary_vendors; vend != NULL; vend = nvend) { ++ nvend = vend->next; ++ free(vend); ++ } ++ rh->dictionary_attributes = NULL; ++ rh->dictionary_values = NULL; ++ rh->dictionary_vendors = NULL; ++} +diff --git a/src/plugins/vbng/lib/env.c b/src/plugins/vbng/lib/env.c +new file mode 100644 +index 00000000..03dccf91 +--- /dev/null ++++ b/src/plugins/vbng/lib/env.c +@@ -0,0 +1,147 @@ ++/* ++ * $Id: env.c,v 1.6 2007/06/21 18:07:23 cparker Exp $ ++ * ++ * Copyright (C) 1995,1996,1997 Lars Fenneberg ++ * ++ * See the file COPYRIGHT for the respective terms and conditions. ++ * If the file is missing contact me at lf@elemental.net ++ * and I'll send you a copy. ++ * ++ */ ++ ++#include <config.h> ++#include <includes.h> ++#include <freeradius-client.h> ++ ++/* ++ * Function: rc_new_env ++ * ++ * Purpose: allocate space for a new environment ++ * ++ */ ++ ++ENV *rc_new_env(int size) ++{ ++ ENV *p; ++ ++ if (size < 1) ++ return NULL; ++ ++ if ((p = malloc(sizeof(*p))) == NULL) ++ return NULL; ++ ++ if ((p->env = malloc(size * sizeof(char *))) == NULL) ++ { ++ rc_log(LOG_CRIT, "rc_new_env: out of memory"); ++ free(p); ++ return NULL; ++ } ++ ++ p->env[0] = NULL; ++ ++ p->size = 0; ++ p->maxsize = size; ++ ++ return p; ++} ++ ++/* ++ * Function: rc_free_env ++ * ++ * Purpose: free the space used by an env structure ++ * ++ */ ++ ++void rc_free_env(ENV *env) ++{ ++ free(env->env); ++ free(env); ++} ++ ++/* ++ * Function: rc_add_env ++ * ++ * Purpose: add an environment entry ++ * ++ */ ++ ++int rc_add_env(ENV *env, char const *name, char const *value) ++{ ++ int i; ++ size_t len; ++ char *new_env; ++ ++ for (i = 0; env->env[i] != NULL; i++) ++ { ++ if (strncmp(env->env[i], name, MAX(strchr(env->env[i], '=') - env->env[i], (int)strlen(name))) == 0) ++ break; ++ } ++ ++ if (env->env[i]) ++ { ++ len = strlen(name)+strlen(value)+2; ++ if ((new_env = realloc(env->env[i], len)) == NULL) ++ return -1; ++ ++ env->env[i] = new_env; ++ ++ snprintf(env->env[i], len, "%s=%s", name, value); ++ } else { ++ if (env->size == (env->maxsize-1)) { ++ rc_log(LOG_CRIT, "rc_add_env: not enough space for environment (increase ENV_SIZE)"); ++ return -1; ++ } ++ ++ len = strlen(name)+strlen(value)+2; ++ if ((env->env[env->size] = malloc(len)) == NULL) { ++ rc_log(LOG_CRIT, "rc_add_env: out of memory"); ++ return -1; ++ } ++ ++ snprintf(env->env[env->size], len, "%s=%s", name, value); ++ ++ env->size++; ++ ++ env->env[env->size] = NULL; ++ } ++ ++ return 0; ++} ++ ++/* ++ * Function: rc_import_env ++ * ++ * Purpose: imports an array of null-terminated strings ++ * ++ */ ++ ++int rc_import_env(ENV *env, char const **import) ++{ ++ char *es; ++ ++ while (*import) ++ { ++ es = strchr(*import, '='); ++ ++ if (!es) ++ { ++ import++; ++ continue; ++ } ++ ++ /* ok, i grant thats not very clean... */ ++ *es = '\0'; ++ ++ if (rc_add_env(env, *import, es+1) < 0) ++ { ++ *es = '='; ++ return -1; ++ } ++ ++ *es = '='; ++ ++ import++; ++ } ++ ++ return 0; ++} +diff --git a/src/plugins/vbng/lib/ip_util.c b/src/plugins/vbng/lib/ip_util.c +new file mode 100644 +index 00000000..d686a59e +--- /dev/null ++++ b/src/plugins/vbng/lib/ip_util.c +@@ -0,0 +1,390 @@ ++/* ++ * $Id: ip_util.c,v 1.14 2010/03/17 18:57:01 aland Exp $ ++ * ++ * Copyright (C) 1995,1996,1997 Lars Fenneberg ++ * ++ * Copyright 1992 Livingston Enterprises, Inc. ++ * ++ * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan ++ * and Merit Network, Inc. All Rights Reserved ++ * ++ * See the file COPYRIGHT for the respective terms and conditions. ++ * If the file is missing contact me at lf@elemental.net ++ * and I'll send you a copy. ++ * ++ */ ++ ++#include <config.h> ++#include <includes.h> ++#include <freeradius-client.h> ++ ++#define HOSTBUF_SIZE 1024 ++ ++#if !defined(SA_LEN) ++#define SA_LEN(sa) \ ++ (((sa)->sa_family == AF_INET) ? \ ++ sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6)) ++#endif ++ ++ ++static __thread size_t hostbuflen=HOSTBUF_SIZE; ++static __thread char *tmphostbuf=NULL; ++ ++/* ++ * Function: rc_gethostbyname ++ * ++ * Purpose: threadsafe replacement for gethostbyname. ++ * ++ * Returns: NULL on failure, hostent pointer on success ++ */ ++ ++struct hostent *rc_gethostbyname(char const *hostname) ++{ ++ struct hostent *hp; ++#ifdef GETHOSTBYNAME_R ++#if defined (GETHOSTBYNAMERSTYLE_SYSV) || defined (GETHOSTBYNAMERSTYLE_GNU) ++ struct hostent hostbuf; ++ int res; ++ int herr; ++ ++ if(!tmphostbuf) tmphostbuf = malloc(hostbuflen); ++#endif ++#endif ++ ++#ifdef GETHOSTBYNAME_R ++#if defined (GETHOSTBYNAMERSTYLE_GNU) ++ while ((res = gethostbyname_r(hostname, &hostbuf, tmphostbuf, hostbuflen, &hp, &herr)) == ERANGE) ++ { ++ /* Enlarge the buffer */ ++ hostbuflen *= 2; ++ tmphostbuf = realloc(tmphostbuf, hostbuflen); ++ } ++ if(res) return NULL; ++#elif defined (GETHOSTBYNAMERSTYLE_SYSV) ++ hp = gethostbyname_r(hostname, &hostbuf, tmphostbuf, hostbuflen, &herr); ++#else ++ hp = gethostbyname(hostname); ++#endif ++#else ++ hp = gethostbyname(hostname); ++#endif ++ ++ if (hp == NULL) { ++ return NULL; ++ } ++ return hp; ++} ++ ++/* ++ * Function: rc_gethostbyname ++ * ++ * Purpose: threadsafe replacement for gethostbyname. ++ * ++ * Returns: NULL on failure, hostent pointer on success ++ */ ++ ++struct hostent *rc_gethostbyaddr(char const *addr, size_t length, int format) ++{ ++ struct hostent *hp; ++#ifdef GETHOSTBYADDR_R ++#if defined (GETHOSTBYADDRRSTYLE_SYSV) || defined (GETHOSTBYADDRRSTYLE_GNU) ++ struct hostent hostbuf; ++ int res; ++ int herr; ++ ++ if(!tmphostbuf) tmphostbuf = malloc(hostbuflen); ++#endif ++#endif ++ ++#ifdef GETHOSTBYADDR_R ++#if defined (GETHOSTBYADDRRSTYLE_GNU) ++ while ((res = gethostbyaddr_r(addr, length, format, &hostbuf, tmphostbuf, hostbuflen, ++ &hp, &herr)) == ERANGE) ++ { ++ /* Enlarge the buffer */ ++ hostbuflen *= 2; ++ tmphostbuf = realloc(tmphostbuf, hostbuflen); ++ } ++ if(res) return NULL; ++#elif GETHOSTBYADDRSTYLE_SYSV ++ hp = gethostbyaddr_r(addr, length, format, &hostbuf, tmphostbuf, hostbuflen, &herr); ++#else ++ hp = gethostbyaddr((char *)&addr, sizeof(struct in_addr), AF_INET); ++#endif ++#else ++ hp = gethostbyaddr((char *)&addr, sizeof(struct in_addr), AF_INET); ++#endif ++ ++ if (hp == NULL) { ++ return NULL; ++ } ++ return hp; ++} ++ ++/* ++ * Function: rc_get_ipaddr ++ * ++ * Purpose: return an IP address in host long notation from a host ++ * name or address in dot notation. ++ * ++ * Returns: 0 on failure ++ */ ++ ++uint32_t rc_get_ipaddr (char const *host) ++{ ++ struct hostent *hp; ++ ++ if (rc_good_ipaddr (host) == 0) ++ { ++ return ntohl(inet_addr (host)); ++ } ++ else if ((hp = rc_gethostbyname(host)) == NULL) ++ { ++ rc_log(LOG_ERR,"rc_get_ipaddr: couldn't resolve hostname: %s", host); ++ return (uint32_t)0; ++ } ++ return ntohl((*(uint32_t *) hp->h_addr)); ++} ++ ++/* ++ * Function: rc_good_ipaddr ++ * ++ * Purpose: check for valid IP address in standard dot notation. ++ * ++ * Returns: 0 on success, -1 when failure ++ * ++ */ ++ ++int rc_good_ipaddr (char const *addr) ++{ ++ int dot_count; ++ int digit_count; ++ ++ if (addr == NULL) ++ return -1; ++ ++ dot_count = 0; ++ digit_count = 0; ++ while (*addr != '\0' && *addr != ' ') ++ { ++ if (*addr == '.') ++ { ++ dot_count++; ++ digit_count = 0; ++ } ++ else if (!isdigit (*addr)) ++ { ++ dot_count = 5; ++ } ++ else ++ { ++ digit_count++; ++ if (digit_count > 3) ++ { ++ dot_count = 5; ++ } ++ } ++ addr++; ++ } ++ if (dot_count != 3) ++ { ++ return -1; ++ } ++ else ++ { ++ return 0; ++ } ++} ++ ++/* ++ * Function: rc_ip_hostname ++ * ++ * Purpose: Return a printable host name (or IP address in dot notation) ++ * for the supplied IP address. ++ * ++ */ ++ ++char const *rc_ip_hostname (uint32_t h_ipaddr) ++{ ++ struct hostent *hp; ++ uint32_t n_ipaddr = htonl (h_ipaddr); ++ ++ if ((hp = rc_gethostbyaddr ((char *) &n_ipaddr, sizeof (struct in_addr), ++ AF_INET)) == NULL) { ++ rc_log(LOG_ERR,"rc_ip_hostname: couldn't look up host by addr: %08lX", h_ipaddr); ++ } ++ ++ return (hp == NULL) ? "unknown" : hp->h_name; ++} ++ ++/* ++ * Function: rc_getport ++ * ++ * Purpose: get the port number for the supplied request type ++ * ++ */ ++ ++unsigned short rc_getport(int type) ++{ ++ struct servent *svp; ++ ++ if ((svp = getservbyname ((type==AUTH)?"radius":"radacct", "udp")) == NULL) ++ { ++ return (type==AUTH) ? PW_AUTH_UDP_PORT : PW_ACCT_UDP_PORT; ++ } else { ++ return ntohs ((unsigned short) svp->s_port); ++ } ++} ++ ++/* ++ * Function: rc_own_hostname ++ * ++ * Purpose: get the hostname of this machine ++ * ++ * Returns -1 on failure, 0 on success ++ * ++ */ ++ ++int ++rc_own_hostname(char *hostname, int len) ++{ ++#ifdef HAVE_UNAME ++ struct utsname uts; ++#endif ++ ++#if defined(HAVE_UNAME) ++ if (uname(&uts) < 0) ++ { ++ rc_log(LOG_ERR,"rc_own_hostname: couldn't get own hostname"); ++ return -1; ++ } ++ strncpy(hostname, uts.nodename, len); ++#elif defined(HAVE_GETHOSTNAME) ++ if (gethostname(hostname, len) < 0) ++ { ++ rc_log(LOG_ERR,"rc_own_hostname: couldn't get own hostname"); ++ return -1; ++ } ++#elif defined(HAVE_SYSINFO) ++ if (sysinfo(SI_HOSTNAME, hostname, len) < 0) ++ { ++ rc_log(LOG_ERR,"rc_own_hostname: couldn't get own hostname"); ++ return -1; ++ } ++#else ++ return -1; ++#endif ++ ++ return 0; ++} ++ ++/* ++ * Function: rc_own_ipaddress ++ * ++ * Purpose: get the IP address of this host in host order ++ * ++ * Returns: IP address on success, 0 on failure ++ * ++ */ ++ ++uint32_t rc_own_ipaddress(rc_handle *rh) ++{ ++ char hostname[256]; ++ ++ if (!rh->this_host_ipaddr) { ++ if (rc_conf_str(rh, "bindaddr") == NULL || ++ strcmp(rc_conf_str(rh, "bindaddr"), "*") == 0) { ++ if (rc_own_hostname(hostname, sizeof(hostname)) < 0) ++ return 0; ++ } else { ++ strncpy(hostname, rc_conf_str(rh, "bindaddr"), sizeof(hostname)); ++ hostname[sizeof(hostname) - 1] = '\0'; ++ } ++ if ((rh->this_host_ipaddr = rc_get_ipaddr (hostname)) == 0) { ++ rc_log(LOG_ERR, "rc_own_ipaddress: couldn't get own IP address"); ++ return 0; ++ } ++ } ++ ++ return rh->this_host_ipaddr; ++} ++ ++/* ++ * Function: rc_own_bind_ipaddress ++ * ++ * Purpose: get the IP address to be used as a source address ++ * for sending requests in host order ++ * ++ * Returns: IP address ++ * ++ */ ++ ++uint32_t rc_own_bind_ipaddress(rc_handle *rh) ++{ ++ char hostname[256]; ++ uint32_t rval; ++ ++ if (rh->this_host_bind_ipaddr != NULL) ++ return *rh->this_host_bind_ipaddr; ++ ++ rh->this_host_bind_ipaddr = malloc(sizeof(*rh->this_host_bind_ipaddr)); ++ if (rh->this_host_bind_ipaddr == NULL) ++ rc_log(LOG_CRIT, "rc_own_bind_ipaddress: out of memory"); ++ if (rc_conf_str(rh, "bindaddr") == NULL || ++ strcmp(rc_conf_str(rh, "bindaddr"), "*") == 0) { ++ rval = INADDR_ANY; ++ } else { ++ strncpy(hostname, rc_conf_str(rh, "bindaddr"), sizeof(hostname)); ++ hostname[sizeof(hostname) - 1] = '\0'; ++ if ((rval = rc_get_ipaddr (hostname)) == 0) { ++ rc_log(LOG_ERR, "rc_own_ipaddress: couldn't get IP address from bindaddr"); ++ rval = INADDR_ANY; ++ } ++ } ++ if (rh->this_host_bind_ipaddr != NULL) ++ *rh->this_host_bind_ipaddr = rval; ++ ++ return rval; ++} ++ ++/* ++ * Function: rc_get_srcaddr ++ * ++ * Purpose: given remote address find local address which the ++ * system will use as a source address for sending ++ * datagrams to that remote address ++ * ++ * Returns: 0 in success, -1 on failure, address is filled into ++ * the first argument. ++ * ++ */ ++int ++rc_get_srcaddr(struct sockaddr *lia, struct sockaddr *ria) ++{ ++ int temp_sock; ++ socklen_t namelen; ++ ++ temp_sock = socket(ria->sa_family, SOCK_DGRAM, 0); ++ if (temp_sock == -1) { ++ rc_log(LOG_ERR, "rc_get_srcaddr: socket: %s", strerror(errno)); ++ return -1; ++ } ++ ++ if (connect(temp_sock, ria, SA_LEN(ria)) != 0) { ++ rc_log(LOG_ERR, "rc_get_srcaddr: connect: %s", ++ strerror(errno)); ++ close(temp_sock); ++ return -1; ++ } ++ ++ namelen = SA_LEN(ria); ++ if (getsockname(temp_sock, lia, &namelen) != 0) { ++ rc_log(LOG_ERR, "rc_get_srcaddr: getsockname: %s", ++ strerror(errno)); ++ close(temp_sock); ++ return -1; ++ } ++ ++ close(temp_sock); ++ return 0; ++} +diff --git a/src/plugins/vbng/lib/libfreeradiusclient.a b/src/plugins/vbng/lib/libfreeradiusclient.a +new file mode 100644 +index 0000000000000000000000000000000000000000..56c91fd880e9d435b62149ded2a0a9067cf8cbd6 +GIT binary patch +literal 367122 +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 +zZ!|xHY~Fp1$%{88XQaKI6goB(S00TJ&	VI+nMQ;@;Fm^CRi(C#c__rjCD}rq>HJ +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 +D0lJ|_ + +literal 0 +HcmV?d00001 + +diff --git a/src/plugins/vbng/lib/libfreeradiusclient.so b/src/plugins/vbng/lib/libfreeradiusclient.so +new file mode 100644 +index 0000000000000000000000000000000000000000..2603f0181c7c43542e59d2907d5bf6c4b0730916 +GIT binary patch +literal 216320 +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%0DhV@0HB5ucRTyXxDm +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 + +literal 0 +HcmV?d00001 + +diff --git a/src/plugins/vbng/lib/log.c b/src/plugins/vbng/lib/log.c +new file mode 100644 +index 00000000..09b01a2e +--- /dev/null ++++ b/src/plugins/vbng/lib/log.c +@@ -0,0 +1,57 @@ ++/* ++ * $Id: log.c,v 1.5 2007/06/21 18:07:23 cparker Exp $ ++ * ++ * Copyright (C) 1995,1996,1997 Lars Fenneberg ++ * ++ * See the file COPYRIGHT for the respective terms and conditions. ++ * If the file is missing contact me at lf@elemental.net ++ * and I'll send you a copy. ++ * ++ */ ++ ++#include <config.h> ++#include <includes.h> ++#include <freeradius-client.h> ++ ++/* ++ * Function: rc_openlog ++ * ++ * Purpose: open log ++ * ++ * Arguments: identification string ++ * ++ * Returns: nothing ++ * ++ */ ++ ++void rc_openlog(char const *ident) ++{ ++#ifndef _MSC_VER /* TODO: Fix me */ ++ openlog(ident, LOG_PID, RC_LOG_FACILITY); ++#endif ++} ++ ++/* ++ * Function: rc_log ++ * ++ * Purpose: log information ++ * ++ * Arguments: priority (just like syslog), rest like printf ++ * ++ * Returns: nothing ++ * ++ */ ++ ++void rc_log(int prio, char const *format, ...) ++{ ++ char buff[1024]; ++ va_list ap; ++ ++ va_start(ap,format); ++ vsnprintf(buff, sizeof(buff), format, ap); ++ va_end(ap); ++ ++#ifndef _MSC_VER /* TODO: Fix me */ ++ syslog(prio, "%s", buff); ++#endif ++} +diff --git a/src/plugins/vbng/lib/md5.c b/src/plugins/vbng/lib/md5.c +new file mode 100644 +index 00000000..2344fb9c +--- /dev/null ++++ b/src/plugins/vbng/lib/md5.c +@@ -0,0 +1,251 @@ ++#include "md5.h" ++ ++/* The below was retrieved from ++ * http://www.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/crypto/md5.c?rev=1.1 ++ * with the following changes: ++ * #includes commented out. ++ * Support context->count as uint32_t[2] instead of uint64_t ++ * u_int* to uint* ++ */ ++ ++/* ++ * This code implements the MD5 message-digest algorithm. ++ * The algorithm is due to Ron Rivest. This code was ++ * written by Colin Plumb in 1993, no copyright is claimed. ++ * This code is in the public domain; do with it what you wish. ++ * ++ * Equivalent code is available from RSA Data Security, Inc. ++ * This code has been tested against that, and is equivalent, ++ * except that you don't need to include two pages of legalese ++ * with every copy. ++ * ++ * To compute the message digest of a chunk of bytes, declare an ++ * MD5Context structure, pass it to MD5Init, call MD5Update as ++ * needed on buffers full of bytes, and then call MD5Final, which ++ * will fill a supplied 16-byte array with the digest. ++ */ ++ ++/*#include <sys/param.h>*/ ++/*#include <sys/systm.h>*/ ++/*#include <crypto/md5.h>*/ ++ ++#define PUT_64BIT_LE(cp, value) do { \ ++ (cp)[7] = (value)[1] >> 24; \ ++ (cp)[6] = (value)[1] >> 16; \ ++ (cp)[5] = (value)[1] >> 8; \ ++ (cp)[4] = (value)[1]; \ ++ (cp)[3] = (value)[0] >> 24; \ ++ (cp)[2] = (value)[0] >> 16; \ ++ (cp)[1] = (value)[0] >> 8; \ ++ (cp)[0] = (value)[0]; } while (0) ++ ++#define PUT_32BIT_LE(cp, value) do { \ ++ (cp)[3] = (value) >> 24; \ ++ (cp)[2] = (value) >> 16; \ ++ (cp)[1] = (value) >> 8; \ ++ (cp)[0] = (value); } while (0) ++ ++static uint8_t PADDING[MD5_BLOCK_LENGTH] = { ++ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ++}; ++ ++/* ++ * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious ++ * initialization constants. ++ */ ++void ++MD5Init(MD5_CTX *ctx) ++{ ++ ctx->count[0] = 0; ++ ctx->count[1] = 0; ++ ctx->state[0] = 0x67452301; ++ ctx->state[1] = 0xefcdab89; ++ ctx->state[2] = 0x98badcfe; ++ ctx->state[3] = 0x10325476; ++} ++ ++/* ++ * Update context to reflect the concatenation of another buffer full ++ * of bytes. ++ */ ++void ++MD5Update(MD5_CTX *ctx, uint8_t const *input, size_t len) ++{ ++ size_t have, need; ++ ++ /* Check how many bytes we already have and how many more we need. */ ++ have = (size_t)((ctx->count[0] >> 3) & (MD5_BLOCK_LENGTH - 1)); ++ need = MD5_BLOCK_LENGTH - have; ++ ++ /* Update bitcount */ ++/* ctx->count += (uint64_t)len << 3;*/ ++ if ((ctx->count[0] += ((uint32_t)len << 3)) < (uint32_t)len) { ++ /* Overflowed ctx->count[0] */ ++ ctx->count[1]++; ++ } ++ ctx->count[1] += ((uint32_t)len >> 29); ++ ++ ++ ++ if (len >= need) { ++ if (have != 0) { ++ memcpy(ctx->buffer + have, input, need); ++ MD5Transform(ctx->state, ctx->buffer); ++ input += need; ++ len -= need; ++ have = 0; ++ } ++ ++ /* Process data in MD5_BLOCK_LENGTH-byte chunks. */ ++ while (len >= MD5_BLOCK_LENGTH) { ++ MD5Transform(ctx->state, input); ++ input += MD5_BLOCK_LENGTH; ++ len -= MD5_BLOCK_LENGTH; ++ } ++ } ++ ++ /* Handle any remaining bytes of data. */ ++ if (len != 0) ++ memcpy(ctx->buffer + have, input, len); ++} ++ ++/* ++ * Final wrapup - pad to 64-byte boundary with the bit pattern ++ * 1 0* (64-bit count of bits processed, MSB-first) ++ */ ++void ++MD5Final(unsigned char digest[MD5_DIGEST_LENGTH], MD5_CTX *ctx) ++{ ++ uint8_t count[8]; ++ size_t padlen; ++ int i; ++ ++ /* Convert count to 8 bytes in little endian order. */ ++ PUT_64BIT_LE(count, ctx->count); ++ ++ /* Pad out to 56 mod 64. */ ++ padlen = MD5_BLOCK_LENGTH - ++ ((ctx->count[0] >> 3) & (MD5_BLOCK_LENGTH - 1)); ++ if (padlen < 1 + 8) ++ padlen += MD5_BLOCK_LENGTH; ++ MD5Update(ctx, PADDING, padlen - 8); /* padlen - 8 <= 64 */ ++ MD5Update(ctx, count, 8); ++ ++ if (digest != NULL) { ++ for (i = 0; i < 4; i++) ++ PUT_32BIT_LE(digest + i * 4, ctx->state[i]); ++ } ++ memset(ctx, 0, sizeof(*ctx)); /* in case it's sensitive */ ++} ++ ++ ++/* The four core functions - F1 is optimized somewhat */ ++ ++/* #define F1(x, y, z) (x & y | ~x & z) */ ++#define F1(x, y, z) (z ^ (x & (y ^ z))) ++#define F2(x, y, z) F1(z, x, y) ++#define F3(x, y, z) (x ^ y ^ z) ++#define F4(x, y, z) (y ^ (x | ~z)) ++ ++/* This is the central step in the MD5 algorithm. */ ++#define MD5STEP(f, w, x, y, z, data, s) \ ++ ( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x ) ++ ++/* ++ * The core of the MD5 algorithm, this alters an existing MD5 hash to ++ * reflect the addition of 16 longwords of new data. MD5Update blocks ++ * the data and converts bytes into longwords for this routine. ++ */ ++void ++MD5Transform(uint32_t state[4], uint8_t const block[MD5_BLOCK_LENGTH]) ++{ ++ uint32_t a, b, c, d, in[MD5_BLOCK_LENGTH / 4]; ++ ++ for (a = 0; a < MD5_BLOCK_LENGTH / 4; a++) { ++ in[a] = (uint32_t)( ++ (uint32_t)(block[a * 4 + 0]) | ++ (uint32_t)(block[a * 4 + 1]) << 8 | ++ (uint32_t)(block[a * 4 + 2]) << 16 | ++ (uint32_t)(block[a * 4 + 3]) << 24); ++ } ++ ++ a = state[0]; ++ b = state[1]; ++ c = state[2]; ++ d = state[3]; ++ ++ MD5STEP(F1, a, b, c, d, in[ 0] + 0xd76aa478, 7); ++ MD5STEP(F1, d, a, b, c, in[ 1] + 0xe8c7b756, 12); ++ MD5STEP(F1, c, d, a, b, in[ 2] + 0x242070db, 17); ++ MD5STEP(F1, b, c, d, a, in[ 3] + 0xc1bdceee, 22); ++ MD5STEP(F1, a, b, c, d, in[ 4] + 0xf57c0faf, 7); ++ MD5STEP(F1, d, a, b, c, in[ 5] + 0x4787c62a, 12); ++ MD5STEP(F1, c, d, a, b, in[ 6] + 0xa8304613, 17); ++ MD5STEP(F1, b, c, d, a, in[ 7] + 0xfd469501, 22); ++ MD5STEP(F1, a, b, c, d, in[ 8] + 0x698098d8, 7); ++ MD5STEP(F1, d, a, b, c, in[ 9] + 0x8b44f7af, 12); ++ MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); ++ MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); ++ MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); ++ MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); ++ MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); ++ MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); ++ ++ MD5STEP(F2, a, b, c, d, in[ 1] + 0xf61e2562, 5); ++ MD5STEP(F2, d, a, b, c, in[ 6] + 0xc040b340, 9); ++ MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); ++ MD5STEP(F2, b, c, d, a, in[ 0] + 0xe9b6c7aa, 20); ++ MD5STEP(F2, a, b, c, d, in[ 5] + 0xd62f105d, 5); ++ MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); ++ MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); ++ MD5STEP(F2, b, c, d, a, in[ 4] + 0xe7d3fbc8, 20); ++ MD5STEP(F2, a, b, c, d, in[ 9] + 0x21e1cde6, 5); ++ MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); ++ MD5STEP(F2, c, d, a, b, in[ 3] + 0xf4d50d87, 14); ++ MD5STEP(F2, b, c, d, a, in[ 8] + 0x455a14ed, 20); ++ MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); ++ MD5STEP(F2, d, a, b, c, in[ 2] + 0xfcefa3f8, 9); ++ MD5STEP(F2, c, d, a, b, in[ 7] + 0x676f02d9, 14); ++ MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); ++ ++ MD5STEP(F3, a, b, c, d, in[ 5] + 0xfffa3942, 4); ++ MD5STEP(F3, d, a, b, c, in[ 8] + 0x8771f681, 11); ++ MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); ++ MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); ++ MD5STEP(F3, a, b, c, d, in[ 1] + 0xa4beea44, 4); ++ MD5STEP(F3, d, a, b, c, in[ 4] + 0x4bdecfa9, 11); ++ MD5STEP(F3, c, d, a, b, in[ 7] + 0xf6bb4b60, 16); ++ MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); ++ MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); ++ MD5STEP(F3, d, a, b, c, in[ 0] + 0xeaa127fa, 11); ++ MD5STEP(F3, c, d, a, b, in[ 3] + 0xd4ef3085, 16); ++ MD5STEP(F3, b, c, d, a, in[ 6] + 0x04881d05, 23); ++ MD5STEP(F3, a, b, c, d, in[ 9] + 0xd9d4d039, 4); ++ MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); ++ MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); ++ MD5STEP(F3, b, c, d, a, in[2 ] + 0xc4ac5665, 23); ++ ++ MD5STEP(F4, a, b, c, d, in[ 0] + 0xf4292244, 6); ++ MD5STEP(F4, d, a, b, c, in[7 ] + 0x432aff97, 10); ++ MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); ++ MD5STEP(F4, b, c, d, a, in[5 ] + 0xfc93a039, 21); ++ MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); ++ MD5STEP(F4, d, a, b, c, in[3 ] + 0x8f0ccc92, 10); ++ MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); ++ MD5STEP(F4, b, c, d, a, in[1 ] + 0x85845dd1, 21); ++ MD5STEP(F4, a, b, c, d, in[8 ] + 0x6fa87e4f, 6); ++ MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); ++ MD5STEP(F4, c, d, a, b, in[6 ] + 0xa3014314, 15); ++ MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); ++ MD5STEP(F4, a, b, c, d, in[4 ] + 0xf7537e82, 6); ++ MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); ++ MD5STEP(F4, c, d, a, b, in[2 ] + 0x2ad7d2bb, 15); ++ MD5STEP(F4, b, c, d, a, in[9 ] + 0xeb86d391, 21); ++ ++ state[0] += a; ++ state[1] += b; ++ state[2] += c; ++ state[3] += d; ++} +diff --git a/src/plugins/vbng/lib/md5.h b/src/plugins/vbng/lib/md5.h +new file mode 100644 +index 00000000..fcbaf91f +--- /dev/null ++++ b/src/plugins/vbng/lib/md5.h +@@ -0,0 +1,86 @@ ++/* ++ * md5.h Structures and prototypes for md5. ++ * ++ * Version: $Id: md5.h,v 1.2 2007/06/21 18:07:24 cparker Exp $ ++ * License: BSD, but largely derived from a public domain source. ++ * ++ */ ++ ++#ifndef _RCRAD_MD5_H ++#define _RCRAD_MD5_H ++ ++#include "config.h" ++ ++#ifdef HAVE_NETTLE ++ ++#include <nettle/md5-compat.h> ++ ++#else ++ ++#ifdef HAVE_INTTYPES_H ++#include <inttypes.h> ++#endif ++ ++#ifdef HAVE_SYS_TYPES_H ++#include <sys/types.h> ++#endif ++ ++#ifdef HAVE_STDINT_H ++#include <stdint.h> ++#endif ++ ++#include <string.h> ++/* ++ * FreeRADIUS Client defines to ensure globally unique MD5 function names, ++ * so that we don't pick up vendor-specific broken MD5 libraries. ++ */ ++#define MD5_CTX librad_MD5_CTX ++#define MD5Init librad_MD5Init ++#define MD5Update librad_MD5Update ++#define MD5Final librad_MD5Final ++#define MD5Transform librad_MD5Transform ++ ++/* The below was retrieved from ++ * http://www.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/crypto/md5.h?rev=1.1 ++ * With the following changes: uint64_t => uint32_t[2] ++ * Commented out #include <sys/cdefs.h> ++ * Commented out the __BEGIN and __END _DECLS, and the __attributes. ++ */ ++ ++/* ++ * This code implements the MD5 message-digest algorithm. ++ * The algorithm is due to Ron Rivest. This code was ++ * written by Colin Plumb in 1993, no copyright is claimed. ++ * This code is in the public domain; do with it what you wish. ++ * ++ * Equivalent code is available from RSA Data Security, Inc. ++ * This code has been tested against that, and is equivalent, ++ * except that you don't need to include two pages of legalese ++ * with every copy. ++ */ ++ ++#define MD5_BLOCK_LENGTH 64 ++#define MD5_DIGEST_LENGTH 16 ++ ++typedef struct MD5Context { ++ uint32_t state[4]; /* state */ ++ uint32_t count[2]; /* number of bits, mod 2^64 */ ++ uint8_t buffer[MD5_BLOCK_LENGTH]; /* input buffer */ ++} MD5_CTX; ++ ++/* include <sys/cdefs.h> */ ++ ++/* __BEGIN_DECLS */ ++void MD5Init(MD5_CTX *); ++void MD5Update(MD5_CTX *, uint8_t const *, size_t) ++/* __attribute__((__bounded__(__string__,2,3)))*/; ++void MD5Final(uint8_t [MD5_DIGEST_LENGTH], MD5_CTX *) ++/* __attribute__((__bounded__(__minbytes__,1,MD5_DIGEST_LENGTH)))*/; ++void MD5Transform(uint32_t [4], uint8_t const [MD5_BLOCK_LENGTH]) ++/* __attribute__((__bounded__(__minbytes__,1,4)))*/ ++/* __attribute__((__bounded__(__minbytes__,2,MD5_BLOCK_LENGTH)))*/; ++/* __END_DECLS */ ++ ++#endif /* HAVE_NETTLE */ ++ ++#endif /* _RCRAD_MD5_H */ +diff --git a/src/plugins/vbng/lib/options.h b/src/plugins/vbng/lib/options.h +new file mode 100644 +index 00000000..05b66dfd +--- /dev/null ++++ b/src/plugins/vbng/lib/options.h +@@ -0,0 +1,57 @@ ++/* ++ * $Id: options.h,v 1.6 2008/03/05 16:35:20 cparker Exp $ ++ * ++ * Copyright (C) 1996 Lars Fenneberg ++ * ++ * See the file COPYRIGHT for the respective terms and conditions. ++ * If the file is missing contact me at lf@elemental.net ++ * and I'll send you a copy. ++ * ++ */ ++ ++#define OPTION_LEN 64 ++ ++/* ids for different option types */ ++#define OT_STR (1<<0) /* string */ ++#define OT_INT (1<<1) /* integer */ ++#define OT_SRV (1<<2) /* server list */ ++#define OT_AUO (1<<3) /* authentication order */ ++ ++#define OT_ANY ((unsigned int)~0) /* used internally */ ++ ++/* status types */ ++#define ST_UNDEF (1<<0) /* option is undefined */ ++ ++typedef struct _option { ++ char name[OPTION_LEN]; /* name of the option */ ++ int type, status; /* type and status */ ++ void *val; /* pointer to option value */ ++} OPTION; ++ ++static OPTION config_options_default[] = { ++/* internally used options */ ++{"config_file", OT_STR, ST_UNDEF, NULL}, ++/* General options */ ++{"auth_order", OT_AUO, ST_UNDEF, NULL}, ++{"login_tries", OT_INT, ST_UNDEF, NULL}, ++{"login_timeout", OT_INT, ST_UNDEF, NULL}, ++{"nologin", OT_STR, ST_UNDEF, NULL}, ++{"issue", OT_STR, ST_UNDEF, NULL}, ++/* RADIUS specific options */ ++{"authserver", OT_SRV, ST_UNDEF, NULL}, ++{"acctserver", OT_SRV, ST_UNDEF, NULL}, ++{"servers", OT_STR, ST_UNDEF, NULL}, ++{"dictionary", OT_STR, ST_UNDEF, NULL}, ++{"login_radius", OT_STR, ST_UNDEF, NULL}, ++{"seqfile", OT_STR, ST_UNDEF, NULL}, ++{"mapfile", OT_STR, ST_UNDEF, NULL}, ++{"default_realm", OT_STR, ST_UNDEF, NULL}, ++{"radius_timeout", OT_INT, ST_UNDEF, NULL}, ++{"radius_retries", OT_INT, ST_UNDEF, NULL}, ++{"radius_deadtime", OT_INT, ST_UNDEF, NULL}, ++{"bindaddr", OT_STR, ST_UNDEF, NULL}, ++/* local options */ ++{"login_local", OT_STR, ST_UNDEF, NULL}, ++}; ++ ++#define NUM_OPTIONS ((sizeof(config_options_default))/(sizeof(config_options_default[0]))) +diff --git a/src/plugins/vbng/lib/rc-md5.c b/src/plugins/vbng/lib/rc-md5.c +new file mode 100644 +index 00000000..be9fbcbd +--- /dev/null ++++ b/src/plugins/vbng/lib/rc-md5.c +@@ -0,0 +1,24 @@ ++/* MD5 message-digest algorithm */ ++ ++/* This file is licensed under the BSD License, but is largely derived from ++ * public domain source code ++ */ ++ ++/* ++ * FORCE MD5 TO USE OUR MD5 HEADER FILE! ++ * ++ * If we don't do this, it might pick up the systems broken MD5. ++ * - Alan DeKok <aland@ox.org> ++ */ ++#include "rc-md5.h" ++ ++void rc_md5_calc(unsigned char *output, unsigned char const *input, ++ size_t inlen) ++{ ++ MD5_CTX context; ++ ++ MD5Init(&context); ++ MD5Update(&context, input, inlen); ++ MD5Final(output, &context); ++} ++ +diff --git a/src/plugins/vbng/lib/rc-md5.h b/src/plugins/vbng/lib/rc-md5.h +new file mode 100644 +index 00000000..a30f16d3 +--- /dev/null ++++ b/src/plugins/vbng/lib/rc-md5.h +@@ -0,0 +1,27 @@ ++/* ++ * md5.h Structures and prototypes for md5. ++ * ++ * Version: $Id: md5.h,v 1.2 2007/06/21 18:07:24 cparker Exp $ ++ * License: BSD ++ * ++ */ ++ ++#ifndef _RC_MD5_H ++#define _RC_MD5_H ++ ++#include "config.h" ++ ++#ifdef HAVE_NETTLE ++ ++#include <nettle/md5-compat.h> ++ ++#else ++ ++#include "md5.h" ++ ++#endif /* HAVE_NETTLE */ ++ ++void rc_md5_calc(unsigned char *output, unsigned char const *input, ++ size_t inputlen); ++ ++#endif /* _RC_MD5_H */ +diff --git a/src/plugins/vbng/lib/sendserver.c b/src/plugins/vbng/lib/sendserver.c +new file mode 100644 +index 00000000..bfdd9a26 +--- /dev/null ++++ b/src/plugins/vbng/lib/sendserver.c +@@ -0,0 +1,631 @@ ++/* ++ * $Id: sendserver.c,v 1.30 2010/06/15 09:22:52 aland Exp $ ++ * ++ * Copyright (C) 1995,1996,1997 Lars Fenneberg ++ * ++ * Copyright 1992 Livingston Enterprises, Inc. ++ * ++ * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan ++ * and Merit Network, Inc. All Rights Reserved ++ * ++ * See the file COPYRIGHT for the respective terms and conditions. ++ * If the file is missing contact me at lf@elemental.net ++ * and I'll send you a copy. ++ * ++ */ ++ ++#include <poll.h> ++ ++#include <config.h> ++#include <includes.h> ++#include <freeradius-client.h> ++#include <pathnames.h> ++ ++#define SA(p) ((struct sockaddr *)(p)) ++ ++static void rc_random_vector (unsigned char *); ++static int rc_check_reply (AUTH_HDR *, int, char const *, unsigned char const *, unsigned char); ++ ++/* ++ * Function: rc_pack_list ++ * ++ * Purpose: Packs an attribute value pair list into a buffer. ++ * ++ * Returns: Number of octets packed. ++ * ++ */ ++ ++static int rc_pack_list (VALUE_PAIR *vp, char *secret, AUTH_HDR *auth) ++{ ++ int length, i, pc, padded_length; ++ int total_length = 0; ++ size_t secretlen; ++ uint32_t lvalue, vendor; ++ unsigned char passbuf[MAX(AUTH_PASS_LEN, CHAP_VALUE_LENGTH)]; ++ unsigned char md5buf[256]; ++ unsigned char *buf, *vector, *vsa_length_ptr; ++ ++ buf = auth->data; ++ ++ while (vp != NULL) ++ { ++ vsa_length_ptr = NULL; ++ if (VENDOR(vp->attribute) != 0) { ++ *buf++ = PW_VENDOR_SPECIFIC; ++ vsa_length_ptr = buf; ++ *buf++ = 6; ++ vendor = htonl(VENDOR(vp->attribute)); ++ memcpy(buf, &vendor, sizeof(uint32_t)); ++ buf += 4; ++ total_length += 6; ++ } ++ *buf++ = (vp->attribute & 0xff); ++ ++ switch (vp->attribute) ++ { ++ case PW_USER_PASSWORD: ++ ++ /* Encrypt the password */ ++ ++ /* Chop off password at AUTH_PASS_LEN */ ++ length = vp->lvalue; ++ if (length > AUTH_PASS_LEN) ++ length = AUTH_PASS_LEN; ++ ++ /* Calculate the padded length */ ++ padded_length = (length+(AUTH_VECTOR_LEN-1)) & ~(AUTH_VECTOR_LEN-1); ++ ++ /* Record the attribute length */ ++ *buf++ = padded_length + 2; ++ if (vsa_length_ptr != NULL) *vsa_length_ptr += padded_length + 2; ++ ++ /* Pad the password with zeros */ ++ memset ((char *) passbuf, '\0', AUTH_PASS_LEN); ++ memcpy ((char *) passbuf, vp->strvalue, (size_t) length); ++ ++ secretlen = strlen (secret); ++ vector = (unsigned char *)auth->vector; ++ for(i = 0; i < padded_length; i += AUTH_VECTOR_LEN) ++ { ++ /* Calculate the MD5 digest*/ ++ strcpy ((char *) md5buf, secret); ++ memcpy ((char *) md5buf + secretlen, vector, ++ AUTH_VECTOR_LEN); ++ rc_md5_calc (buf, md5buf, secretlen + AUTH_VECTOR_LEN); ++ ++ /* Remeber the start of the digest */ ++ vector = buf; ++ ++ /* Xor the password into the MD5 digest */ ++ for (pc = i; pc < (i + AUTH_VECTOR_LEN); pc++) ++ { ++ *buf++ ^= passbuf[pc]; ++ } ++ } ++ ++ total_length += padded_length + 2; ++ ++ break; ++#if 0 ++ case PW_CHAP_PASSWORD: ++ ++ *buf++ = CHAP_VALUE_LENGTH + 2; ++ if (vsa_length_ptr != NULL) *vsa_length_ptr += CHAP_VALUE_LENGTH + 2; ++ ++ /* Encrypt the Password */ ++ length = vp->lvalue; ++ if (length > CHAP_VALUE_LENGTH) ++ { ++ length = CHAP_VALUE_LENGTH; ++ } ++ memset ((char *) passbuf, '\0', CHAP_VALUE_LENGTH); ++ memcpy ((char *) passbuf, vp->strvalue, (size_t) length); ++ ++ /* Calculate the MD5 Digest */ ++ secretlen = strlen (secret); ++ strcpy ((char *) md5buf, secret); ++ memcpy ((char *) md5buf + secretlen, (char *) auth->vector, ++ AUTH_VECTOR_LEN); ++ rc_md5_calc (buf, md5buf, secretlen + AUTH_VECTOR_LEN); ++ ++ /* Xor the password into the MD5 digest */ ++ for (i = 0; i < CHAP_VALUE_LENGTH; i++) ++ { ++ *buf++ ^= passbuf[i]; ++ } ++ total_length += CHAP_VALUE_LENGTH + 2; ++ ++ break; ++#endif ++ default: ++ switch (vp->type) ++ { ++ case PW_TYPE_STRING: ++ length = vp->lvalue; ++ *buf++ = length + 2; ++ if (vsa_length_ptr != NULL) *vsa_length_ptr += length + 2; ++ memcpy (buf, vp->strvalue, (size_t) length); ++ buf += length; ++ total_length += length + 2; ++ break; ++ ++ case PW_TYPE_IPV6ADDR: ++ length = 16; ++ if (vsa_length_ptr != NULL) *vsa_length_ptr += length + 2; ++ memcpy (buf, vp->strvalue, (size_t) length); ++ buf += length; ++ total_length += length + 2; ++ break; ++ ++ case PW_TYPE_IPV6PREFIX: ++ length = vp->lvalue; ++ if (vsa_length_ptr != NULL) *vsa_length_ptr += length + 2; ++ memcpy (buf, vp->strvalue, (size_t) length); ++ buf += length; ++ total_length += length + 2; ++ break; ++ ++ case PW_TYPE_INTEGER: ++ case PW_TYPE_IPADDR: ++ case PW_TYPE_DATE: ++ *buf++ = sizeof (uint32_t) + 2; ++ if (vsa_length_ptr != NULL) *vsa_length_ptr += sizeof(uint32_t) + 2; ++ lvalue = htonl (vp->lvalue); ++ memcpy (buf, (char *) &lvalue, sizeof (uint32_t)); ++ buf += sizeof (uint32_t); ++ total_length += sizeof (uint32_t) + 2; ++ break; ++ ++ default: ++ break; ++ } ++ break; ++ } ++ vp = vp->next; ++ } ++ return total_length; ++} ++ ++/* Function strappend ++ * ++ * Purpose: appends a string to the provided buffer ++ */ ++static void strappend(char *dest, unsigned max_size, int *pos, const char *src) ++{ ++ unsigned len = strlen(src) + 1; ++ ++ if (*pos == -1) ++ return; ++ ++ if (len + *pos > max_size) { ++ *pos = -1; ++ return; ++ } ++ ++ memcpy(&dest[*pos], src, len); ++ *pos += len-1; ++ return; ++} ++ ++/* ++ * Function: rc_send_server ++ * ++ * Purpose: send a request to a RADIUS server and wait for the reply ++ * ++ */ ++ ++int rc_send_server (rc_handle *rh, SEND_DATA *data, char *msg) ++{ ++ int sockfd; ++ struct sockaddr_in sinlocal; ++ struct sockaddr_in sinremote; ++ AUTH_HDR *auth, *recv_auth; ++ uint32_t auth_ipaddr, nas_ipaddr; ++ char *server_name; /* Name of server to query */ ++ socklen_t salen; ++ int result = 0; ++ int total_length; ++ int length, pos; ++ int retry_max; ++ size_t secretlen; ++ char secret[MAX_SECRET_LENGTH + 1]; ++ unsigned char vector[AUTH_VECTOR_LEN]; ++ char recv_buffer[BUFFER_LEN]; ++ char send_buffer[BUFFER_LEN]; ++ int retries; ++ VALUE_PAIR *vp; ++ struct pollfd pfd; ++ double start_time, timeout; ++ ++ server_name = data->server; ++ if (server_name == NULL || server_name[0] == '\0') ++ return ERROR_RC; ++ ++ if ((vp = rc_avpair_get(data->send_pairs, PW_SERVICE_TYPE, 0)) && \ ++ (vp->lvalue == PW_ADMINISTRATIVE)) ++ { ++ strcpy(secret, MGMT_POLL_SECRET); ++ if ((auth_ipaddr = rc_get_ipaddr(server_name)) == 0) ++ return ERROR_RC; ++ } ++ else ++ { ++ if(data->secret != NULL) ++ { ++ strncpy(secret, data->secret, MAX_SECRET_LENGTH); ++ } ++ /* ++ else ++ { ++ */ ++ if (rc_find_server (rh, server_name, &auth_ipaddr, secret) != 0) ++ { ++ rc_log(LOG_ERR, "rc_send_server: unable to find server: %s", server_name); ++ return ERROR_RC; ++ } ++ /*}*/ ++ } ++ ++ DEBUG(LOG_ERR, "DEBUG: rc_send_server: creating socket to: %s", server_name); ++ ++ sockfd = socket (AF_INET, SOCK_DGRAM, 0); ++ if (sockfd < 0) ++ { ++ memset (secret, '\0', sizeof (secret)); ++ rc_log(LOG_ERR, "rc_send_server: socket: %s", strerror(errno)); ++ return ERROR_RC; ++ } ++ ++ memset((char *)&sinlocal, '\0', sizeof(sinlocal)); ++ sinlocal.sin_family = AF_INET; ++ sinlocal.sin_addr.s_addr = htonl(rc_own_bind_ipaddress(rh)); ++ sinlocal.sin_port = htons((unsigned short) 0); ++ if (bind(sockfd, SA(&sinlocal), sizeof(sinlocal)) < 0) ++ { ++ close (sockfd); ++ memset (secret, '\0', sizeof (secret)); ++ rc_log(LOG_ERR, "rc_send_server: bind: %s: %s", server_name, strerror(errno)); ++ return ERROR_RC; ++ } ++ ++ retry_max = data->retries; /* Max. numbers to try for reply */ ++ retries = 0; /* Init retry cnt for blocking call */ ++ ++ memset ((char *)&sinremote, '\0', sizeof(sinremote)); ++ sinremote.sin_family = AF_INET; ++ sinremote.sin_addr.s_addr = htonl (auth_ipaddr); ++ sinremote.sin_port = htons ((unsigned short) data->svc_port); ++ ++ /* ++ * Fill in NAS-IP-Address (if needed) ++ */ ++ if (rc_avpair_get(data->send_pairs, PW_NAS_IP_ADDRESS, 0) == NULL) { ++ if (sinlocal.sin_addr.s_addr == htonl(INADDR_ANY)) { ++ if (rc_get_srcaddr(SA(&sinlocal), SA(&sinremote)) != 0) { ++ close (sockfd); ++ memset (secret, '\0', sizeof (secret)); ++ return ERROR_RC; ++ } ++ } ++ nas_ipaddr = ntohl(sinlocal.sin_addr.s_addr); ++ rc_avpair_add(rh, &(data->send_pairs), PW_NAS_IP_ADDRESS, ++ &nas_ipaddr, 0, 0); ++ } ++ ++ /* Build a request */ ++ auth = (AUTH_HDR *) send_buffer; ++ auth->code = data->code; ++ auth->id = data->seq_nbr; ++ ++ if (data->code == PW_ACCOUNTING_REQUEST) ++ { ++ total_length = rc_pack_list(data->send_pairs, secret, auth) + AUTH_HDR_LEN; ++ ++ auth->length = htons ((unsigned short) total_length); ++ ++ memset((char *) auth->vector, 0, AUTH_VECTOR_LEN); ++ secretlen = strlen (secret); ++ memcpy ((char *) auth + total_length, secret, secretlen); ++ rc_md5_calc (vector, (unsigned char *) auth, total_length + secretlen); ++ memcpy ((char *) auth->vector, (char *) vector, AUTH_VECTOR_LEN); ++ } ++ else ++ { ++ rc_random_vector (vector); ++ memcpy ((char *) auth->vector, (char *) vector, AUTH_VECTOR_LEN); ++ ++ total_length = rc_pack_list(data->send_pairs, secret, auth) + AUTH_HDR_LEN; ++ ++ auth->length = htons ((unsigned short) total_length); ++ } ++ ++ DEBUG(LOG_ERR, "DEBUG: local %s : 0, remote %s : %u\n", ++ inet_ntoa(sinlocal.sin_addr), ++ inet_ntoa(sinremote.sin_addr), data->svc_port); ++ ++ for (;;) ++ { ++ sendto (sockfd, (char *) auth, (unsigned int) total_length, (int) 0, ++ SA(&sinremote), sizeof (struct sockaddr_in)); ++ ++ pfd.fd = sockfd; ++ pfd.events = POLLIN; ++ pfd.revents = 0; ++ start_time = rc_getctime(); ++ for (timeout = data->timeout; timeout > 0; ++ timeout -= rc_getctime() - start_time) { ++ result = poll(&pfd, 1, timeout * 1000); ++ if (result != -1 || errno != EINTR) ++ break; ++ } ++ if (result == -1) ++ { ++ rc_log(LOG_ERR, "rc_send_server: poll: %s", strerror(errno)); ++ memset (secret, '\0', sizeof (secret)); ++ close (sockfd); ++ return ERROR_RC; ++ } ++ if (result == 1 && (pfd.revents & POLLIN) != 0) ++ break; ++ ++ /* ++ * Timed out waiting for response. Retry "retry_max" times ++ * before giving up. If retry_max = 0, don't retry at all. ++ */ ++ if (retries++ >= retry_max) ++ { ++ rc_log(LOG_ERR, ++ "rc_send_server: no reply from RADIUS server %s:%u, %s", ++ rc_ip_hostname (auth_ipaddr), data->svc_port, inet_ntoa(sinremote.sin_addr)); ++ close (sockfd); ++ memset (secret, '\0', sizeof (secret)); ++ return TIMEOUT_RC; ++ } ++ } ++ salen = sizeof(sinremote); ++ length = recvfrom (sockfd, (char *) recv_buffer, ++ (int) sizeof (recv_buffer), ++ (int) 0, SA(&sinremote), &salen); ++ ++ if (length <= 0) ++ { ++ rc_log(LOG_ERR, "rc_send_server: recvfrom: %s:%d: %s", server_name,\ ++ data->svc_port, strerror(errno)); ++ close (sockfd); ++ memset (secret, '\0', sizeof (secret)); ++ return ERROR_RC; ++ } ++ ++ recv_auth = (AUTH_HDR *)recv_buffer; ++ ++ if (length < AUTH_HDR_LEN || length < ntohs(recv_auth->length)) { ++ rc_log(LOG_ERR, "rc_send_server: recvfrom: %s:%d: reply is too short", ++ server_name, data->svc_port); ++ close(sockfd); ++ memset(secret, '\0', sizeof(secret)); ++ return ERROR_RC; ++ } ++ ++ result = rc_check_reply (recv_auth, BUFFER_LEN, secret, vector, data->seq_nbr); ++ ++ length = ntohs(recv_auth->length) - AUTH_HDR_LEN; ++ if (length > 0) { ++ data->receive_pairs = rc_avpair_gen(rh, NULL, recv_auth->data, ++ length, 0); ++ } else { ++ data->receive_pairs = NULL; ++ } ++ ++ close (sockfd); ++ memset (secret, '\0', sizeof (secret)); ++ ++ if (result != OK_RC) return result; ++ ++ if (msg) { ++ *msg = '\0'; ++ pos = 0; ++ vp = data->receive_pairs; ++ while (vp) ++ { ++ if ((vp = rc_avpair_get(vp, PW_REPLY_MESSAGE, 0))) ++ { ++ strappend(msg, PW_MAX_MSG_SIZE, &pos, vp->strvalue); ++ strappend(msg, PW_MAX_MSG_SIZE, &pos, "\n"); ++ vp = vp->next; ++ } ++ } ++ } ++ ++ if ((recv_auth->code == PW_ACCESS_ACCEPT) || ++ (recv_auth->code == PW_PASSWORD_ACK) || ++ (recv_auth->code == PW_ACCOUNTING_RESPONSE)) ++ { ++ result = OK_RC; ++ } ++ else if ((recv_auth->code == PW_ACCESS_REJECT) || ++ (recv_auth->code == PW_PASSWORD_REJECT)) ++ { ++ result = REJECT_RC; ++ } ++ else ++ { ++ result = BADRESP_RC; ++ } ++ ++ return result; ++} ++ ++/* ++ * Function: rc_check_reply ++ * ++ * Purpose: verify items in returned packet. ++ * ++ * Returns: OK_RC -- upon success, ++ * BADRESP_RC -- if anything looks funny. ++ * ++ */ ++ ++static int rc_check_reply (AUTH_HDR *auth, int bufferlen, char const *secret, unsigned char const *vector, uint8_t seq_nbr) ++{ ++ int secretlen; ++ int totallen; ++ unsigned char calc_digest[AUTH_VECTOR_LEN]; ++ unsigned char reply_digest[AUTH_VECTOR_LEN]; ++#ifdef DIGEST_DEBUG ++ uint8_t *ptr; ++#endif ++ ++ totallen = ntohs (auth->length); ++ secretlen = (int)strlen (secret); ++ ++ /* Do sanity checks on packet length */ ++ if ((totallen < 20) || (totallen > 4096)) ++ { ++ rc_log(LOG_ERR, "rc_check_reply: received RADIUS server response with invalid length"); ++ return BADRESP_RC; ++ } ++ ++ /* Verify buffer space, should never trigger with current buffer size and check above */ ++ if ((totallen + secretlen) > bufferlen) ++ { ++ rc_log(LOG_ERR, "rc_check_reply: not enough buffer space to verify RADIUS server response"); ++ return BADRESP_RC; ++ } ++ ++ /* Verify that id (seq. number) matches what we sent */ ++ if (auth->id != seq_nbr) ++ { ++ rc_log(LOG_ERR, "rc_check_reply: received non-matching id in RADIUS server response"); ++ return BADRESP_RC; ++ } ++ ++ /* Verify the reply digest */ ++ memcpy ((char *) reply_digest, (char *) auth->vector, AUTH_VECTOR_LEN); ++ memcpy ((char *) auth->vector, (char *) vector, AUTH_VECTOR_LEN); ++ memcpy ((char *) auth + totallen, secret, secretlen); ++#ifdef DIGEST_DEBUG ++ rc_log(LOG_ERR, "Calculating digest on:"); ++ for (ptr = (u_char *)auth; ptr < ((u_char *)auth) + totallen + secretlen; ptr += 32) { ++ char buf[65]; ++ int i; ++ ++ buf[0] = '\0'; ++ for (i = 0; i < 32; i++) { ++ if (ptr + i >= ((u_char *)auth) + totallen + secretlen) ++ break; ++ sprintf(buf + i * 2, "%.2X", ptr[i]); ++ } ++ rc_log(LOG_ERR, " %s", buf); ++ } ++#endif ++ rc_md5_calc (calc_digest, (unsigned char *) auth, totallen + secretlen); ++#ifdef DIGEST_DEBUG ++ rc_log(LOG_ERR, "Calculated digest is:"); ++ for (ptr = (u_char *)calc_digest; ptr < ((u_char *)calc_digest) + 16; ptr += 32) { ++ char buf[65]; ++ int i; ++ ++ buf[0] = '\0'; ++ for (i = 0; i < 32; i++) { ++ if (ptr + i >= ((u_char *)calc_digest) + 16) ++ break; ++ sprintf(buf + i * 2, "%.2X", ptr[i]); ++ } ++ rc_log(LOG_ERR, " %s", buf); ++ } ++ rc_log(LOG_ERR, "Reply digest is:"); ++ for (ptr = (u_char *)reply_digest; ptr < ((u_char *)reply_digest) + 16; ptr += 32) { ++ char buf[65]; ++ int i; ++ ++ buf[0] = '\0'; ++ for (i = 0; i < 32; i++) { ++ if (ptr + i >= ((u_char *)reply_digest) + 16) ++ break; ++ sprintf(buf + i * 2, "%.2X", ptr[i]); ++ } ++ rc_log(LOG_ERR, " %s", buf); ++ } ++#endif ++ ++ if (memcmp ((char *) reply_digest, (char *) calc_digest, ++ AUTH_VECTOR_LEN) != 0) ++ { ++#ifdef RADIUS_116 ++ /* the original Livingston radiusd v1.16 seems to have ++ a bug in digest calculation with accounting requests, ++ authentication request are ok. i looked at the code ++ but couldn't find any bugs. any help to get this ++ kludge out are welcome. preferably i want to ++ reproduce the calculation bug here to be compatible ++ to stock Livingston radiusd v1.16. -lf, 03/14/96 ++ */ ++ if (auth->code == PW_ACCOUNTING_RESPONSE) ++ return OK_RC; ++#endif ++ rc_log(LOG_ERR, "rc_check_reply: received invalid reply digest from RADIUS server"); ++ return BADRESP_RC; ++ } ++ ++ return OK_RC; ++ ++} ++ ++/* ++ * Function: rc_random_vector ++ * ++ * Purpose: generates a random vector of AUTH_VECTOR_LEN octets. ++ * ++ * Returns: the vector (call by reference) ++ * ++ */ ++ ++static void rc_random_vector (unsigned char *vector) ++{ ++ int randno; ++ int i; ++#if defined(HAVE_GETENTROPY) ++ if (getentropy(vector, AUTH_VECTOR_LEN) >= 0) { ++ return; ++ } /* else fall through */ ++#elif defined(HAVE_DEV_URANDOM) ++ int fd; ++ ++/* well, I added this to increase the security for user passwords. ++ we use /dev/urandom here, as /dev/random might block and we don't ++ need that much randomness. BTW, great idea, Ted! -lf, 03/18/95 */ ++ ++ if ((fd = open(_PATH_DEV_URANDOM, O_RDONLY)) >= 0) ++ { ++ unsigned char *pos; ++ int readcount; ++ ++ i = AUTH_VECTOR_LEN; ++ pos = vector; ++ while (i > 0) ++ { ++ readcount = read(fd, (char *)pos, i); ++ if (readcount >= 0) { ++ pos += readcount; ++ i -= readcount; ++ } else { ++ if (errno != EINTR && errno != EAGAIN) ++ goto fallback; ++ } ++ } ++ ++ close(fd); ++ return; ++ } /* else fall through */ ++#endif ++ fallback: ++ for (i = 0; i < AUTH_VECTOR_LEN;) ++ { ++ randno = random (); ++ memcpy ((char *) vector, (char *) &randno, sizeof (int)); ++ vector += sizeof (int); ++ i += sizeof (int); ++ } ++ ++ return; ++} +diff --git a/src/plugins/vbng/lib/util.c b/src/plugins/vbng/lib/util.c +new file mode 100644 +index 00000000..aa7c057d +--- /dev/null ++++ b/src/plugins/vbng/lib/util.c +@@ -0,0 +1,347 @@ ++/* ++ * $Id: util.c,v 1.10 2010/02/04 10:31:41 aland Exp $ ++ * ++ * Copyright (c) 1998 The NetBSD Foundation, Inc. ++ * ++ * Copyright (C) 1995,1996,1997 Lars Fenneberg ++ * ++ * Copyright 1992 Livingston Enterprises, Inc. ++ * ++ * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan ++ * and Merit Network, Inc. All Rights Reserved ++ * ++ * See the file COPYRIGHT for the respective terms and conditions. ++ * If the file is missing contact me at lf@elemental.net ++ * and I'll send you a copy. ++ * ++ */ ++ ++#include <sys/time.h> ++ ++#include <config.h> ++#include <includes.h> ++#include <freeradius-client.h> ++ ++#define RC_BUFSIZ 1024 ++ ++/* ++ * Function: rc_str2tm ++ * ++ * Purpose: Turns printable string into correct tm struct entries. ++ * ++ */ ++ ++static char const * months[] = ++ { ++ "Jan", "Feb", "Mar", "Apr", "May", "Jun", ++ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ++ }; ++ ++void rc_str2tm (char const *valstr, struct tm *tm) ++{ ++ int i; ++ ++ /* Get the month */ ++ for (i = 0; i < 12; i++) ++ { ++ if (strncmp (months[i], valstr, 3) == 0) ++ { ++ tm->tm_mon = i; ++ i = 13; ++ } ++ } ++ ++ /* Get the Day */ ++ tm->tm_mday = atoi (&valstr[4]); ++ ++ /* Now the year */ ++ tm->tm_year = atoi (&valstr[7]) - 1900; ++} ++ ++/* ++ * Function: rc_getifname ++ * ++ * Purpose: get the network interface name associated with this tty ++ * ++ */ ++ ++char *rc_getifname(rc_handle *rh, char const *tty) ++{ ++#if defined(BSD4_4) || defined(linux) ++ int fd; ++ ++ if ((fd = open(tty, O_RDWR|O_NDELAY)) < 0) { ++ rc_log(LOG_ERR, "rc_getifname: can't open %s: %s", tty, strerror(errno)); ++ return NULL; ++ } ++#endif ++ ++#ifdef BSD4_4 ++ strcpy(rh->ifname,ttyname(fd)); ++ if (strlen(rh->ifname) < 1) { ++ rc_log(LOG_ERR, "rc_getifname: can't get attached interface of %s: %s", tty, strerror(errno)); ++ close(fd); ++ return NULL; ++ } ++#elif linux ++ if (ioctl(fd, SIOCGIFNAME, rh->ifname) < 0) { ++ rc_log(LOG_ERR, "rc_getifname: can't ioctl %s: %s", tty, strerror(errno)); ++ close(fd); ++ return NULL; ++ } ++#else ++ return NULL; ++#endif ++ ++#if defined(BSD4_4) || defined(linux) ++ close(fd); ++ return rh->ifname; ++#endif ++} ++ ++/* ++ * Function: rc_getstr ++ * ++ * Purpose: Reads in a string from the user (with or witout echo) ++ * ++ */ ++#ifndef _MSC_VER ++char *rc_getstr (rc_handle *rh, char const *prompt, int do_echo) ++{ ++ int in, out; ++ char *p; ++ struct termios term_old, term_new; ++ int is_term, flags, old_flags; ++ char c; ++ int flushed = 0; ++ sigset_t newset; ++ sigset_t oldset; ++ ++ in = fileno(stdin); ++ out = fileno(stdout); ++ ++ (void) sigemptyset (&newset); ++ (void) sigaddset (&newset, SIGINT); ++ (void) sigaddset (&newset, SIGTSTP); ++ (void) sigaddset (&newset, SIGQUIT); ++ ++ (void) sigprocmask (SIG_BLOCK, &newset, &oldset); ++ ++ if ((is_term = isatty(in))) ++ { ++ ++ (void) tcgetattr (in, &term_old); ++ term_new = term_old; ++ if (do_echo) ++ term_new.c_lflag |= ECHO; ++ else ++ term_new.c_lflag &= ~ECHO; ++ ++ if (tcsetattr (in, TCSAFLUSH, &term_new) == 0) ++ flushed = 1; ++ ++ } ++ else ++ { ++ is_term = 0; ++ if ((flags = fcntl(in, F_GETFL, 0)) >= 0) { ++ old_flags = flags; ++ flags |= O_NONBLOCK; ++ ++ fcntl(in, F_SETFL, flags); ++ ++ while (read(in, &c, 1) > 0) ++ /* nothing */; ++ ++ fcntl(in, F_SETFL, old_flags); ++ ++ flushed = 1; ++ } ++ } ++ ++ (void)write(out, prompt, strlen(prompt)); ++ ++ /* well, this looks ugly, but it handles the following end of line ++ markers: \r \r\0 \r\n \n \n\r, at least at a second pass */ ++ ++ p = rh->buf; ++ for (;;) ++ { ++ if (read(in, &c, 1) <= 0) ++ return NULL; ++ ++ if (!flushed && ((c == '\0') || (c == '\r') || (c == '\n'))) { ++ flushed = 1; ++ continue; ++ } ++ ++ if ((c == '\r') || (c == '\n')) ++ break; ++ ++ flushed = 1; ++ ++ if (p < rh->buf + GETSTR_LENGTH) ++ { ++ if (do_echo && !is_term) ++ (void)write(out, &c, 1); ++ *p++ = c; ++ } ++ } ++ ++ *p = '\0'; ++ ++ if (!do_echo || !is_term) (void)write(out, "\r\n", 2); ++ ++ if (is_term) ++ tcsetattr (in, TCSAFLUSH, &term_old); ++ else { ++ if ((flags = fcntl(in, F_GETFL, 0)) >= 0) { ++ old_flags = flags; ++ flags |= O_NONBLOCK; ++ ++ fcntl(in, F_SETFL, flags); ++ ++ while (read(in, &c, 1) > 0) ++ /* nothing */; ++ ++ fcntl(in, F_SETFL, old_flags); ++ } ++ } ++ ++ (void) sigprocmask (SIG_SETMASK, &oldset, NULL); ++ ++ return rh->buf; ++} ++#endif ++void rc_mdelay(int msecs) ++{ ++ struct timeval tv; ++ ++ tv.tv_sec = (int) msecs / 1000; ++ tv.tv_usec = (msecs % 1000) * 1000; ++ ++ select(0, NULL, NULL, NULL, &tv); ++} ++ ++/* ++ * Function: rc_mksid ++ * ++ * Purpose: generate a quite unique string ++ * ++ * Remarks: not that unique at all... ++ * ++ */ ++ ++char * ++rc_mksid (rc_handle *rh) ++{ ++ snprintf (rh->buf1, sizeof(rh->buf1), "%08lX%04X", (unsigned long int) time (NULL), (unsigned int) getpid ()); ++ return rh->buf1; ++} ++ ++/* ++ * Function: rc_new ++ * ++ * Purpose: Initialises new Radius Client handle ++ * ++ */ ++ ++rc_handle * ++rc_new(void) ++{ ++ rc_handle *rh; ++ ++ rh = malloc(sizeof(*rh)); ++ if (rh == NULL) { ++ rc_log(LOG_CRIT, "rc_new: out of memory"); ++ return NULL; ++ } ++ memset(rh, 0, sizeof(*rh)); ++ return rh; ++} ++ ++/* ++ * Function: rc_destroy ++ * ++ * Purpose: Destroys Radius Client handle reclaiming all memory ++ * ++ */ ++ ++void ++rc_destroy(rc_handle *rh) ++{ ++ ++ rc_map2id_free(rh); ++ rc_dict_free(rh); ++ rc_config_free(rh); ++ if (rh->this_host_bind_ipaddr != NULL) ++ free(rh->this_host_bind_ipaddr); ++ free(rh); ++} ++ ++/* ++ * Function: rc_fgetln ++ * ++ * Purpose: Get next line from the stream. ++ * ++ */ ++ ++char * ++rc_fgetln(FILE *fp, size_t *len) ++{ ++ static char *buf = NULL; ++ static size_t bufsiz = 0; ++ char *ptr; ++ ++ if (buf == NULL) { ++ bufsiz = RC_BUFSIZ; ++ if ((buf = malloc(bufsiz)) == NULL) ++ return NULL; ++ } ++ ++ if (fgets(buf, (int)bufsiz, fp) == NULL) ++ return NULL; ++ *len = 0; ++ ++ while ((ptr = strchr(&buf[*len], '\n')) == NULL) { ++ size_t nbufsiz = bufsiz + RC_BUFSIZ; ++ char *nbuf = realloc(buf, nbufsiz); ++ ++ if (nbuf == NULL) { ++ int oerrno = errno; ++ free(buf); ++ errno = oerrno; ++ buf = NULL; ++ return NULL; ++ } else ++ buf = nbuf; ++ ++ *len = bufsiz; ++ if (fgets(&buf[bufsiz], RC_BUFSIZ, fp) == NULL) ++ return buf; ++ ++ bufsiz = nbufsiz; ++ } ++ ++ *len = (ptr - buf) + 1; ++ return buf; ++} ++ ++/* ++ * Function: rc_getctime ++ * ++ * Purpose: Get current time (seconds since epoch) expressed as ++ * double-precision floating point number. ++ * ++ */ ++ ++double ++rc_getctime(void) ++{ ++ struct timeval timev; ++ ++ if (gettimeofday(&timev, NULL) == -1) ++ return -1; ++ ++ return timev.tv_sec + ((double)timev.tv_usec) / 1000000.0; ++} +diff --git a/src/plugins/vbng/vbng.api b/src/plugins/vbng/vbng.api +new file mode 100644 +index 00000000..eba9a10f +--- /dev/null ++++ b/src/plugins/vbng/vbng.api +@@ -0,0 +1,50 @@ ++/* ++ * Copyright (c) 2017 Intel Corp and/or its affiliates. ++ * 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. ++ */ ++ ++/** \brief vBNG DHCP config add / del request ++ @param client_index - opaque cookie to identify the sender ++ @param context - sender context, to match reply w/ request ++ @param rx_vrf_id - Rx/interface vrf id ++ @param server_vrf_id - server vrf id ++ @param is_add - add the config if non-zero, else delete ++ @param remote_addr[] - DHCP server address ++ @param local_addr[] - Local Address which could reach DHCP server ++*/ ++define vbng_dhcp4_config ++{ ++ u32 client_index; ++ u32 context; ++ u32 rx_vrf_id; ++ u32 server_vrf_id; ++ u8 is_add; ++ u8 remote_addr[16]; ++ u8 local_addr[16]; ++}; ++ ++/** \brief vBNG DHCP config response ++ @param context - sender context, to match reply w/ request ++ @param retval - return code for the request ++*/ ++define vbng_dhcp4_config_reply ++{ ++ u32 context; ++ i32 retval; ++}; ++ ++/* ++ * Local Variables: ++ * eval: (c-set-style "gnu") ++ * End: ++ */ +diff --git a/src/plugins/vbng/vbng_aaa.c b/src/plugins/vbng/vbng_aaa.c +new file mode 100644 +index 00000000..5e8861f7 +--- /dev/null ++++ b/src/plugins/vbng/vbng_aaa.c +@@ -0,0 +1,71 @@ ++/* ++ * Copyright (c) 2017 Intel and/or its affiliates. ++ * ++ * 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. ++ */ ++ ++#include <ctype.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include <unistd.h> ++ ++#include <vbng/include/freeradius-client.h> ++#include <vbng/vbng_aaa.h> ++ ++int ++process(void *rh, VALUE_PAIR *send, int nas_port) ++{ ++ VALUE_PAIR *received = NULL; ++ char msg[PW_MAX_MSG_SIZE]; ++ int retval; ++ ++ retval = rc_auth(rh, nas_port, send, &received, msg); ++ if (retval == OK_RC && received != NULL) { ++ rc_avpair_free(received); ++ } ++ ++ return retval; ++} ++ ++int ++vbng_auth(vbng_dhcp4_main_t *dm, int argc, char **argv) ++{ ++ int i, nas_port = dm->config.nas_port; ++ char *rc_conf = (char *)dm->config.config_file; ++ VALUE_PAIR *send, **vp; ++ void *rh; ++ ++ if ((rh = rc_read_config(rc_conf)) == NULL) { ++ fprintf(stderr, "error opening radius configuration file\n"); ++ return (1); ++ } ++ ++ if (rc_read_dictionary(rh, rc_conf_str(rh, "dictionary")) != 0) { ++ fprintf(stderr, "error reading radius dictionary\n"); ++ return (2); ++ } ++ ++ send = NULL; ++ vp = &send; ++ for (i = 0; i < argc; i++) { ++ if (rc_avpair_parse(rh, argv[i], vp) < 0) { ++ fprintf(stderr, "%s: can't parse AV pair\n", argv[i]); ++ return (3); ++ } ++ vp = &send->next; ++ } ++ ++ return process(rh, send, nas_port); ++} ++ +diff --git a/src/plugins/vbng/vbng_aaa.h b/src/plugins/vbng/vbng_aaa.h +new file mode 100644 +index 00000000..411a7533 +--- /dev/null ++++ b/src/plugins/vbng/vbng_aaa.h +@@ -0,0 +1,34 @@ ++/* ++ * vbng_aaa.h - vBNG FreeRADIUS client commons. ++ * ++ * Copyright (c) 2017 Intel and/or its affiliates. ++ * 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. ++ */ ++#ifndef _VBNG_AAA_H_ ++#define _VBNG_AAA_H_ ++ ++#include <vbng/vbng_dhcp4.h> ++ ++/* Common configuration for RADIUS client */ ++#define AAA_DEFAULT_NAS_PORT 5060 ++#define AAA_DEFAULT_CONFIG_FILE "/etc/vpp/vbng-aaa.cfg" ++ ++#define BUF_LEN 4096 ++ ++/* String template for the vAAA attributes */ ++#define STR_TPL_ATTR_DHCP_AGENT_CIRCUIT_ID "DHCP-Agent-Circuit-Id=%c" ++#define STR_TPL_ATTR_DHCP_AGENT_REMOTE_ID "DHCP-Agent-Remote-Id=%c" ++ ++int vbng_auth(vbng_dhcp4_main_t *dm, int argc, char **argv); ++ ++#endif /* _VBNG_AAA_H_ */ +diff --git a/src/plugins/vbng/vbng_all_api_h.h b/src/plugins/vbng/vbng_all_api_h.h +new file mode 100644 +index 00000000..3f744275 +--- /dev/null ++++ b/src/plugins/vbng/vbng_all_api_h.h +@@ -0,0 +1,18 @@ ++/* ++ * vbng_all_api_h.h - skeleton vpp engine plug-in api #include file ++ * ++ * Copyright (c) 2017 Intel and/or its affiliates. ++ * 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. ++ */ ++ ++#include <vbng/vbng.api.h> +diff --git a/src/plugins/vbng/vbng_api.c b/src/plugins/vbng/vbng_api.c +new file mode 100644 +index 00000000..4080f775 +--- /dev/null ++++ b/src/plugins/vbng/vbng_api.c +@@ -0,0 +1,123 @@ ++/* ++ *------------------------------------------------------------------ ++ * vbng_api.c - vbng api ++ * ++ * Copyright (c) 2017 Intel Corp and/or its affiliates. ++ * 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. ++ *------------------------------------------------------------------ ++ */ ++ ++#include <vnet/vnet.h> ++#include <vlibmemory/api.h> ++ ++#include <vnet/interface.h> ++#include <vnet/api_errno.h> ++#include <vnet/dhcp/dhcp_proxy.h> ++#include <vnet/dhcp/client.h> ++#include <vnet/fib/fib_table.h> ++ ++#include <vbng/vbng_msg_enum.h> ++ ++#define vl_typedefs /* define message structures */ ++#include <vbng/vbng_all_api_h.h> ++#undef vl_typedefs ++ ++#define vl_endianfun /* define message structures */ ++#include <vbng/vbng_all_api_h.h> ++#undef vl_endianfun ++ ++/* instantiate all the print functions we know about */ ++#define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__) ++#define vl_printfun ++#include <vbng/vbng_all_api_h.h> ++#undef vl_printfun ++ ++#include <vlibapi/api_helper_macros.h> ++ ++#define foreach_vpe_api_msg \ ++_(VBNG_DHCP4_CONFIG,vbng_dhcp4_config) ++ ++static void vl_api_vbng_dhcp4_config_t_handler ++ (vl_api_vbng_dhcp4_config_t * mp) ++{ ++ vl_api_vbng_dhcp4_config_reply_t *rmp; ++ ip46_address_t src, server; ++ int rv = -1; ++ ++ ip46_address_reset (&src); ++ ip46_address_reset (&server); ++ ++ clib_memcpy (&src.ip4, mp->local_addr, sizeof (src.ip4)); ++ clib_memcpy (&server.ip4, mp->remote_addr, sizeof (server.ip4)); ++ ++ rv = dhcp4_proxy_set_server (&server, ++ &src, ++ (u32) ntohl (mp->rx_vrf_id), ++ (u32) ntohl (mp->server_vrf_id), ++ (int) (mp->is_add == 0)); ++ ++ ++ REPLY_MACRO (VL_API_VBNG_DHCP4_CONFIG_REPLY); ++} ++ ++/* ++ * vbng_api_hookup ++ * Add vpe's API message handlers to the table. ++ * vlib has alread mapped shared memory and ++ * added the client registration handlers. ++ * See .../vlib-api/vlibmemory/memclnt_vlib.c:memclnt_process() ++ */ ++#define vl_msg_name_crc_list ++#include <vbng/vbng_all_api_h.h> ++#undef vl_msg_name_crc_list ++ ++static void ++setup_message_id_table (api_main_t * am) ++{ ++#define _(id,n,crc) vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id); ++ foreach_vl_msg_name_crc_vbng; ++#undef _ ++} ++ ++static clib_error_t * ++vbng_api_hookup (vlib_main_t * vm) ++{ ++ api_main_t *am = &api_main; ++ ++#define _(N,n) \ ++ vl_msg_api_set_handlers(VL_API_##N, #n, \ ++ vl_api_##n##_t_handler, \ ++ vl_noop_handler, \ ++ vl_api_##n##_t_endian, \ ++ vl_api_##n##_t_print, \ ++ sizeof(vl_api_##n##_t), 1); ++ foreach_vpe_api_msg; ++#undef _ ++ ++ /* ++ * Set up the (msg_name, crc, message-id) table ++ */ ++ setup_message_id_table (am); ++ ++ return 0; ++} ++ ++VLIB_API_INIT_FUNCTION (vbng_api_hookup); ++ ++/* ++ * fd.io coding-style-patch-verification: ON ++ * ++ * Local Variables: ++ * eval: (c-set-style "gnu") ++ * End: ++ */ +diff --git a/src/plugins/vbng/vbng_dhcp4.c b/src/plugins/vbng/vbng_dhcp4.c +new file mode 100644 +index 00000000..ed79df42 +--- /dev/null ++++ b/src/plugins/vbng/vbng_dhcp4.c +@@ -0,0 +1,160 @@ ++/* ++ * vbng_dhcp4.c: common dhcp v4 processing ++ * ++ * Copyright (c) 2017 Intel Corp and/or its affiliates and others. ++ * 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. ++ */ ++ ++#include <vnet/fib/fib_table.h> ++#include <vnet/mfib/mfib_table.h> ++ ++#include <vbng/vbng_dhcp4.h> ++ ++/** ++ * @brief Shard 4/6 instance of DHCP main ++ */ ++vbng_dhcp4_main_t vbng_dhcp4_main; ++ ++void ++vbng_dhcp4_walk (vbng_dhcp4_walk_fn_t fn, ++ void *ctx) ++{ ++ vbng_dhcp4_main_t *vdm = &vbng_dhcp4_main; ++ dhcp_proxy_t * server; ++ u32 server_index, i; ++ ++ vec_foreach_index (i, vdm->dhcp_server_index_by_rx_fib_index) ++ { ++ server_index = vdm->dhcp_server_index_by_rx_fib_index[i]; ++ if (~0 == server_index) ++ continue; ++ ++ server = pool_elt_at_index (vdm->dhcp4_servers, server_index); ++ ++ if (!fn(server, ctx)) ++ break; ++ } ++} ++ ++static u32 ++dhcp_proxy_server_find (dhcp_proxy_t *proxy, ++ fib_protocol_t proto, ++ ip46_address_t *addr, ++ u32 server_table_id) ++{ ++ dhcp_server_t *server; ++ u32 ii, fib_index; ++ ++ vec_foreach_index(ii, proxy->dhcp_servers) ++ { ++ server = &proxy->dhcp_servers[ii]; ++ fib_index = fib_table_find(proto, server_table_id); ++ ++ if (ip46_address_is_equal(&server->dhcp_server, ++ addr) && ++ (server->server_fib_index == fib_index)) ++ { ++ return (ii); ++ } ++ } ++ return (~0); ++} ++ ++int ++vbng_dhcp4_server_del (fib_protocol_t proto, ++ u32 rx_fib_index, ++ ip46_address_t *addr, ++ u32 server_table_id) ++{ ++ vbng_dhcp4_main_t *vdm = &vbng_dhcp4_main; ++ dhcp_proxy_t *proxy = 0; ++ ++ proxy = vbng_dhcp4_get_server(vdm, rx_fib_index); ++ ++ if (NULL != proxy) ++ { ++ dhcp_server_t *server; ++ u32 index; ++ ++ index = dhcp_proxy_server_find(proxy, proto, addr, server_table_id); ++ ++ if (~0 != index) ++ { ++ server = &proxy->dhcp_servers[index]; ++ fib_table_unlock (server->server_fib_index, proto); ++ ++ vec_del1(proxy->dhcp_servers, index); ++ ++ if (0 == vec_len(proxy->dhcp_servers)) ++ { ++ /* no servers left, delete the proxy config */ ++ vdm->dhcp_server_index_by_rx_fib_index[rx_fib_index] = ~0; ++ vec_free(proxy->dhcp_servers); ++ pool_put (vdm->dhcp4_servers, proxy); ++ return (1); ++ } ++ } ++ } ++ ++ /* the proxy still exists */ ++ return (0); ++} ++ ++int ++vbng_dhcp4_server_add (fib_protocol_t proto, ++ ip46_address_t *addr, ++ ip46_address_t *src_address, ++ u32 rx_fib_index, ++ u32 server_table_id) ++{ ++ vbng_dhcp4_main_t *vdm = &vbng_dhcp4_main; ++ dhcp_proxy_t * proxy = 0; ++ int new = 0; ++ ++ proxy = vbng_dhcp4_get_server(vdm, rx_fib_index); ++ ++ if (NULL == proxy) ++ { ++ vec_validate_init_empty(vdm->dhcp_server_index_by_rx_fib_index, ++ rx_fib_index, ++ ~0); ++ ++ pool_get (vdm->dhcp4_servers, proxy); ++ memset (proxy, 0, sizeof (*proxy)); ++ new = 1; ++ ++ vdm->dhcp_server_index_by_rx_fib_index[rx_fib_index] = ++ proxy - vdm->dhcp4_servers; ++ ++ proxy->dhcp_src_address = *src_address; ++ proxy->rx_fib_index = rx_fib_index; ++ } ++ else ++ { ++ if (~0 != dhcp_proxy_server_find(proxy, proto, addr, server_table_id)) ++ { ++ return (new); ++ } ++ } ++ ++ dhcp_server_t server = { ++ .dhcp_server = *addr, ++ .server_fib_index = fib_table_find_or_create_and_lock(proto, ++ server_table_id), ++ }; ++ ++ vec_add1(proxy->dhcp_servers, server); ++ ++ return (new); ++} ++ +diff --git a/src/plugins/vbng/vbng_dhcp4.h b/src/plugins/vbng/vbng_dhcp4.h +new file mode 100644 +index 00000000..2f41575f +--- /dev/null ++++ b/src/plugins/vbng/vbng_dhcp4.h +@@ -0,0 +1,139 @@ ++/* ++ * vbng_dhcp4.h: DHCP v4 common functions/types ++ * ++ * Copyright (c) 2017 Intel Corp and/or its affiliates and others. ++ * 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. ++ */ ++ ++#ifndef _VBNG_DHCP4_H_ ++#define _VBNG_DHCP4_H_ ++ ++#include <vnet/vnet.h> ++#include <vnet/dhcp/dhcp_proxy.h> ++#include <vnet/dhcp/dhcp4_packet.h> ++#include <vnet/ethernet/ethernet.h> ++#include <vnet/ip/ip.h> ++#include <vnet/ip/ip4.h> ++#include <vnet/ip/ip4_packet.h> ++#include <vnet/pg/pg.h> ++#include <vnet/ip/format.h> ++#include <vnet/udp/udp.h> ++ ++typedef enum { ++#define vbng_dhcp4_error(n,s) VBNG_DHCP4_ERROR_##n, ++#include <vbng/vbng_dhcp4_err.def> ++#undef vbng_dhcp4_error ++ VBNG_DHCP4_N_ERROR, ++} vbng_dhcp4_error_t; ++ ++#define VBNG_AAA_DISABLED 0 ++#define VBNG_AAA_ENABLED 1 ++ ++typedef struct { ++ int is_enabled; ++ u32 nas_port; /* AAA server port */ ++ u8 *config_file; /* Radius Client config file path */ ++} vbng_aaa_config_t; ++ ++/** ++ * @brief Global configuration for the vBNG plugin. ++ */ ++typedef struct { ++ /* Pool of DHCP servers */ ++ dhcp_proxy_t *dhcp4_servers; ++ ++ /* Pool of selected DHCP server. Zero is the default server */ ++ u32 * dhcp_server_index_by_rx_fib_index; ++ ++ /* to drop pkts in server-to-client direction */ ++ u32 error_drop_node_index; ++ ++ /* Configuration for the AAA client */ ++ vbng_aaa_config_t config; ++ ++ /* convenience */ ++ vlib_main_t * vlib_main; ++ vnet_main_t * vnet_main; ++} vbng_dhcp4_main_t; ++ ++extern vbng_dhcp4_main_t vbng_dhcp4_main; ++ ++/** ++ * @brief Add a new DHCP proxy server configuration. ++ * @return 1 is the config is new, ++ * 0 otherwise (implying a modify of an existing) ++ */ ++int vbng_dhcp4_server_add(fib_protocol_t proto, ++ ip46_address_t *addr, ++ ip46_address_t *src_address, ++ u32 rx_fib_iindex, ++ u32 server_table_id); ++ ++/** ++ * @brief Delete a DHCP proxy config ++ * @return 1 if the proxy is deleted, 0 otherwise ++ */ ++int vbng_dhcp4_server_del(fib_protocol_t proto, ++ u32 rx_fib_index, ++ ip46_address_t *addr, ++ u32 server_table_id); ++ ++u32 ++dhcp_proxy_rx_table_get_table_id (fib_protocol_t proto, ++ u32 fib_index); ++ ++/** ++ * @brief Callback function invoked for each DHCP proxy entry ++ * return 0 to break the walk, non-zero otherwise. ++ */ ++typedef int (*vbng_dhcp4_walk_fn_t)(dhcp_proxy_t *server, ++ void *ctx); ++ ++/** ++ * @brief Walk/Visit each vBNG DHCP server configurations ++ */ ++void vbng_dhcp4_walk(vbng_dhcp4_walk_fn_t fn, ++ void *ctx); ++ ++/** ++ * @brief Get the DHCP proxy server data for the FIB index ++ */ ++static inline dhcp_proxy_t * ++vbng_dhcp4_get_server(vbng_dhcp4_main_t *vm, ++ u32 rx_fib_index) ++{ ++ dhcp_proxy_t *s = NULL; ++ ++ if (vec_len(vm->dhcp_server_index_by_rx_fib_index) > rx_fib_index && ++ vm->dhcp_server_index_by_rx_fib_index[rx_fib_index] != ~0) ++ { ++ s = pool_elt_at_index ( ++ vm->dhcp4_servers, ++ vm->dhcp_server_index_by_rx_fib_index[rx_fib_index]); ++ } ++ ++ return (s); ++} ++ ++int vbng_dhcp4_set_server(ip46_address_t *addr, ++ ip46_address_t *src_addr, ++ u32 rx_table_id, ++ u32 server_table_id, ++ int is_del); ++ ++#define DHCP_PACKET_OPTION_82 82 ++#define DHCP_PACKET_OPTION82_SUB1 1 ++#define DHCP_PACKET_OPTION82_SUB2 2 ++#define DHCP_PACKET_OPTION82_SUB5 5 ++ ++#endif /* _VBNG_DHCP4_H_ */ +diff --git a/src/plugins/vbng/vbng_dhcp4_err.def b/src/plugins/vbng/vbng_dhcp4_err.def +new file mode 100644 +index 00000000..23f2d0d2 +--- /dev/null ++++ b/src/plugins/vbng/vbng_dhcp4_err.def +@@ -0,0 +1,29 @@ ++/* ++ * vbng_dhcp4_err.def: VBNG DHCP4 Errors ++ * ++ * Copyright (c) 2017 Intel Corp and/or its affiliates and others. ++ * 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. ++ */ ++ ++vbng_dhcp4_error (NONE, "no error") ++vbng_dhcp4_error (NO_SERVER, "no dhcp server configured") ++vbng_dhcp4_error (RELAY_TO_SERVER, "DHCP packets relayed to the server") ++vbng_dhcp4_error (RELAY_TO_CLIENT, "DHCP packets relayed to clients") ++vbng_dhcp4_error (NO_INTERFACE_ADDRESS, "DHCP no interface address") ++vbng_dhcp4_error (BAD_YIADDR, "DHCP packets with bad your_ip_address fields") ++vbng_dhcp4_error (BAD_SVR_FIB_OR_ADDRESS, "DHCP packets not from DHCP server or server FIB.") ++vbng_dhcp4_error (PKT_TOO_BIG, "DHCP packets which are too big.") ++vbng_dhcp4_error (AAA_FAILURE, "DHCP packets failed to pass the AAA check.") ++vbng_dhcp4_error (NO_OPTION_82, "DHCP option 82 missing") ++vbng_dhcp4_error (BAD_OPTION_82_ITF, "Bad DHCP option 82 interface value") ++vbng_dhcp4_error (BAD_OPTION_82_ADDR, "Bad DHCP option 82 address value") +diff --git a/src/plugins/vbng/vbng_dhcp4_node.c b/src/plugins/vbng/vbng_dhcp4_node.c +new file mode 100644 +index 00000000..205959bf +--- /dev/null ++++ b/src/plugins/vbng/vbng_dhcp4_node.c +@@ -0,0 +1,1024 @@ ++/* ++ * proxy_node.c: dhcp proxy node processing ++ * ++ * Copyright (c) 2013 Cisco and/or its affiliates and others. ++ * 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. ++ */ ++ ++#include <vlib/vlib.h> ++#include <vnet/pg/pg.h> ++#include <vnet/fib/ip4_fib.h> ++#include <vnet/dhcp/client.h> ++#include <vnet/plugin/plugin.h> ++#include <vpp/app/version.h> ++ ++#include <vbng/vbng_dhcp4.h> ++#include <vbng/vbng_aaa.h> ++ ++static char * vbng_dhcp4_error_strings[] = { ++#define vbng_dhcp4_error(n,s) s, ++#include <vbng/vbng_dhcp4_err.def> ++#undef vbng_dhcp4_error ++}; ++ ++#define foreach_vbng_dhcp4_to_server_input_next \ ++ _ (DROP, "error-drop") \ ++ _ (LOOKUP, "ip4-lookup") \ ++ _ (SEND_TO_CLIENT, "vbng-dhcp-to-client") ++ ++typedef enum { ++#define _(s,n) VBNG_DHCP4_TO_SERVER_INPUT_NEXT_##s, ++ foreach_vbng_dhcp4_to_server_input_next ++#undef _ ++ VBNG_DHCP4_TO_SERVER_INPUT_N_NEXT, ++} vbng_dhcp4_to_server_input_next_t; ++ ++typedef struct { ++ /* 0 => to server, 1 => to client */ ++ int which; ++ ip4_address_t trace_ip4_address; ++ u32 error; ++ u32 sw_if_index; ++ u32 original_sw_if_index; ++} dhcp_proxy_trace_t; ++ ++#define VPP_DHCP_OPTION82_SUB1_SIZE 6 ++#define VPP_DHCP_OPTION82_SUB5_SIZE 6 ++#define VPP_DHCP_OPTION82_VSS_SIZE 12 ++#define VPP_DHCP_OPTION82_SIZE (VPP_DHCP_OPTION82_SUB1_SIZE + \ ++ VPP_DHCP_OPTION82_SUB5_SIZE + \ ++ VPP_DHCP_OPTION82_VSS_SIZE +3) ++ ++static vlib_node_registration_t vbng_dhcp4_to_server_node; ++static vlib_node_registration_t vbng_dhcp4_to_client_node; ++ ++static u8 * ++format_dhcp_proxy_trace (u8 * s, va_list * args) ++{ ++ CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *); ++ CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *); ++ dhcp_proxy_trace_t * t = va_arg (*args, dhcp_proxy_trace_t *); ++ ++ if (t->which == 0) ++ s = format (s, "DHCP proxy: sent to server %U\n", ++ format_ip4_address, &t->trace_ip4_address, t->error); ++ else ++ s = format (s, "DHCP proxy: broadcast to client from %U\n", ++ format_ip4_address, &t->trace_ip4_address); ++ ++ if (t->error != (u32)~0) ++ s = format (s, " error: %s\n", vbng_dhcp4_error_strings[t->error]); ++ ++ s = format (s, " original_sw_if_index: %d, sw_if_index: %d\n", ++ t->original_sw_if_index, t->sw_if_index); ++ ++ return s; ++} ++ ++static u8 * ++format_dhcp_proxy_header_with_length (u8 * s, va_list * args) ++{ ++ dhcp_header_t * h = va_arg (*args, dhcp_header_t *); ++ u32 max_header_bytes = va_arg (*args, u32); ++ u32 header_bytes; ++ ++ header_bytes = sizeof (h[0]); ++ if (max_header_bytes != 0 && header_bytes > max_header_bytes) ++ return format (s, "dhcp header truncated"); ++ ++ s = format (s, "DHCP Proxy"); ++ ++ return s; ++} ++ ++static uword ++vbng_dhcp_to_server_input (vlib_main_t * vm, ++ vlib_node_runtime_t * node, ++ vlib_frame_t * from_frame) ++{ ++ u32 n_left_from, next_index, * from, * to_next; ++ vbng_dhcp4_main_t *dm = &vbng_dhcp4_main; ++ from = vlib_frame_vector_args (from_frame); ++ n_left_from = from_frame->n_vectors; ++ u32 pkts_to_server=0, pkts_to_client=0, pkts_no_server=0; ++ u32 pkts_no_interface_address=0; ++ u32 pkts_too_big=0, pkts_aaa_fail = 0; ++ ip4_main_t * im = &ip4_main; ++ ++ next_index = node->cached_next_index; ++ ++ while (n_left_from > 0) ++ { ++ u32 n_left_to_next; ++ ++ vlib_get_next_frame (vm, node, next_index, ++ to_next, n_left_to_next); ++ ++ while (n_left_from > 0 && n_left_to_next > 0) ++ { ++ u32 bi0; ++ vlib_buffer_t * b0; ++ udp_header_t * u0; ++ dhcp_header_t * h0; ++ ip4_header_t * ip0; ++ u32 next0; ++ u32 old0, new0; ++ ip_csum_t sum0; ++ u32 error0 = (u32) ~0; ++ u32 sw_if_index = 0; ++ u32 original_sw_if_index = 0; ++ u8 *end = NULL; ++ u32 fib_index; ++ dhcp_proxy_t *proxy; ++ dhcp_server_t *server; ++ u32 rx_sw_if_index; ++ dhcp_option_t *o; ++ u32 len = 0; ++ vlib_buffer_free_list_t *fl; ++ u8 is_discover = 0; ++ ++ bi0 = from[0]; ++ from += 1; ++ n_left_from -= 1; ++ ++ b0 = vlib_get_buffer (vm, bi0); ++ ++ h0 = vlib_buffer_get_current (b0); ++ ++ /* ++ * udp_local hands us the DHCP header, need udp hdr, ++ * ip hdr to relay to server ++ */ ++ vlib_buffer_advance (b0, -(sizeof(*u0))); ++ u0 = vlib_buffer_get_current (b0); ++ ++ /* This blows. Return traffic has src_port = 67, dst_port = 67 */ ++ if (u0->src_port == clib_net_to_host_u16(UDP_DST_PORT_dhcp_to_server)) ++ { ++ vlib_buffer_advance (b0, sizeof(*u0)); ++ next0 = VBNG_DHCP4_TO_SERVER_INPUT_NEXT_SEND_TO_CLIENT; ++ error0 = 0; ++ pkts_to_client++; ++ goto do_enqueue; ++ } ++ ++ rx_sw_if_index = vnet_buffer(b0)->sw_if_index[VLIB_RX]; ++ ++ fib_index = im->fib_index_by_sw_if_index [rx_sw_if_index]; ++ proxy = vbng_dhcp4_get_server(dm, fib_index); ++ ++ if (PREDICT_FALSE (NULL == proxy)) ++ { ++ error0 = VBNG_DHCP4_ERROR_NO_SERVER; ++ next0 = VBNG_DHCP4_TO_SERVER_INPUT_NEXT_DROP; ++ pkts_no_server++; ++ goto do_trace; ++ } ++ ++ server = &proxy->dhcp_servers[0]; ++ vlib_buffer_advance (b0, -(sizeof(*ip0))); ++ ip0 = vlib_buffer_get_current (b0); ++ ++ /* disable UDP checksum */ ++ u0->checksum = 0; ++ sum0 = ip0->checksum; ++ old0 = ip0->dst_address.as_u32; ++ new0 = server->dhcp_server.ip4.as_u32; ++ ip0->dst_address.as_u32 = server->dhcp_server.ip4.as_u32; ++ sum0 = ip_csum_update (sum0, old0, new0, ++ ip4_header_t /* structure */, ++ dst_address /* changed member */); ++ ip0->checksum = ip_csum_fold (sum0); ++ ++ sum0 = ip0->checksum; ++ old0 = ip0->src_address.as_u32; ++ new0 = proxy->dhcp_src_address.ip4.as_u32; ++ ip0->src_address.as_u32 = new0; ++ sum0 = ip_csum_update (sum0, old0, new0, ++ ip4_header_t /* structure */, ++ src_address /* changed member */); ++ ip0->checksum = ip_csum_fold (sum0); ++ ++ /* Send to DHCP server via the configured FIB */ ++ vnet_buffer(b0)->sw_if_index[VLIB_TX] = ++ server->server_fib_index; ++ ++ h0->gateway_ip_address.as_u32 = proxy->dhcp_src_address.ip4.as_u32; ++ pkts_to_server++; ++ ++ o = (dhcp_option_t *) h0->options; ++ ++ fib_index = im->fib_index_by_sw_if_index ++ [vnet_buffer(b0)->sw_if_index[VLIB_RX]]; ++ ++ end = b0->data + b0->current_data + b0->current_length; ++ /* TLVs are not performance-friendly... */ ++ while (o->option != 0xFF /* end of options */ && (u8 *)o < end) ++ { ++ if (DHCP_PACKET_OPTION_MSG_TYPE == o->option) ++ { ++ if (DHCP_PACKET_DISCOVER == o->data[0]) ++ { ++ is_discover = 1; ++ } ++ } ++ ++ if (DHCP_PACKET_OPTION_82 == o->option) { ++ /* For Demo purpose only */ ++ if (dm->config.is_enabled) { ++ int i = 0, num_kvs = 0, retval = 0; ++ char *kv_pairs[1]; ++ char key_string[32]; ++ ++ if (DHCP_PACKET_OPTION82_SUB1 == o->data[0]) { ++ sprintf(key_string, STR_TPL_ATTR_DHCP_AGENT_CIRCUIT_ID, o->data[2]); ++ for (i = 1; i < o->data[1]; i++) { ++ sprintf(key_string, "%s%c", key_string, o->data[2 + i]); ++ } ++ } ++ ++ if (DHCP_PACKET_OPTION82_SUB2 == o->data[0]) { ++ sprintf(key_string, STR_TPL_ATTR_DHCP_AGENT_REMOTE_ID, o->data[2]); ++ for (i = 1; i < o->data[1]; i++) { ++ sprintf(key_string, "%s%c", key_string, o->data[2 + i]); ++ } ++ } ++ ++ kv_pairs[num_kvs] = key_string; ++ num_kvs++; ++ ++ retval = vbng_auth(dm, num_kvs, kv_pairs); ++ if (retval) { ++ if (retval == 1 /* TIMEOUT_RC */) { ++ dm->config.is_enabled = VBNG_AAA_DISABLED; ++ } ++ error0 = VBNG_DHCP4_ERROR_AAA_FAILURE; ++ next0 = VBNG_DHCP4_TO_SERVER_INPUT_NEXT_DROP; ++ pkts_aaa_fail++; ++ goto do_trace; ++ } ++ } ++ ++ fl = vlib_buffer_get_free_list (vm, b0->free_list_index); ++ if (((u8 *)o - (u8 *)b0->data + (VPP_DHCP_OPTION82_SUB1_SIZE + VPP_DHCP_OPTION82_SUB5_SIZE)) ++ > fl->n_data_bytes) ++ { ++ next0 = VBNG_DHCP4_TO_SERVER_INPUT_NEXT_DROP; ++ pkts_too_big++; ++ goto do_trace; ++ } ++ ++ /* Begin to appending new sub-options */ ++ { ++ vnet_main_t *vnm = vnet_get_main(); ++ u16 old_l0, new_l0, orig_len = 0; ++ ip4_address_t _ia0, * ia0 = &_ia0; ++ vnet_sw_interface_t *swif; ++ sw_if_index = 0; ++ original_sw_if_index = 0; ++ ++ original_sw_if_index = sw_if_index = ++ vnet_buffer(b0)->sw_if_index[VLIB_RX]; ++ swif = vnet_get_sw_interface (vnm, sw_if_index); ++ if (swif->flags & VNET_SW_INTERFACE_FLAG_UNNUMBERED) ++ sw_if_index = swif->unnumbered_sw_if_index; ++ ++ /* ++ * Get the first ip4 address on the [client-side] ++ * RX interface, if not unnumbered. otherwise use ++ * the loopback interface's ip address. ++ */ ++ ia0 = ip4_interface_first_address(&ip4_main, sw_if_index, 0); ++ ++ if (ia0 == 0) ++ { ++ error0 = VBNG_DHCP4_ERROR_NO_INTERFACE_ADDRESS; ++ next0 = VBNG_DHCP4_TO_SERVER_INPUT_NEXT_DROP; ++ pkts_no_interface_address++; ++ goto do_trace; ++ } ++ ++ orig_len = o->length; ++ o->data[orig_len + 0] = 1; /* suboption 1, circuit ID (=FIB id) */ ++ o->data[orig_len + 1] = 4; /* length of suboption */ ++ o->data[orig_len + 2] = (original_sw_if_index >> 24) & 0xFF; ++ o->data[orig_len + 3] = (original_sw_if_index >> 16) & 0xFF; ++ o->data[orig_len + 4] = (original_sw_if_index >> 8) & 0xFF; ++ o->data[orig_len + 5] = (original_sw_if_index >> 0) & 0xFF; ++ o->data[orig_len + 6] = 5; /* suboption 5 (client RX intfc address) */ ++ o->data[orig_len + 7] = 4; /* length 4 */ ++ o->data[orig_len + 8] = ia0->as_u8[0]; ++ o->data[orig_len + 9] = ia0->as_u8[1]; ++ o->data[orig_len + 10] = ia0->as_u8[2]; ++ o->data[orig_len + 11] = ia0->as_u8[3]; ++ o->data[orig_len + 12] = 0xFF; ++ o->length += 12; /* 12 octets appended*/ ++ ++ len = o->length + 3; ++ b0->current_length += len; ++ /* Fix IP header length and checksum */ ++ old_l0 = ip0->length; ++ new_l0 = clib_net_to_host_u16 (old_l0); ++ new_l0 += len; ++ new_l0 = clib_host_to_net_u16 (new_l0); ++ ip0->length = new_l0; ++ sum0 = ip0->checksum; ++ sum0 = ip_csum_update (sum0, old_l0, new_l0, ip4_header_t, ++ length /* changed member */); ++ ip0->checksum = ip_csum_fold (sum0); ++ ++ /* Fix UDP length */ ++ new_l0 = clib_net_to_host_u16 (u0->length); ++ new_l0 += len; ++ u0->length = clib_host_to_net_u16 (new_l0); ++ } ++ } ++ ++ o = (dhcp_option_t *) (((uword) o) + (o->length + 2)); ++ } ++ ++ next0 = VBNG_DHCP4_TO_SERVER_INPUT_NEXT_LOOKUP; ++ ++ /* ++ * If we have multiple servers configured and this is the ++ * client's discover message, then send copies to each of ++ * those servers ++ */ ++ if (is_discover && vec_len(proxy->dhcp_servers) > 1) ++ { ++ u32 ii; ++ ++ for (ii = 1; ii < vec_len(proxy->dhcp_servers); ii++) ++ { ++ vlib_buffer_t *c0; ++ u32 ci0; ++ ++ c0 = vlib_buffer_copy(vm, b0); ++ ci0 = vlib_get_buffer_index(vm, c0); ++ server = &proxy->dhcp_servers[ii]; ++ ++ ip0 = vlib_buffer_get_current (c0); ++ ++ sum0 = ip0->checksum; ++ old0 = ip0->dst_address.as_u32; ++ new0 = server->dhcp_server.ip4.as_u32; ++ ip0->dst_address.as_u32 = server->dhcp_server.ip4.as_u32; ++ sum0 = ip_csum_update (sum0, old0, new0, ++ ip4_header_t /* structure */, ++ dst_address /* changed member */); ++ ip0->checksum = ip_csum_fold (sum0); ++ ++ to_next[0] = ci0; ++ to_next += 1; ++ n_left_to_next -= 1; ++ ++ vlib_validate_buffer_enqueue_x1 (vm, node, next_index, ++ to_next, n_left_to_next, ++ ci0, next0); ++ ++ if (PREDICT_FALSE(b0->flags & VLIB_BUFFER_IS_TRACED)) ++ { ++ dhcp_proxy_trace_t *tr; ++ ++ tr = vlib_add_trace (vm, node, c0, sizeof (*tr)); ++ tr->which = 0; /* to server */ ++ tr->error = error0; ++ tr->original_sw_if_index = original_sw_if_index; ++ tr->sw_if_index = sw_if_index; ++ if (next0 == VBNG_DHCP4_TO_SERVER_INPUT_NEXT_LOOKUP) ++ tr->trace_ip4_address.as_u32 = server->dhcp_server.ip4.as_u32; ++ } ++ ++ if (PREDICT_FALSE(0 == n_left_to_next)) ++ { ++ vlib_put_next_frame (vm, node, next_index, ++ n_left_to_next); ++ vlib_get_next_frame (vm, node, next_index, ++ to_next, n_left_to_next); ++ } ++ } ++ } ++ do_trace: ++ if (PREDICT_FALSE(b0->flags & VLIB_BUFFER_IS_TRACED)) ++ { ++ dhcp_proxy_trace_t *tr = vlib_add_trace (vm, node, ++ b0, sizeof (*tr)); ++ tr->which = 0; /* to server */ ++ tr->error = error0; ++ tr->original_sw_if_index = original_sw_if_index; ++ tr->sw_if_index = sw_if_index; ++ if (next0 == VBNG_DHCP4_TO_SERVER_INPUT_NEXT_LOOKUP) ++ tr->trace_ip4_address.as_u32 = ++ proxy->dhcp_servers[0].dhcp_server.ip4.as_u32; ++ } ++ ++ do_enqueue: ++ to_next[0] = bi0; ++ to_next += 1; ++ n_left_to_next -= 1; ++ ++ vlib_validate_buffer_enqueue_x1 (vm, node, next_index, ++ to_next, n_left_to_next, ++ bi0, next0); ++ } ++ ++ vlib_put_next_frame (vm, node, next_index, n_left_to_next); ++ } ++ ++ vlib_node_increment_counter (vm, vbng_dhcp4_to_server_node.index, ++ VBNG_DHCP4_ERROR_RELAY_TO_CLIENT, ++ pkts_to_client); ++ vlib_node_increment_counter (vm, vbng_dhcp4_to_server_node.index, ++ VBNG_DHCP4_ERROR_RELAY_TO_SERVER, ++ pkts_to_server); ++ vlib_node_increment_counter (vm, vbng_dhcp4_to_server_node.index, ++ VBNG_DHCP4_ERROR_NO_SERVER, ++ pkts_no_server); ++ vlib_node_increment_counter (vm, vbng_dhcp4_to_server_node.index, ++ VBNG_DHCP4_ERROR_NO_INTERFACE_ADDRESS, ++ pkts_no_interface_address); ++ vlib_node_increment_counter (vm, vbng_dhcp4_to_server_node.index, ++ VBNG_DHCP4_ERROR_PKT_TOO_BIG, ++ pkts_too_big); ++ vlib_node_increment_counter (vm, vbng_dhcp4_to_server_node.index, ++ VBNG_DHCP4_ERROR_AAA_FAILURE, ++ pkts_aaa_fail); ++ return from_frame->n_vectors; ++} ++ ++VLIB_REGISTER_NODE (vbng_dhcp4_to_server_node, static) = { ++ .function = vbng_dhcp_to_server_input, ++ .name = "vbng-dhcp-to-server", ++ /* Takes a vector of packets. */ ++ .vector_size = sizeof (u32), ++ ++ .n_errors = VBNG_DHCP4_N_ERROR, ++ .error_strings = vbng_dhcp4_error_strings, ++ ++ .n_next_nodes = VBNG_DHCP4_TO_SERVER_INPUT_N_NEXT, ++ .next_nodes = { ++#define _(s,n) [VBNG_DHCP4_TO_SERVER_INPUT_NEXT_##s] = n, ++ foreach_vbng_dhcp4_to_server_input_next ++#undef _ ++ }, ++ ++ .format_buffer = format_dhcp_proxy_header_with_length, ++ .format_trace = format_dhcp_proxy_trace, ++}; ++ ++static uword ++vbng_dhcp_to_client_input (vlib_main_t * vm, ++ vlib_node_runtime_t * node, ++ vlib_frame_t * from_frame) ++{ ++ u32 n_left_from, * from; ++ ethernet_main_t *em = ethernet_get_main (vm); ++ vbng_dhcp4_main_t *dm = &vbng_dhcp4_main; ++ vnet_main_t * vnm = vnet_get_main(); ++ ip4_main_t * im = &ip4_main; ++ ++ from = vlib_frame_vector_args (from_frame); ++ n_left_from = from_frame->n_vectors; ++ ++ while (n_left_from > 0) ++ { ++ u32 bi0; ++ vlib_buffer_t * b0; ++ udp_header_t * u0; ++ dhcp_header_t * h0; ++ ip4_header_t * ip0 = 0; ++ ip4_address_t * ia0 = 0; ++ u32 old0, new0; ++ ip_csum_t sum0; ++ ethernet_interface_t *ei0; ++ ethernet_header_t *mac0; ++ vnet_hw_interface_t *hi0; ++ vlib_frame_t *f0; ++ u32 * to_next0; ++ u32 sw_if_index = ~0; ++ vnet_sw_interface_t *si0; ++ u32 error0 = (u32)~0; ++ vnet_sw_interface_t *swif; ++ u32 fib_index; ++ dhcp_proxy_t *proxy; ++ dhcp_server_t *server; ++ u32 original_sw_if_index = (u32) ~0; ++ ip4_address_t relay_addr = { ++ .as_u32 = 0, ++ }; ++ ++ bi0 = from[0]; ++ from += 1; ++ n_left_from -= 1; ++ ++ b0 = vlib_get_buffer (vm, bi0); ++ h0 = vlib_buffer_get_current (b0); ++ ++ /* ++ * udp_local hands us the DHCP header, need udp hdr, ++ * ip hdr to relay to client ++ */ ++ vlib_buffer_advance (b0, -(sizeof(*u0))); ++ u0 = vlib_buffer_get_current (b0); ++ ++ vlib_buffer_advance (b0, -(sizeof(*ip0))); ++ ip0 = vlib_buffer_get_current (b0); ++ ++ { ++ dhcp_option_t *o = (dhcp_option_t *) h0->options; ++ dhcp_option_t *sub; ++ ++ /* Parse through TLVs looking for option 82. ++ The circuit-ID is the FIB number we need ++ to track down the client-facing interface */ ++ ++ while (o->option != 0xFF /* end of options */ && ++ (u8 *) o < (b0->data + b0->current_data + b0->current_length)) ++ { ++ if (o->option == 82) ++ { ++ sub = (dhcp_option_t *) &o->data[0]; ++ while (sub->option != 0xFF /* end of options */ && ++ (u8 *) sub < (u8 *)(o + o->length)) { ++ /* If this is one of ours, it will have ++ total length 12, circuit-id suboption type, ++ and the sw_if_index */ ++ if (sub->option == 1 && sub->length == 4) ++ { ++ sw_if_index = ((sub->data[0] << 24) | ++ (sub->data[1] << 16) | ++ (sub->data[2] << 8) | ++ (sub->data[3])); ++ } ++ else if (sub->option == 5 && sub->length == 4) ++ { ++ relay_addr.as_u8[0] = sub->data[0]; ++ relay_addr.as_u8[1] = sub->data[1]; ++ relay_addr.as_u8[2] = sub->data[2]; ++ relay_addr.as_u8[3] = sub->data[3]; ++ } ++ sub = (dhcp_option_t *) ++ (((uword) sub) + (sub->length + 2)); ++ } ++ ++ } ++ o = (dhcp_option_t *) (((uword) o) + (o->length + 2)); ++ } ++ } ++ ++ if (sw_if_index == (u32)~0) ++ { ++ error0 = VBNG_DHCP4_ERROR_NO_OPTION_82; ++ ++ drop_packet: ++ vlib_node_increment_counter (vm, vbng_dhcp4_to_client_node.index, ++ error0, 1); ++ f0 = vlib_get_frame_to_node (vm, dm->error_drop_node_index); ++ to_next0 = vlib_frame_vector_args (f0); ++ to_next0[0] = bi0; ++ f0->n_vectors = 1; ++ vlib_put_frame_to_node (vm, dm->error_drop_node_index, f0); ++ goto do_trace; ++ } ++ ++ if (relay_addr.as_u32 == 0) ++ { ++ error0 = VBNG_DHCP4_ERROR_BAD_OPTION_82_ADDR; ++ goto drop_packet; ++ } ++ ++ if (sw_if_index >= vec_len (im->fib_index_by_sw_if_index)) ++ { ++ error0 = VBNG_DHCP4_ERROR_BAD_OPTION_82_ITF; ++ goto drop_packet; ++ } ++ ++ fib_index = im->fib_index_by_sw_if_index [sw_if_index]; ++ proxy = vbng_dhcp4_get_server(dm, fib_index); ++ ++ if (PREDICT_FALSE (NULL == proxy)) ++ { ++ error0 = VBNG_DHCP4_ERROR_NO_SERVER; ++ goto drop_packet; ++ } ++ ++ vec_foreach(server, proxy->dhcp_servers) ++ { ++ if (ip0->src_address.as_u32 == server->dhcp_server.ip4.as_u32) ++ { ++ goto server_found; ++ } ++ } ++ ++ error0 = VBNG_DHCP4_ERROR_BAD_SVR_FIB_OR_ADDRESS; ++ goto drop_packet; ++ ++ server_found: ++ vnet_buffer (b0)->sw_if_index[VLIB_TX] = sw_if_index; ++ ++ swif = vnet_get_sw_interface (vnm, sw_if_index); ++ original_sw_if_index = sw_if_index; ++ if (swif->flags & VNET_SW_INTERFACE_FLAG_UNNUMBERED) ++ sw_if_index = swif->unnumbered_sw_if_index; ++ ++ ia0 = ip4_interface_first_address (&ip4_main, sw_if_index, 0); ++ if (ia0 == 0) ++ { ++ error0 = VBNG_DHCP4_ERROR_NO_INTERFACE_ADDRESS; ++ goto drop_packet; ++ } ++ ++ if (relay_addr.as_u32 != ia0->as_u32) ++ { ++ error0 = VBNG_DHCP4_ERROR_BAD_YIADDR; ++ goto drop_packet; ++ } ++ ++ u0->checksum = 0; ++ u0->dst_port = clib_net_to_host_u16 (UDP_DST_PORT_dhcp_to_client); ++ sum0 = ip0->checksum; ++ old0 = ip0->dst_address.as_u32; ++ new0 = 0xFFFFFFFF; ++ ip0->dst_address.as_u32 = new0; ++ sum0 = ip_csum_update (sum0, old0, new0, ++ ip4_header_t /* structure */, ++ dst_address /* offset of changed member */); ++ ip0->checksum = ip_csum_fold (sum0); ++ ++ sum0 = ip0->checksum; ++ old0 = ip0->src_address.as_u32; ++ new0 = ia0->as_u32; ++ ip0->src_address.as_u32 = new0; ++ sum0 = ip_csum_update (sum0, old0, new0, ++ ip4_header_t /* structure */, ++ src_address /* offset of changed member */); ++ ip0->checksum = ip_csum_fold (sum0); ++ ++ vlib_buffer_advance (b0, -(sizeof(ethernet_header_t))); ++ si0 = vnet_get_sw_interface (vnm, original_sw_if_index); ++ if (si0->type == VNET_SW_INTERFACE_TYPE_SUB) ++ vlib_buffer_advance (b0, -4 /* space for VLAN tag */); ++ ++ mac0 = vlib_buffer_get_current (b0); ++ ++ hi0 = vnet_get_sup_hw_interface (vnm, original_sw_if_index); ++ ei0 = pool_elt_at_index (em->interfaces, hi0->hw_instance); ++ clib_memcpy (mac0->src_address, ei0->address, sizeof (ei0->address)); ++ memset (mac0->dst_address, 0xff, sizeof (mac0->dst_address)); ++ mac0->type = (si0->type == VNET_SW_INTERFACE_TYPE_SUB) ? ++ clib_net_to_host_u16(0x8100) : clib_net_to_host_u16 (0x0800); ++ ++ if (si0->type == VNET_SW_INTERFACE_TYPE_SUB) ++ { ++ u32 * vlan_tag = (u32 *)(mac0+1); ++ u32 tmp; ++ tmp = (si0->sub.id << 16) | 0x0800; ++ *vlan_tag = clib_host_to_net_u32 (tmp); ++ } ++ ++ /* $$$ This needs to be rewritten, for sure */ ++ f0 = vlib_get_frame_to_node (vm, hi0->output_node_index); ++ to_next0 = vlib_frame_vector_args (f0); ++ to_next0[0] = bi0; ++ f0->n_vectors = 1; ++ vlib_put_frame_to_node (vm, hi0->output_node_index, f0); ++ ++ do_trace: ++ if (PREDICT_FALSE(b0->flags & VLIB_BUFFER_IS_TRACED)) ++ { ++ dhcp_proxy_trace_t *tr = vlib_add_trace (vm, node, ++ b0, sizeof (*tr)); ++ tr->which = 1; /* to client */ ++ tr->trace_ip4_address.as_u32 = ia0 ? ia0->as_u32 : 0; ++ tr->error = error0; ++ tr->original_sw_if_index = original_sw_if_index; ++ tr->sw_if_index = sw_if_index; ++ } ++ } ++ return from_frame->n_vectors; ++} ++ ++VLIB_REGISTER_NODE (vbng_dhcp4_to_client_node, static) = { ++ .function = vbng_dhcp_to_client_input, ++ .name = "vbng-dhcp-to-client", ++ /* Takes a vector of packets. */ ++ .vector_size = sizeof (u32), ++ ++ .n_errors = VBNG_DHCP4_N_ERROR, ++ .error_strings = vbng_dhcp4_error_strings, ++ .format_buffer = format_dhcp_proxy_header_with_length, ++ .format_trace = format_dhcp_proxy_trace, ++}; ++ ++static clib_error_t * ++vbng_dhcp4_proxy_init (vlib_main_t * vm) ++{ ++ vbng_dhcp4_main_t *dm = &vbng_dhcp4_main; ++ vlib_node_t * error_drop_node; ++ ++ error_drop_node = vlib_get_node_by_name (vm, (u8 *) "error-drop"); ++ dm->error_drop_node_index = error_drop_node->index; ++ ++ udp_register_dst_port (vm, UDP_DST_PORT_dhcp_to_client, ++ vbng_dhcp4_to_client_node.index, 1 /* is_ip4 */); ++ ++ udp_register_dst_port (vm, UDP_DST_PORT_dhcp_to_server, ++ vbng_dhcp4_to_server_node.index, 1 /* is_ip4 */); ++ ++ dm->vlib_main = vm; ++ dm->vnet_main = vnet_get_main(); ++ ++ return 0; ++} ++ ++/* *INDENT-OFF* */ ++VLIB_INIT_FUNCTION (vbng_dhcp4_proxy_init); ++/* *INDENT-ON* */ ++ ++int ++vbng_dhcp4_set_server (ip46_address_t *addr, ++ ip46_address_t *src_addr, ++ u32 rx_table_id, ++ u32 server_table_id, ++ int is_del) ++{ ++ u32 rx_fib_index = 0; ++ int rc = 0; ++ ++ const fib_prefix_t all_1s = ++ { ++ .fp_len = 32, ++ .fp_addr.ip4.as_u32 = 0xffffffff, ++ .fp_proto = FIB_PROTOCOL_IP4, ++ }; ++ ++ if (ip46_address_is_zero(addr)) ++ return VNET_API_ERROR_INVALID_DST_ADDRESS; ++ ++ if (ip46_address_is_zero(src_addr)) ++ return VNET_API_ERROR_INVALID_SRC_ADDRESS; ++ ++ rx_fib_index = fib_table_find_or_create_and_lock(FIB_PROTOCOL_IP4, ++ rx_table_id); ++ ++ if (is_del) ++ { ++ if (vbng_dhcp4_server_del (FIB_PROTOCOL_IP4, rx_fib_index, ++ addr, server_table_id)) ++ { ++ fib_table_entry_special_remove(rx_fib_index, ++ &all_1s, ++ FIB_SOURCE_DHCP); ++ fib_table_unlock (rx_fib_index, FIB_PROTOCOL_IP4); ++ } ++ } ++ else ++ { ++ if (vbng_dhcp4_server_add (FIB_PROTOCOL_IP4, ++ addr, src_addr, ++ rx_fib_index, server_table_id)) ++ { ++ fib_table_entry_special_add(rx_fib_index, ++ &all_1s, ++ FIB_SOURCE_DHCP, ++ FIB_ENTRY_FLAG_LOCAL); ++ fib_table_lock (rx_fib_index, FIB_PROTOCOL_IP4); ++ } ++ } ++ fib_table_unlock (rx_fib_index, FIB_PROTOCOL_IP4); ++ ++ return (rc); ++} ++ ++static clib_error_t * ++dhcp4_proxy_set_command_fn (vlib_main_t * vm, ++ unformat_input_t * input, ++ vlib_cli_command_t * cmd) ++{ ++ ip46_address_t server_addr, src_addr; ++ u32 server_table_id = 0, rx_table_id = 0; ++ int is_del = 0; ++ int set_src = 0, set_server = 0; ++ ++ memset(&server_addr, 0, sizeof(server_addr)); ++ memset(&src_addr, 0, sizeof(src_addr)); ++ ++ while (unformat_check_input(input) != UNFORMAT_END_OF_INPUT) ++ { ++ if (unformat (input, "remote %U", ++ unformat_ip4_address, &server_addr.ip4)) ++ set_server = 1; ++ else if (unformat (input, "server-fib-id %d", &server_table_id)) ++ ; ++ else if (unformat (input, "rx-fib-id %d", &rx_table_id)) ++ ; ++ else if (unformat(input, "local %U", ++ unformat_ip4_address, &src_addr.ip4)) ++ set_src = 1; ++ else if (unformat (input, "delete") || ++ unformat (input, "del")) ++ is_del = 1; ++ else ++ break; ++ } ++ ++ if (is_del || (set_server && set_src)) ++ { ++ int rv; ++ ++ rv = vbng_dhcp4_set_server (&server_addr, &src_addr, rx_table_id, ++ server_table_id, is_del); ++ switch (rv) ++ { ++ case 0: ++ return 0; ++ ++ case VNET_API_ERROR_INVALID_DST_ADDRESS: ++ return clib_error_return (0, "Invalid remote address"); ++ ++ case VNET_API_ERROR_INVALID_SRC_ADDRESS: ++ return clib_error_return (0, "Invalid local address"); ++ ++ case VNET_API_ERROR_NO_SUCH_ENTRY: ++ return clib_error_return ++ (0, "Fib id %d: no per-fib DHCP server configured", rx_table_id); ++ ++ default: ++ return clib_error_return (0, "BUG: rv %d", rv); ++ } ++ } ++ else ++ return clib_error_return (0, "parse error`%U'", ++ format_unformat_error, input); ++} ++ ++VLIB_CLI_COMMAND (vbng_dhcp4_set_command, static) = { ++ .path = "set vbng dhcp4", ++ .short_help = "set vbng dhcp4 [del] remote <ip-addr> local <ip-addr> [server-fib-id <n>] [rx-fib-id <n>]", ++ .function = dhcp4_proxy_set_command_fn, ++}; ++ ++static u8 * ++format_dhcp4_proxy_server (u8 * s, va_list * args) ++{ ++ dhcp_proxy_t *proxy = va_arg (*args, dhcp_proxy_t *); ++ ip4_fib_t * rx_fib, * server_fib; ++ dhcp_server_t *server; ++ ++ if (proxy == 0) ++ { ++ s = format (s, "%=14s%=16s%s", "RX FIB", "Src Address", ++ "Servers FIB,Address"); ++ return s; ++ } ++ ++ rx_fib = ip4_fib_get(proxy->rx_fib_index); ++ ++ s = format (s, "%=14u%=16U", ++ rx_fib->table_id, ++ format_ip46_address, &proxy->dhcp_src_address, IP46_TYPE_ANY); ++ ++ vec_foreach(server, proxy->dhcp_servers) ++ { ++ server_fib = ip4_fib_get(server->server_fib_index); ++ s = format (s, "%u,%U ", ++ server_fib->table_id, ++ format_ip46_address, &server->dhcp_server, IP46_TYPE_ANY); ++ } ++ return s; ++} ++ ++static int ++dhcp4_proxy_show_walk (dhcp_proxy_t *server, ++ void *ctx) ++{ ++ vlib_main_t * vm = ctx; ++ ++ vlib_cli_output (vm, "%U", format_dhcp4_proxy_server, server); ++ ++ return (1); ++} ++ ++static clib_error_t * ++vbng_dhcp4_show_command_fn (vlib_main_t * vm, ++ unformat_input_t * input, ++ vlib_cli_command_t * cmd) ++{ ++ vlib_cli_output (vm, "%U", format_dhcp4_proxy_server, NULL /* header line */); ++ ++ vbng_dhcp4_walk(dhcp4_proxy_show_walk, vm); ++ ++ return (NULL); ++} ++ ++VLIB_CLI_COMMAND (vbng_dhcp4_show_command, static) = { ++ .path = "show vbng dhcp4", ++ .short_help = "Display vbng DHCP4 configuration info", ++ .function = vbng_dhcp4_show_command_fn, ++}; ++ ++static clib_error_t * ++vbng_aaa_set_command_fn (vlib_main_t * vm, ++ unformat_input_t * input, ++ vlib_cli_command_t * cmd) ++{ ++ vbng_dhcp4_main_t *dm = &vbng_dhcp4_main; ++ u8 *config_file = NULL; ++ u32 nas_port = 0; ++ int set_config = 0, is_del = 0; ++ ++ while (unformat_check_input(input) != UNFORMAT_END_OF_INPUT) { ++ if (unformat (input, "nas-port %d", &nas_port)) ++ ; ++ else if (unformat (input, "config %v", &config_file)) ++ set_config = 1; ++ else if (unformat (input, "delete") || ++ unformat (input, "del")) ++ is_del = 1; ++ else ++ break; ++ } ++ ++ if (!is_del && set_config) { ++ if (dm->config.is_enabled == VBNG_AAA_ENABLED) { ++ return 0; ++ } ++ ++ if (nas_port) { ++ dm->config.nas_port = nas_port; ++ } else { ++ dm->config.nas_port = AAA_DEFAULT_NAS_PORT; ++ } ++ dm->config.config_file = config_file; ++ dm->config.is_enabled = VBNG_AAA_ENABLED; ++ } else if (is_del) { ++ if (dm->config.is_enabled == VBNG_AAA_DISABLED) { ++ return 0; ++ } ++ ++ vec_free (dm->config.config_file); ++ dm->config.config_file = format(0, "%s", AAA_DEFAULT_CONFIG_FILE); ++ dm->config.nas_port = AAA_DEFAULT_NAS_PORT; ++ dm->config.is_enabled = VBNG_AAA_DISABLED; ++ } else { ++ return clib_error_return (0, "parse error`%U'", ++ format_unformat_error, input); ++ } ++ ++ return 0; ++} ++ ++VLIB_CLI_COMMAND (vbng_aaa_set_command, static) = { ++ .path = "set vbng aaa", ++ .short_help = "set vbng aaa [del] config <file> [nas-port <n>]", ++ .function = vbng_aaa_set_command_fn, ++}; ++ ++static u8 * ++format_vbng_aaa_config(u8 *s, va_list *args) ++{ ++ vbng_dhcp4_main_t *dm = &vbng_dhcp4_main; ++ ++ s = format(s, "%=8s %=8s %s\n", "Enabled", ++ "NAS Port", "Config File"); ++ ++ s = format(s, "%=8s %=8d %v\n", ++ dm->config.is_enabled ? "True" : "False", ++ dm->config.nas_port, ++ dm->config.config_file); ++ ++ return s; ++} ++ ++static clib_error_t * ++vbng_aaa_show_command_fn (vlib_main_t * vm, ++ unformat_input_t * input, ++ vlib_cli_command_t * cmd) ++{ ++ vlib_cli_output (vm, "%U", format_vbng_aaa_config, NULL); ++ ++ return (NULL); ++} ++ ++VLIB_CLI_COMMAND (vbng_aaa_show_command, static) = { ++ .path = "show vbng aaa", ++ .short_help = "Display vbng AAA configuration info", ++ .function = vbng_aaa_show_command_fn, ++}; ++ ++/* *INDENT-OFF* */ ++VLIB_PLUGIN_REGISTER () = { ++ .version = VPP_BUILD_VER, ++ .description = "DHCP V4 Proxy With Radius Client", ++}; ++/* *INDENT-ON* */ +diff --git a/src/plugins/vbng/vbng_msg_enum.h b/src/plugins/vbng/vbng_msg_enum.h +new file mode 100644 +index 00000000..1dc1357f +--- /dev/null ++++ b/src/plugins/vbng/vbng_msg_enum.h +@@ -0,0 +1,31 @@ ++/* ++ * vbng_msg_enum.h - vpp engine plug-in message enumeration ++ * ++ * Copyright (c) 2017 Intel and/or its affiliates. ++ * 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. ++ */ ++#ifndef _VBNG_MSG_ENUM_H_ ++#define _VBNG_MSG_ENUM_H_ ++ ++#include <vppinfra/byte_order.h> ++ ++#define vl_msg_id(n,h) n, ++typedef enum ++{ ++#include <vbng/vbng_all_api_h.h> ++ /* We'll want to know how many messages IDs we need... */ ++ VL_MSG_FIRST_AVAILABLE, ++} vl_msg_id_t; ++#undef vl_msg_id ++ ++#endif /* _VBNG_MSG_ENUM_H_ */ +diff --git a/src/vnet.am b/src/vnet.am +index 9e099f33..7c107f0f 100644 +--- a/src/vnet.am ++++ b/src/vnet.am +@@ -682,31 +682,31 @@ endif + ######################################## + # DHCP client + ######################################## +-libvnet_la_SOURCES += \ +- vnet/dhcp/client.c \ +- vnet/dhcp/client.h \ +- vnet/dhcp/dhcp_api.c +- +-nobase_include_HEADERS += \ +- vnet/dhcp/client.h \ +- vnet/dhcp/dhcp.api.h +- +-API_FILES += vnet/dhcp/dhcp.api ++#libvnet_la_SOURCES += \ ++# vnet/dhcp/client.c \ ++# vnet/dhcp/client.h \ ++# vnet/dhcp/dhcp_api.c ++# ++#nobase_include_HEADERS += \ ++# vnet/dhcp/client.h \ ++# vnet/dhcp/dhcp.api.h ++# ++#API_FILES += vnet/dhcp/dhcp.api + + ######################################## + # DHCP proxy + ######################################## +-libvnet_la_SOURCES += \ +- vnet/dhcp/dhcp6_proxy_node.c \ +- vnet/dhcp/dhcp4_proxy_node.c \ +- vnet/dhcp/dhcp_proxy.c +- +-nobase_include_HEADERS += \ +- vnet/dhcp/dhcp4_packet.h \ +- vnet/dhcp/dhcp6_packet.h \ +- vnet/dhcp/dhcp_proxy.h \ +- vnet/dhcp/dhcp6_proxy_error.def \ +- vnet/dhcp/dhcp4_proxy_error.def ++#libvnet_la_SOURCES += \ ++# vnet/dhcp/dhcp6_proxy_node.c \ ++# vnet/dhcp/dhcp4_proxy_node.c \ ++# vnet/dhcp/dhcp_proxy.c ++# ++#nobase_include_HEADERS += \ ++# vnet/dhcp/dhcp4_packet.h \ ++# vnet/dhcp/dhcp6_packet.h \ ++# vnet/dhcp/dhcp_proxy.h \ ++# vnet/dhcp/dhcp6_proxy_error.def \ ++# vnet/dhcp/dhcp4_proxy_error.def + + ######################################## + # ipv6 segment routing +diff --git a/src/vpp-api/java/Makefile.am b/src/vpp-api/java/Makefile.am +index f18e0c24..cadaa8d9 100644 +--- a/src/vpp-api/java/Makefile.am ++++ b/src/vpp-api/java/Makefile.am +@@ -149,6 +149,26 @@ jvpp-snat/io_fd_vpp_jvpp_snat_JVppSnatImpl.h: $(jvpp_registry_ok) $(jvpp_snat_js + endif + + # ++# VBNG Plugin ++# ++if ENABLE_VBNG_PLUGIN ++noinst_LTLIBRARIES += libjvpp_vbng.la ++libjvpp_vbng_la_SOURCES = jvpp-vbng/jvpp_vbng.c ++libjvpp_vbng_la_CPPFLAGS = -Ijvpp-vbng ++libjvpp_vbng_la_LIBADD = $(JVPP_LIBS) ++libjvpp_vbng_la_DEPENDENCIES = libjvpp_common.la ++ ++BUILT_SOURCES += jvpp-vbng/io_fd_vpp_jvpp_vbng_JVppVbngImpl.h ++JAR_FILES += jvpp-vbng-$(PACKAGE_VERSION).jar ++CLEANDIRS += jvpp-vbng/target ++ ++jvpp_vbng_json_files = @top_builddir@/plugins/vbng/vbng.api.json ++ ++jvpp-vbng/io_fd_vpp_jvpp_vbng_JVppVbngImpl.h: $(jvpp_registry_ok) $(jvpp_vbng_json_files) ++ $(call japigen,vbng,JVppVbngImpl) ++endif ++ ++# + # iOAM Trace Plugin + # + if ENABLE_IOAM_PLUGIN +diff --git a/src/vpp-api/java/jvpp-vbng/jvpp_vbng.c b/src/vpp-api/java/jvpp-vbng/jvpp_vbng.c +new file mode 100644 +index 00000000..b722a500 +--- /dev/null ++++ b/src/vpp-api/java/jvpp-vbng/jvpp_vbng.c +@@ -0,0 +1,108 @@ ++/* ++ * Copyright (c) 2017 Intel Corp and/or its affiliates. ++ * ++ * 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. ++ */ ++ ++#include <vnet/vnet.h> ++ ++#include <vbng/vbng_msg_enum.h> ++#define vl_typedefs /* define message structures */ ++#include <vbng/vbng_all_api_h.h> ++#undef vl_typedefs ++ ++#include <vnet/api_errno.h> ++#include <vlibapi/api.h> ++#include <vlibmemory/api.h> ++ ++#if VPPJNI_DEBUG == 1 ++ #define DEBUG_LOG(...) clib_warning(__VA_ARGS__) ++#else ++ #define DEBUG_LOG(...) ++#endif ++ ++#include <jvpp-common/jvpp_common.h> ++ ++#include "jvpp-vbng/io_fd_vpp_jvpp_vbng_JVppVbngImpl.h" ++#include "jvpp_vbng.h" ++#include "jvpp-vbng/jvpp_vbng_gen.h" ++ ++/* ++ * Class: io_fd_vpp_jvpp_vbng_JVppVbngImpl ++ * Method: init0 ++ * Signature: (JI)V ++ */ ++JNIEXPORT void JNICALL Java_io_fd_vpp_jvpp_vbng_JVppVbngImpl_init0 ++ (JNIEnv *env, jclass clazz, jobject callback, jlong queue_address, jint my_client_index) { ++ vbng_main_t * plugin_main = &vbng_main; ++ clib_warning ("Java_io_fd_vpp_jvpp_vbng_JVppVbngImpl_init0"); ++ ++ plugin_main->my_client_index = my_client_index; ++ plugin_main->vl_input_queue = (unix_shared_memory_queue_t *)queue_address; ++ ++ plugin_main->callbackObject = (*env)->NewGlobalRef(env, callback); ++ plugin_main->callbackClass = (jclass)(*env)->NewGlobalRef(env, (*env)->GetObjectClass(env, callback)); ++ ++ // verify API has not changed since jar generation ++ #define _(N) \ ++ get_message_id(env, #N); ++ foreach_supported_api_message; ++ #undef _ ++ ++ #define _(N,n) \ ++ vl_msg_api_set_handlers(get_message_id(env, #N), #n, \ ++ vl_api_##n##_t_handler, \ ++ vl_noop_handler, \ ++ vl_noop_handler, \ ++ vl_noop_handler, \ ++ sizeof(vl_api_##n##_t), 1); ++ foreach_api_reply_handler; ++ #undef _ ++} ++ ++JNIEXPORT void JNICALL Java_io_fd_vpp_jvpp_vbng_JVppVbngImpl_close0 ++(JNIEnv *env, jclass clazz) { ++ vbng_main_t * plugin_main = &vbng_main; ++ ++ // cleanup: ++ (*env)->DeleteGlobalRef(env, plugin_main->callbackClass); ++ (*env)->DeleteGlobalRef(env, plugin_main->callbackObject); ++ ++ plugin_main->callbackClass = NULL; ++ plugin_main->callbackObject = NULL; ++} ++ ++/* Attach thread to JVM and cache class references when initiating JVPP VES */ ++jint JNI_OnLoad(JavaVM *vm, void *reserved) { ++ JNIEnv* env; ++ ++ if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_8) != JNI_OK) { ++ return JNI_EVERSION; ++ } ++ ++ if (cache_class_references(env) != 0) { ++ clib_warning ("Failed to cache class references\n"); ++ return JNI_ERR; ++ } ++ ++ return JNI_VERSION_1_8; ++} ++ ++/* Clean up cached references when disposing JVPP VES */ ++void JNI_OnUnload(JavaVM *vm, void *reserved) { ++ JNIEnv* env; ++ if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_8) != JNI_OK) { ++ return; ++ } ++ delete_class_references(env); ++} +diff --git a/src/vpp-api/java/jvpp-vbng/jvpp_vbng.h b/src/vpp-api/java/jvpp-vbng/jvpp_vbng.h +new file mode 100644 +index 00000000..62b4cda5 +--- /dev/null ++++ b/src/vpp-api/java/jvpp-vbng/jvpp_vbng.h +@@ -0,0 +1,42 @@ ++/* ++ * Copyright (c) 2017 Intel Corp and/or its affiliates. ++ * ++ * 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. ++ */ ++#ifndef __included_jvpp_vbng_h__ ++#define __included_jvpp_vbng_h__ ++ ++#include <vnet/vnet.h> ++#include <vnet/ip/ip.h> ++#include <vnet/api_errno.h> ++#include <vlibapi/api.h> ++#include <vlibmemory/api.h> ++#include <jni.h> ++ ++/* Global state for JVPP-VES */ ++typedef struct { ++ /* Pointer to shared memory queue */ ++ unix_shared_memory_queue_t * vl_input_queue; ++ ++ /* VPP api client index */ ++ u32 my_client_index; ++ ++ /* Callback object and class references enabling asynchronous Java calls */ ++ jobject callbackObject; ++ jclass callbackClass; ++ ++} vbng_main_t; ++ ++vbng_main_t vbng_main __attribute__((aligned (64))); ++ ++#endif /* __included_jvpp_vbng_h__ */ +-- +2.12.2.windows.2 + diff --git a/vnfs/vCPE/vpp-ves-agent-for-vgmux/src/patches/Hc2vpp-Add-VES-agent-for-vG-MUX.patch b/vnfs/vCPE/vpp-ves-agent-for-vgmux/src/patches/Hc2vpp-Add-VES-agent-for-vG-MUX.patch new file mode 100644 index 00000000..8c2e31b7 --- /dev/null +++ b/vnfs/vCPE/vpp-ves-agent-for-vgmux/src/patches/Hc2vpp-Add-VES-agent-for-vG-MUX.patch @@ -0,0 +1,1079 @@ +From 9a00b1af18dfe4c2df185299b8bd2db7f5d061c0 Mon Sep 17 00:00:00 2001 +From: Johnson Li <johnson.li@intel.com> +Date: Fri, 8 Sep 2017 17:35:16 +0800 +Subject: [PATCH] Add VES agent configuration for vG-MUX + +Signed-off-by: Johnson Li <johnson.li@intel.com> + +diff --git a/pom.xml b/pom.xml +index 538a5d98..581bedfc 100644 +--- a/pom.xml ++++ b/pom.xml +@@ -44,13 +44,14 @@ + <module>nat</module> + <module>lisp</module> + <module>release-notes</module> +- <module>vpp-integration</module> + <module>acl</module> + <module>dhcp</module> ++ <module>ves</module> + <module>samples</module> + <module>vpp-classifier</module> + <module>l3</module> + <module>vpp-management</module> ++ <module>vpp-integration</module> + <module>it</module> + </modules> + </project> +\ No newline at end of file +diff --git a/ves/asciidoc/Readme.adoc b/ves/asciidoc/Readme.adoc +new file mode 100644 +index 00000000..682e7555 +--- /dev/null ++++ b/ves/asciidoc/Readme.adoc +@@ -0,0 +1,3 @@ ++= ves-agent ++ ++Overview of ves-agent +diff --git a/ves/pom.xml b/ves/pom.xml +new file mode 100644 +index 00000000..1ded0109 +--- /dev/null ++++ b/ves/pom.xml +@@ -0,0 +1,56 @@ ++<?xml version="1.0" encoding="UTF-8"?> ++<!-- ++ Copyright (c) 2017 Cisco and/or its affiliates. ++ 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. ++--><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> ++ ++ <parent> ++ <groupId>io.fd.hc2vpp.common</groupId> ++ <artifactId>hc2vpp-parent</artifactId> ++ <version>1.17.04.1-SNAPSHOT</version> ++ <relativePath>../common/hc2vpp-parent</relativePath> ++ </parent> ++ ++ <groupId>io.fd.hc2vpp.ves</groupId> ++ <artifactId>ves-agent</artifactId> ++ <version>1.17.04.1-SNAPSHOT</version> ++ <name>ves-agent</name> ++ <packaging>pom</packaging> ++ <modelVersion>4.0.0</modelVersion> ++ <description>Agent for VNF Event Stream plugin</description> ++ ++ <modules> ++ <module>ves-api</module> ++ <module>ves-impl</module> ++ </modules> ++ ++ <!-- DO NOT install or deploy the repo root pom as it's only needed to initiate a build --> ++ <build> ++ <plugins> ++ <plugin> ++ <groupId>org.apache.maven.plugins</groupId> ++ <artifactId>maven-deploy-plugin</artifactId> ++ <configuration> ++ <skip>true</skip> ++ </configuration> ++ </plugin> ++ <plugin> ++ <groupId>org.apache.maven.plugins</groupId> ++ <artifactId>maven-install-plugin</artifactId> ++ <configuration> ++ <skip>true</skip> ++ </configuration> ++ </plugin> ++ </plugins> ++ </build> ++</project> +diff --git a/ves/ves-api/asciidoc/Readme.adoc b/ves/ves-api/asciidoc/Readme.adoc +new file mode 100644 +index 00000000..b561268c +--- /dev/null ++++ b/ves/ves-api/asciidoc/Readme.adoc +@@ -0,0 +1,3 @@ ++= vesagent-api ++ ++Overview of vesagent-api +\ No newline at end of file +diff --git a/ves/ves-api/pom.xml b/ves/ves-api/pom.xml +new file mode 100644 +index 00000000..78bf47b9 +--- /dev/null ++++ b/ves/ves-api/pom.xml +@@ -0,0 +1,52 @@ ++<?xml version="1.0" encoding="UTF-8"?> ++<!-- ++ Copyright (c) 2017 Cisco and/or its affiliates. ++ 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. ++--><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> ++ <parent> ++ <groupId>io.fd.hc2vpp.common</groupId> ++ <artifactId>api-parent</artifactId> ++ <version>1.17.04.1-SNAPSHOT</version> ++ <relativePath>../../common/api-parent</relativePath> ++ </parent> ++ ++ <modelVersion>4.0.0</modelVersion> ++ <groupId>io.fd.hc2vpp.ves</groupId> ++ <artifactId>ves-api</artifactId> ++ <name>ves-api</name> ++ <version>1.17.04.1-SNAPSHOT</version> ++ <packaging>bundle</packaging> ++ ++ <dependencies> ++ <dependency> ++ <groupId>org.opendaylight.mdsal.model</groupId> ++ <artifactId>iana-if-type-2014-05-08</artifactId> ++ </dependency> ++ <dependency> ++ <groupId>org.opendaylight.mdsal.model</groupId> ++ <artifactId>ietf-yang-types-20130715</artifactId> ++ </dependency> ++ <dependency> ++ <groupId>org.opendaylight.mdsal.model</groupId> ++ <artifactId>ietf-interfaces</artifactId> ++ </dependency> ++ <dependency> ++ <groupId>org.opendaylight.mdsal.model</groupId> ++ <artifactId>ietf-inet-types-2013-07-15</artifactId> ++ </dependency> ++ <dependency> ++ <groupId>org.opendaylight.mdsal.model</groupId> ++ <artifactId>yang-ext</artifactId> ++ </dependency> ++ </dependencies> ++</project> +diff --git a/ves/ves-api/src/main/yang/vesagent.yang b/ves/ves-api/src/main/yang/vesagent.yang +new file mode 100644 +index 00000000..a3c79797 +--- /dev/null ++++ b/ves/ves-api/src/main/yang/vesagent.yang +@@ -0,0 +1,71 @@ ++module vesagent { ++ ++ yang-version 1; ++ namespace "urn:opendaylight:params:xml:ns:yang:vpp:vesagent"; ++ prefix "vesagent"; ++ ++ description ++ "This YANG module defines the generic configuration and ++ operational data for VES Agent in VPP"; ++ ++ revision "2017-08-01" { ++ description ++ "Initial revision of VES Agent model"; ++ } ++ ++ import ietf-inet-types { ++ prefix inet; ++ } ++ ++ grouping vesagent-attributes { ++ container config { ++ description ++ "VNF Event Stream Agent configuration"; ++ ++ leaf server-addr { ++ type inet:ipv4-address; ++ description ++ "VES Collector's IP address."; ++ } ++ ++ leaf server-port { ++ type uint32; ++ description ++ "VES Collector's Server Port."; ++ } ++ ++ leaf read-interval { ++ type uint32; ++ description ++ "Seconds of time period for each loop."; ++ } ++ ++ leaf is-add { ++ type uint32; ++ description ++ "0-Delete VES agent, NonZero-Start VES agent."; ++ } ++ } ++ ++ container mode { ++ description ++ "VNF Event Stream Agent Working Mode."; ++ ++ leaf base-packet-loss { ++ type uint32; ++ description ++ "Base packet Loss for Demo Mode"; ++ } ++ ++ leaf working-mode { ++ type string; ++ description ++ "VES Working Mode, Demo Or Real Only."; ++ } ++ } ++ } ++ ++ container vesagent { ++ uses vesagent-attributes; ++ } ++} +diff --git a/ves/ves-impl/asciidoc/Readme.adoc b/ves/ves-impl/asciidoc/Readme.adoc +new file mode 100644 +index 00000000..e07fb05f +--- /dev/null ++++ b/ves/ves-impl/asciidoc/Readme.adoc +@@ -0,0 +1,3 @@ ++= vesagent-impl ++ ++Overview of vesagent-impl +\ No newline at end of file +diff --git a/ves/ves-impl/pom.xml b/ves/ves-impl/pom.xml +new file mode 100644 +index 00000000..5ed2c1b4 +--- /dev/null ++++ b/ves/ves-impl/pom.xml +@@ -0,0 +1,157 @@ ++<?xml version="1.0" encoding="UTF-8"?> ++<!-- ++ Copyright (c) 2017 Cisco and/or its affiliates. ++ 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. ++--><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> ++ <parent> ++ <groupId>io.fd.hc2vpp.common</groupId> ++ <artifactId>vpp-impl-parent</artifactId> ++ <version>1.17.04.1-SNAPSHOT</version> ++ <relativePath>../../vpp-common/vpp-impl-parent</relativePath> ++ </parent> ++ ++ <modelVersion>4.0.0</modelVersion> ++ <groupId>io.fd.hc2vpp.ves</groupId> ++ <artifactId>ves-impl</artifactId> ++ <name>${project.artifactId}</name> ++ <version>1.17.04.1-SNAPSHOT</version> ++ <packaging>bundle</packaging> ++ ++ <properties> ++ <honeycomb.infra.version>1.17.04.1-SNAPSHOT</honeycomb.infra.version> ++ <hc2vpp.common.version>1.17.04.1-SNAPSHOT</hc2vpp.common.version> ++ </properties> ++ ++ <dependencies> ++ <dependency> ++ <groupId>${project.groupId}</groupId> ++ <artifactId>ves-api</artifactId> ++ <version>${project.version}</version> ++ </dependency> ++ ++ <!--VPP common--> ++ <dependency> ++ <groupId>io.fd.hc2vpp.common</groupId> ++ <artifactId>vpp-translate-utils</artifactId> ++ </dependency> ++ ++ <!-- JVPP --> ++ <dependency> ++ <groupId>io.fd.vpp</groupId> ++ <artifactId>jvpp-registry</artifactId> ++ </dependency> ++ <dependency> ++ <groupId>io.fd.vpp</groupId> ++ <artifactId>jvpp-ves</artifactId> ++ <version>17.04.2-SNAPSHOT</version> ++ </dependency> ++ ++ <!-- Honeycomb infrastructure--> ++ <dependency> ++ <groupId>io.fd.honeycomb</groupId> ++ <artifactId>minimal-distribution</artifactId> ++ <version>${honeycomb.infra.version}</version> ++ </dependency> ++ ++ <dependency> ++ <groupId>io.fd.honeycomb</groupId> ++ <artifactId>translate-api</artifactId> ++ <version>${honeycomb.infra.version}</version> ++ </dependency> ++ ++ <dependency> ++ <groupId>io.fd.honeycomb</groupId> ++ <artifactId>translate-spi</artifactId> ++ <version>${honeycomb.infra.version}</version> ++ </dependency> ++ ++ <dependency> ++ <groupId>io.fd.honeycomb</groupId> ++ <artifactId>cfg-init</artifactId> ++ <version>${honeycomb.infra.version}</version> ++ </dependency> ++ ++ <!-- Translation --> ++ <dependency> ++ <groupId>io.fd.hc2vpp.common</groupId> ++ <artifactId>vpp-translate-utils</artifactId> ++ </dependency> ++ ++ <!-- DI --> ++ <dependency> ++ <groupId>com.google.inject</groupId> ++ <artifactId>guice</artifactId> ++ </dependency> ++ <dependency> ++ <groupId>net.jmob</groupId> ++ <artifactId>guice.conf</artifactId> ++ </dependency> ++ <dependency> ++ <groupId>com.google.inject.extensions</groupId> ++ <artifactId>guice-multibindings</artifactId> ++ </dependency> ++ <dependency> ++ <groupId>io.fd.honeycomb</groupId> ++ <artifactId>translate-impl</artifactId> ++ <version>1.17.04.1-SNAPSHOT</version> ++ </dependency> ++ ++ ++ <!-- Testing dependencies--> ++ <dependency> ++ <groupId>com.google.inject</groupId> ++ <artifactId>guice</artifactId> ++ </dependency> ++ <dependency> ++ <groupId>net.jmob</groupId> ++ <artifactId>guice.conf</artifactId> ++ </dependency> ++ <dependency> ++ <groupId>com.google.inject.extensions</groupId> ++ <artifactId>guice-multibindings</artifactId> ++ </dependency> ++ ++ <dependency> ++ <groupId>junit</groupId> ++ <artifactId>junit</artifactId> ++ <scope>test</scope> ++ </dependency> ++ <dependency> ++ <groupId>io.fd.hc2vpp.common</groupId> ++ <artifactId>vpp-translate-test</artifactId> ++ <version>${hc2vpp.common.version}</version> ++ <scope>test</scope> ++ </dependency> ++ <dependency> ++ <groupId>org.mockito</groupId> ++ <artifactId>mockito-core</artifactId> ++ <scope>test</scope> ++ </dependency> ++ <dependency> ++ <groupId>com.google.inject.extensions</groupId> ++ <artifactId>guice-testlib</artifactId> ++ <scope>test</scope> ++ </dependency> ++ <dependency> ++ <groupId>org.hamcrest</groupId> ++ <artifactId>hamcrest-all</artifactId> ++ <scope>test</scope> ++ </dependency> ++ <dependency> ++ <groupId>io.fd.honeycomb.infra</groupId> ++ <artifactId>test-tools</artifactId> ++ <version>${project.version}</version> ++ <scope>test</scope> ++ </dependency> ++ </dependencies> ++</project> +diff --git a/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/VesModule.java b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/VesModule.java +new file mode 100644 +index 00000000..0cd60068 +--- /dev/null ++++ b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/VesModule.java +@@ -0,0 +1,67 @@ ++/* ++ * Copyright (c) 2017 Intel Corp and/or its affiliates. ++ * ++ * 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. ++ */ ++ ++package io.fd.hc2vpp.ves; ++ ++import com.google.common.annotations.VisibleForTesting; ++import com.google.inject.AbstractModule; ++import com.google.inject.Provider; ++import com.google.inject.Singleton; ++import com.google.inject.multibindings.Multibinder; ++import io.fd.hc2vpp.ves.jvpp.JVppVesProvider; ++import io.fd.hc2vpp.ves.read.VesReaderFactory; ++import io.fd.hc2vpp.ves.write.VesWriterFactory; ++import io.fd.honeycomb.translate.read.ReaderFactory; ++import io.fd.honeycomb.translate.write.WriterFactory; ++import io.fd.vpp.jvpp.ves.future.FutureJVppVesFacade; ++import org.slf4j.Logger; ++import org.slf4j.LoggerFactory; ++ ++/** ++ * VesModule class instantiating ves plugin components. ++ */ ++public final class VesModule extends AbstractModule { ++ ++ private static final Logger LOG = LoggerFactory.getLogger(VesModule.class); ++ private final Class<? extends Provider<FutureJVppVesFacade>> jvppVesProviderClass; ++ ++ public VesModule() { ++ this(JVppVesProvider.class); ++ } ++ ++ @VisibleForTesting ++ VesModule(Class<? extends Provider<FutureJVppVesFacade>> jvppVesProvider) { ++ this.jvppVesProviderClass = jvppVesProvider; ++ } ++ ++ @Override ++ protected void configure() { ++ LOG.info("Installing VES Agent module"); ++ ++ // Bind to Plugin's JVPP ++ bind(FutureJVppVesFacade.class).toProvider(jvppVesProviderClass).in(Singleton.class); ++ ++ LOG.info("Injecting writers factories"); ++ final Multibinder<WriterFactory> writerFactoryBinder = Multibinder.newSetBinder(binder(), WriterFactory.class); ++ writerFactoryBinder.addBinding().to(VesWriterFactory.class); ++ ++ LOG.info("Injecting readers factories"); ++ final Multibinder<ReaderFactory> readerFactoryBinder = Multibinder.newSetBinder(binder(), ReaderFactory.class); ++ readerFactoryBinder.addBinding().to(VesReaderFactory.class); ++ ++ LOG.info("Module VES Agent successfully configured"); ++ } ++} +diff --git a/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/jvpp/JVppVesProvider.java b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/jvpp/JVppVesProvider.java +new file mode 100644 +index 00000000..8afed84e +--- /dev/null ++++ b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/jvpp/JVppVesProvider.java +@@ -0,0 +1,59 @@ ++/* ++ * Copyright (c) 2017 Intel Corp and/or its affiliates. ++ * ++ * 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. ++ */ ++ ++package io.fd.hc2vpp.ves.jvpp; ++ ++import com.google.inject.Inject; ++import io.fd.honeycomb.infra.distro.ProviderTrait; ++import io.fd.vpp.jvpp.JVppRegistry; ++import io.fd.vpp.jvpp.ves.JVppVesImpl; ++import io.fd.vpp.jvpp.ves.future.FutureJVppVesFacade; ++import java.io.IOException; ++import org.slf4j.Logger; ++import org.slf4j.LoggerFactory; ++ ++/** ++ * Provides future API for jvpp-ves plugin. Must be a singleton due to shutdown hook usage. ++ * Registers shutdown hook to free plugin's resources on shutdown. ++ */ ++public final class JVppVesProvider extends ProviderTrait<FutureJVppVesFacade> { ++ ++ private static final Logger LOG = LoggerFactory.getLogger(JVppVesProvider.class); ++ ++ @Inject ++ private JVppRegistry registry; ++ ++ @Override ++ protected FutureJVppVesFacade create() { ++ try { ++ final JVppVesImpl jvppVes = new JVppVesImpl(); ++ Runtime.getRuntime().addShutdownHook(new Thread() { ++ @Override ++ public void run() { ++ LOG.info("Unloading jvpp-ves plugin"); ++ jvppVes.close(); ++ LOG.info("Successfully unloaded jvpp-ves plugin"); ++ } ++ }); ++ ++ LOG.info("Successfully loaded jvpp-ves plugin"); ++ return new FutureJVppVesFacade(registry, jvppVes); ++ } catch (IOException e) { ++ throw new IllegalStateException("Unable to open VPP management connection", e); ++ } ++ } ++} ++ +diff --git a/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/read/VesReaderFactory.java b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/read/VesReaderFactory.java +new file mode 100644 +index 00000000..bef652fd +--- /dev/null ++++ b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/read/VesReaderFactory.java +@@ -0,0 +1,50 @@ ++/* ++ * Copyright (c) 2017 Intel Corp and/or its affiliates. ++ * ++ * 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. ++ */ ++ ++package io.fd.hc2vpp.ves.read; ++ ++import com.google.inject.Inject; ++import io.fd.honeycomb.translate.read.ReaderFactory; ++import io.fd.honeycomb.translate.read.registry.ModifiableReaderRegistryBuilder; ++import io.fd.vpp.jvpp.core.future.FutureJVppCore; ++import javax.annotation.Nonnull; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.Vesagent; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.VesagentBuilder; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.Config; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.ConfigBuilder; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.Mode; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.ModeBuilder; ++import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; ++ ++/** ++ * Factory producing writers for VES Agent plugin's data. ++ */ ++public final class VesReaderFactory implements ReaderFactory { ++ ++ private static final InstanceIdentifier<Vesagent> VESAGENT_ID = InstanceIdentifier.create(Vesagent.class); ++ private static final InstanceIdentifier<Config> CONFIG_ID = InstanceIdentifier.create(Config.class); ++ private static final InstanceIdentifier<Mode> MODE_ID = InstanceIdentifier.create(Mode.class); ++ ++ @Inject ++ private FutureJVppCore vppApi; ++ ++ @Override ++ public void init(@Nonnull final ModifiableReaderRegistryBuilder registry) { ++ registry.addStructuralReader(VESAGENT_ID, VesagentBuilder.class); ++ registry.addStructuralReader(CONFIG_ID, ConfigBuilder.class); ++ registry.addStructuralReader(MODE_ID, ModeBuilder.class); ++ } ++} +diff --git a/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesConfigCustomizer.java b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesConfigCustomizer.java +new file mode 100644 +index 00000000..e06afa73 +--- /dev/null ++++ b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesConfigCustomizer.java +@@ -0,0 +1,127 @@ ++/* ++ * Copyright (c) 2017 Intel Corp and/or its affiliates. ++ * ++ * 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. ++ */ ++ ++package io.fd.hc2vpp.ves.write; ++ ++import static com.google.common.base.Preconditions.checkArgument; ++ ++import io.fd.hc2vpp.common.translate.util.ByteDataTranslator; ++import io.fd.hc2vpp.common.translate.util.FutureJVppCustomizer; ++import io.fd.hc2vpp.common.translate.util.Ipv4Translator; ++import io.fd.hc2vpp.common.translate.util.Ipv6Translator; ++import io.fd.hc2vpp.common.translate.util.JvppReplyConsumer; ++import io.fd.honeycomb.translate.spi.write.WriterCustomizer; ++import io.fd.honeycomb.translate.write.WriteContext; ++import io.fd.honeycomb.translate.write.WriteFailedException; ++import io.fd.vpp.jvpp.core.future.FutureJVppCore; ++//import io.fd.vpp.jvpp.ves.future.FutureJVppVes; ++import io.fd.vpp.jvpp.ves.dto.VesAgentConfig; ++import io.fd.vpp.jvpp.ves.future.FutureJVppVesFacade; ++import javax.annotation.Nonnull; ++//import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.Vesagent; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.Config; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.ConfigBuilder; ++import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; ++import org.slf4j.Logger; ++import org.slf4j.LoggerFactory; ++ ++final class VesConfigCustomizer extends FutureJVppCustomizer implements WriterCustomizer<Config>, ++ JvppReplyConsumer, ByteDataTranslator, Ipv6Translator, Ipv4Translator { ++ private static final Logger LOG = LoggerFactory.getLogger(VesConfigCustomizer.class); ++ ++ private final FutureJVppVesFacade jvppVes; ++ ++ VesConfigCustomizer(final FutureJVppCore vppApi, final FutureJVppVesFacade jvppVes) { ++ super(vppApi); ++ this.jvppVes = jvppVes; ++ } ++ ++ @Override ++ public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Config> iid, @Nonnull final Config dataAfter, ++ @Nonnull final WriteContext writeContext) throws WriteFailedException { ++ ConfigBuilder configBuilder = new ConfigBuilder(); ++ InstanceIdentifier<Config> id = iid; ++ ++ LOG.debug("Writing VES Agent Config {} dataAfter={}", id, dataAfter); ++ checkArgument(dataAfter.getServerAddr() != null && dataAfter.getServerAddr().getValue() != null ++ && dataAfter.getServerPort() != 0, "VES Server Address and Port need to be configured"); ++ ++ configBuilder.setServerAddr(dataAfter.getServerAddr()) ++ .setServerPort(dataAfter.getServerPort()) ++ .setReadInterval(dataAfter.getReadInterval()) ++ .setIsAdd(1L); ++ ++ setVesAgentConfig(id, configBuilder.build()); ++ } ++ ++ @Override ++ public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Config> iid, @Nonnull final Config dataBefore, ++ @Nonnull final Config dataAfter, @Nonnull final WriteContext writeContext) ++ throws WriteFailedException { ++ ConfigBuilder configBuilder = new ConfigBuilder(); ++ InstanceIdentifier<Config> id = iid; ++ ++ checkArgument(dataBefore.getServerAddr() != null && dataBefore.getServerAddr().getValue() != null ++ && dataBefore.getServerPort() != 0, "VES Server Address and Port need to be configured"); ++ checkArgument(dataAfter.getServerAddr() != null && dataAfter.getServerAddr().getValue() != null ++ && dataAfter.getServerPort() != 0, "VES Server Address and Port need to be configured"); ++ ++ // remove old configuration: ++ configBuilder.setServerAddr(dataBefore.getServerAddr()) ++ .setServerPort(dataBefore.getServerPort()) ++ .setReadInterval(dataBefore.getReadInterval()) ++ .setIsAdd(0L); ++ setVesAgentConfig(id, configBuilder.build()); ++ ++ // and add new one: ++ configBuilder.setServerAddr(dataAfter.getServerAddr()) ++ .setServerPort(dataAfter.getServerPort()) ++ .setReadInterval(dataAfter.getReadInterval()) ++ .setIsAdd(1L); ++ setVesAgentConfig(id, configBuilder.build()); ++ } ++ ++ @Override ++ public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Config> iid, @Nonnull final Config dataBefore, ++ @Nonnull final WriteContext writeContext) throws WriteFailedException { ++ ConfigBuilder configBuilder = new ConfigBuilder(); ++ InstanceIdentifier<Config> id = iid; ++ LOG.debug("Removing VES Agent {} dataBefore={}", id, dataBefore); ++ ++ checkArgument(dataBefore.getServerAddr() != null && dataBefore.getServerAddr().getValue() != null ++ && dataBefore.getServerPort() != 0, "VES Server Address and Port need to be dataBeforeured"); ++ ++ configBuilder.setServerAddr(dataBefore.getServerAddr()) ++ .setServerPort(dataBefore.getServerPort()) ++ .setReadInterval(dataBefore.getReadInterval()) ++ .setIsAdd(0L); ++ ++ setVesAgentConfig(id, configBuilder.build()); ++ } ++ ++ private void setVesAgentConfig(final InstanceIdentifier<Config> id, final Config config) ++ throws WriteFailedException { ++ final VesAgentConfig request = new VesAgentConfig(); ++ ++ request.serverPort = config.getServerPort().byteValue(); ++ request.readInterval = config.getReadInterval().byteValue(); ++ request.isAdd = config.getIsAdd().byteValue(); ++ request.serverAddr = ipv4AddressNoZoneToArray(config.getServerAddr().getValue()); ++ ++ LOG.debug("VES agent config change id={} request={}", id, request); ++ getReplyForWrite(jvppVes.vesAgentConfig(request).toCompletableFuture(), id); ++ } ++} +diff --git a/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesModeCustomizer.java b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesModeCustomizer.java +new file mode 100644 +index 00000000..8b6d5a9a +--- /dev/null ++++ b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesModeCustomizer.java +@@ -0,0 +1,97 @@ ++/* ++ * Copyright (c) 2017 Intel Corp and/or its affiliates. ++ * ++ * 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. ++ */ ++ ++package io.fd.hc2vpp.ves.write; ++ ++import static com.google.common.base.Preconditions.checkArgument; ++ ++import io.fd.hc2vpp.common.translate.util.ByteDataTranslator; ++import io.fd.hc2vpp.common.translate.util.FutureJVppCustomizer; ++import io.fd.hc2vpp.common.translate.util.Ipv4Translator; ++import io.fd.hc2vpp.common.translate.util.Ipv6Translator; ++import io.fd.hc2vpp.common.translate.util.JvppReplyConsumer; ++import io.fd.honeycomb.translate.spi.write.WriterCustomizer; ++import io.fd.honeycomb.translate.write.WriteContext; ++import io.fd.honeycomb.translate.write.WriteFailedException; ++import io.fd.vpp.jvpp.core.future.FutureJVppCore; ++//import io.fd.vpp.jvpp.ves.future.FutureJVppVes; ++import io.fd.vpp.jvpp.ves.dto.VesAgentMode; ++import io.fd.vpp.jvpp.ves.future.FutureJVppVesFacade; ++import javax.annotation.Nonnull; ++//import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.Vesagent; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.Mode; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.ModeBuilder; ++import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; ++import org.slf4j.Logger; ++import org.slf4j.LoggerFactory; ++ ++final class VesModeCustomizer extends FutureJVppCustomizer implements WriterCustomizer<Mode>, ++ JvppReplyConsumer, ByteDataTranslator, Ipv6Translator, Ipv4Translator { ++ private static final Logger LOG = LoggerFactory.getLogger(VesModeCustomizer.class); ++ ++ private final FutureJVppVesFacade jvppVes; ++ ++ VesModeCustomizer(final FutureJVppCore vppApi, final FutureJVppVesFacade jvppVes) { ++ super(vppApi); ++ this.jvppVes = jvppVes; ++ } ++ ++ @Override ++ public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Mode> iid, @Nonnull final Mode dataAfter, ++ @Nonnull final WriteContext writeContext) throws WriteFailedException { ++ LOG.debug("Writing VES Agent Working Mode {} dataAfter={}", iid, dataAfter); ++ ++ checkArgument(dataAfter.getWorkingMode() != null && dataAfter.getBasePacketLoss() <= 100, ++ "VES Agent Working Mode need to be correctly configured."); ++ ++ setVesAgentMode(iid, dataAfter); ++ } ++ ++ @Override ++ public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Mode> iid, @Nonnull final Mode dataBefore, ++ @Nonnull final Mode dataAfter, @Nonnull final WriteContext writeContext) ++ throws WriteFailedException { ++ LOG.debug("Writing VES Agent Working Mode {} {}-->{}", iid, dataBefore, dataAfter); ++ ++ checkArgument(dataAfter.getWorkingMode() != null && dataAfter.getBasePacketLoss() <= 100, ++ "VES Agent Working Mode need to be correctly configured."); ++ ++ setVesAgentMode(iid, dataAfter); ++ } ++ ++ @Override ++ public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Mode> iid, @Nonnull final Mode dataBefore, ++ @Nonnull final WriteContext writeContext) throws WriteFailedException { ++ ModeBuilder modeBuilder = new ModeBuilder(); ++ LOG.debug("Restoring VES Mode {} dataBefore={} to default.", iid, dataBefore); ++ ++ modeBuilder.setWorkingMode("Real") ++ .setBasePacketLoss(0L); ++ ++ setVesAgentMode(iid, modeBuilder.build()); ++ } ++ ++ private void setVesAgentMode(final InstanceIdentifier<Mode> id, final Mode mode) ++ throws WriteFailedException { ++ final VesAgentMode request = new VesAgentMode(); ++ ++ request.pktLossRate = mode.getBasePacketLoss().byteValue(); ++ request.workMode = mode.getWorkingMode().getBytes(); ++ ++ LOG.debug("VES agent working mode change id={} request={}", id, request); ++ getReplyForWrite(jvppVes.vesAgentMode(request).toCompletableFuture(), id); ++ } ++} +diff --git a/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesWriterFactory.java b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesWriterFactory.java +new file mode 100644 +index 00000000..581f0460 +--- /dev/null ++++ b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesWriterFactory.java +@@ -0,0 +1,54 @@ ++/* ++ * Copyright (c) 2017 Intel Corp and/or its affiliates. ++ * ++ * 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. ++ */ ++ ++package io.fd.hc2vpp.ves.write; ++ ++import com.google.common.collect.ImmutableSet; ++import com.google.inject.Inject; ++import io.fd.honeycomb.translate.impl.write.GenericWriter; ++import io.fd.honeycomb.translate.write.WriterFactory; ++import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder; ++import io.fd.vpp.jvpp.core.future.FutureJVppCore; ++import io.fd.vpp.jvpp.ves.future.FutureJVppVesFacade; ++import javax.annotation.Nonnull; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.Vesagent; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.Config; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.Mode; ++import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; ++ ++/** ++ * Factory producing writers for VES Agent plugin's data. ++ */ ++public final class VesWriterFactory implements WriterFactory { ++ ++ private static final InstanceIdentifier<Vesagent> VESAGENT_ID = InstanceIdentifier.create(Vesagent.class); ++ ++ @Inject ++ private FutureJVppCore vppApi; ++ ++ @Inject ++ protected FutureJVppVesFacade futureVesFacade; ++ ++ @Override ++ public void init(@Nonnull final ModifiableWriterRegistryBuilder registry) { ++ registry.add(new GenericWriter<>(VESAGENT_ID, ++ new VesagentCustomizer(vppApi, futureVesFacade))); ++ registry.add(new GenericWriter<>(VESAGENT_ID.child(Config.class), ++ new VesConfigCustomizer(vppApi, futureVesFacade))); ++ registry.add(new GenericWriter<>(VESAGENT_ID.child(Mode.class), ++ new VesModeCustomizer(vppApi, futureVesFacade))); ++ } ++} +diff --git a/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesagentCustomizer.java b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesagentCustomizer.java +new file mode 100644 +index 00000000..62e46cdb +--- /dev/null ++++ b/ves/ves-impl/src/main/java/io/fd/hc2vpp/ves/write/VesagentCustomizer.java +@@ -0,0 +1,131 @@ ++/* ++ * Copyright (c) 2017 Intel Corp and/or its affiliates. ++ * ++ * 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. ++ */ ++ ++package io.fd.hc2vpp.ves.write; ++ ++import static com.google.common.base.Preconditions.checkArgument; ++ ++import io.fd.hc2vpp.common.translate.util.ByteDataTranslator; ++import io.fd.hc2vpp.common.translate.util.FutureJVppCustomizer; ++import io.fd.hc2vpp.common.translate.util.Ipv4Translator; ++import io.fd.hc2vpp.common.translate.util.Ipv6Translator; ++import io.fd.hc2vpp.common.translate.util.JvppReplyConsumer; ++import io.fd.honeycomb.translate.spi.write.WriterCustomizer; ++import io.fd.honeycomb.translate.write.WriteContext; ++import io.fd.honeycomb.translate.write.WriteFailedException; ++import io.fd.vpp.jvpp.core.future.FutureJVppCore; ++//import io.fd.vpp.jvpp.ves.future.FutureJVppVes; ++import io.fd.vpp.jvpp.ves.dto.VesAgentConfig; ++import io.fd.vpp.jvpp.ves.future.FutureJVppVesFacade; ++import javax.annotation.Nonnull; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.Vesagent; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.Config; ++import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.vesagent.rev170801.vesagent.attributes.ConfigBuilder; ++import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; ++import org.slf4j.Logger; ++import org.slf4j.LoggerFactory; ++ ++final class VesagentCustomizer extends FutureJVppCustomizer implements WriterCustomizer<Vesagent>, ++ JvppReplyConsumer, ByteDataTranslator, Ipv6Translator, Ipv4Translator { ++ private static final Logger LOG = LoggerFactory.getLogger(VesagentCustomizer.class); ++ ++ private final FutureJVppVesFacade jvppVes; ++ ++ VesagentCustomizer(final FutureJVppCore vppApi, final FutureJVppVesFacade jvppVes) { ++ super(vppApi); ++ this.jvppVes = jvppVes; ++ } ++ ++ @Override ++ public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Vesagent> iid, @Nonnull final Vesagent dataAfter, ++ @Nonnull final WriteContext writeContext) throws WriteFailedException { ++ Config config = dataAfter.getConfig(); ++ ConfigBuilder configBuilder = new ConfigBuilder(); ++ InstanceIdentifier<Config> id = iid.child(Config.class); ++ ++ LOG.debug("Writing VES Agent Config {} dataAfter={}", id, config); ++ checkArgument(config.getServerAddr() != null && config.getServerAddr().getValue() != null ++ && config.getServerPort() != 0, "VES Server Address and Port need to be configured"); ++ ++ configBuilder.setServerAddr(config.getServerAddr()) ++ .setServerPort(config.getServerPort()) ++ .setReadInterval(config.getReadInterval()) ++ .setIsAdd(1L); ++ ++ setVesAgentConfig(id, configBuilder.build()); ++ } ++ ++ @Override ++ public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Vesagent> iid, @Nonnull final Vesagent dataBefore, ++ @Nonnull final Vesagent dataAfter, @Nonnull final WriteContext writeContext) ++ throws WriteFailedException { ++ Config configBefore = dataBefore.getConfig(); ++ Config configAfter = dataAfter.getConfig(); ++ ConfigBuilder configBuilder = new ConfigBuilder(); ++ InstanceIdentifier<Config> id = iid.child(Config.class); ++ ++ checkArgument(configBefore.getServerAddr() != null && configBefore.getServerAddr().getValue() != null ++ && configBefore.getServerPort() != 0, "VES Server Address and Port need to be configured"); ++ checkArgument(configAfter.getServerAddr() != null && configAfter.getServerAddr().getValue() != null ++ && configAfter.getServerPort() != 0, "VES Server Address and Port need to be configured"); ++ ++ // remove old configuration: ++ configBuilder.setServerAddr(configBefore.getServerAddr()) ++ .setServerPort(configBefore.getServerPort()) ++ .setReadInterval(configBefore.getReadInterval()) ++ .setIsAdd(0L); ++ setVesAgentConfig(id, configBuilder.build()); ++ ++ // and add new one: ++ configBuilder.setServerAddr(configAfter.getServerAddr()) ++ .setServerPort(configAfter.getServerPort()) ++ .setReadInterval(configAfter.getReadInterval()) ++ .setIsAdd(1L); ++ setVesAgentConfig(id, configBuilder.build()); ++ } ++ ++ @Override ++ public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Vesagent> iid, @Nonnull final Vesagent dataBefore, ++ @Nonnull final WriteContext writeContext) throws WriteFailedException { ++ Config config = dataBefore.getConfig(); ++ InstanceIdentifier<Config> id = iid.child(Config.class); ++ LOG.debug("Removing VES Agent {} dataBefore={}", id, config); ++ ++ checkArgument(config.getServerAddr() != null && config.getServerAddr().getValue() != null ++ && config.getServerPort() != 0, "VES Server Address and Port need to be configured"); ++ ++ ConfigBuilder configBuilder = new ConfigBuilder(); ++ configBuilder.setServerAddr(config.getServerAddr()) ++ .setServerPort(config.getServerPort()) ++ .setReadInterval(config.getReadInterval()) ++ .setIsAdd(0L); ++ ++ setVesAgentConfig(id, configBuilder.build()); ++ } ++ ++ private void setVesAgentConfig(final InstanceIdentifier<Config> id, final Config config) ++ throws WriteFailedException { ++ final VesAgentConfig request = new VesAgentConfig(); ++ ++ request.serverPort = config.getServerPort().byteValue(); ++ request.readInterval = config.getReadInterval().byteValue(); ++ request.isAdd = config.getIsAdd().byteValue(); ++ request.serverAddr = ipv4AddressNoZoneToArray(config.getServerAddr().getValue()); ++ ++ LOG.debug("VES agent config change id={} request={}", id, request); ++ getReplyForWrite(jvppVes.vesAgentConfig(request).toCompletableFuture(), id); ++ } ++} +diff --git a/vpp-integration/minimal-distribution/pom.xml b/vpp-integration/minimal-distribution/pom.xml +index e126114a..ca0e5b24 100644 +--- a/vpp-integration/minimal-distribution/pom.xml ++++ b/vpp-integration/minimal-distribution/pom.xml +@@ -40,6 +40,7 @@ + <routing.version>1.17.04.1-SNAPSHOT</routing.version> + <acl.version>1.17.04.1-SNAPSHOT</acl.version> + <dhcp.version>1.17.04.1-SNAPSHOT</dhcp.version> ++ <vesagent.version>1.17.04.1-SNAPSHOT</vesagent.version> + <vpp.classifier.version>1.17.04.1-SNAPSHOT</vpp.classifier.version> + <l3-impl.version>1.17.04.1-SNAPSHOT</l3-impl.version> + <vpp-management-impl.version>1.17.04.1-SNAPSHOT</vpp-management-impl.version> +@@ -63,6 +64,7 @@ + io.fd.hc2vpp.routing.RoutingModule, + io.fd.hc2vpp.acl.AclModule, + io.fd.hc2vpp.dhcp.DhcpModule, ++ io.fd.hc2vpp.ves.VesModule, + io.fd.hc2vpp.policer.PolicerModule, + // io.fd.hc2vpp.vppnsh.impl.VppNshModule, + <!-- Nsh module by default disabled, because it needs vpp-nsh plugin, which is not part of vpp codebase.--> +@@ -151,6 +153,11 @@ + <version>${dhcp.version}</version> + </dependency> + <dependency> ++ <groupId>io.fd.hc2vpp.ves</groupId> ++ <artifactId>ves-impl</artifactId> ++ <version>${vesagent.version}</version> ++ </dependency> ++ <dependency> + <groupId>io.fd.hc2vpp.management</groupId> + <artifactId>vpp-management-impl</artifactId> + <version>${vpp-management-impl.version}</version> +-- +2.12.2.windows.2 + diff --git a/vnfs/vCPE/vpp-ves-agent-for-vgmux/src/patches/Vpp-Add-VES-agent-for-vG-MUX.patch b/vnfs/vCPE/vpp-ves-agent-for-vgmux/src/patches/Vpp-Add-VES-agent-for-vG-MUX.patch new file mode 100644 index 00000000..d305edc9 --- /dev/null +++ b/vnfs/vCPE/vpp-ves-agent-for-vgmux/src/patches/Vpp-Add-VES-agent-for-vG-MUX.patch @@ -0,0 +1,12192 @@ +From 63b26bdf990ebf0105a0a4bc6977555820c70c5e Mon Sep 17 00:00:00 2001 +From: Johnson Li <johnson.li@intel.com> +Date: Fri, 8 Sep 2017 17:25:02 +0800 +Subject: [PATCH] Add VES agent for vG-MUX + +Signed-off-by: Johnson Li <johnson.li@intel.com> + +diff --git a/src/configure.ac b/src/configure.ac +index fb2ead6d..ea641525 100644 +--- a/src/configure.ac ++++ b/src/configure.ac +@@ -154,6 +154,7 @@ PLUGIN_ENABLED(lb) + PLUGIN_ENABLED(memif) + PLUGIN_ENABLED(sixrd) + PLUGIN_ENABLED(snat) ++PLUGIN_ENABLED(ves) + + ############################################################################### + # Dependency checks +diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am +index 623892e7..84513755 100644 +--- a/src/plugins/Makefile.am ++++ b/src/plugins/Makefile.am +@@ -69,6 +69,10 @@ if ENABLE_SNAT_PLUGIN + include snat.am + endif + ++if ENABLE_VES_PLUGIN ++include ves.am ++endif ++ + include ../suffix-rules.mk + + # Remove *.la files +diff --git a/src/plugins/ves.am b/src/plugins/ves.am +new file mode 100644 +index 00000000..faaa1126 +--- /dev/null ++++ b/src/plugins/ves.am +@@ -0,0 +1,35 @@ ++# Copyright (c) 2017 Intel and/or its affiliates. ++# 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. ++ ++vppplugins_LTLIBRARIES += ves_plugin.la ++ ++LIBS_DIR=$(CURDIR)/ves/libs ++ves_plugin_la_LDFLAGS = $(AM_LDFLAGS) -L$(LIBS_DIR) ++ves_plugin_la_LDFLAGS += -Wl,--whole-archive -level -Wl,--no-whole-archive ++ves_plugin_la_LDFLAGS += -Wl,-lpthread,-lcurl ++ ++ves_plugin_la_SOURCES = ves/ves_node.c \ ++ ves/ves_api.c ++ ++BUILT_SOURCES += \ ++ ves/ves.api.h \ ++ ves/ves.api.json ++ ++API_FILES += ves/ves.api ++ ++nobase_apiinclude_HEADERS += \ ++ ves/ves_all_api_h.h \ ++ ves/ves_msg_enum.h \ ++ ves/ves.api.h ++ ++# vi:syntax=automake +diff --git a/src/plugins/ves/include/double_list.h b/src/plugins/ves/include/double_list.h +new file mode 100644 +index 00000000..3bfae4c6 +--- /dev/null ++++ b/src/plugins/ves/include/double_list.h +@@ -0,0 +1,56 @@ ++#ifndef DOUBLE_LIST_INCLUDED ++#define DOUBLE_LIST_INCLUDED ++ ++/**************************************************************************//** ++ * @file ++ * A simple double-linked list. ++ * ++ * @note No thread protection so you will need to use appropriate ++ * synchronization if use spans multiple threads. ++ * ++ * License ++ * ------- ++ * ++ * Copyright © 2017 AT&T Intellectual Property. All rights reserved. ++ * ++ * 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. ++ * ++ ****************************************************************************/ ++ ++typedef struct dlist_item ++{ ++ struct dlist_item * previous; ++ struct dlist_item * next; ++ void * item; ++} DLIST_ITEM; ++ ++/**************************************************************************//** ++ * Double-linked list structure ++ *****************************************************************************/ ++typedef struct dlist ++{ ++ DLIST_ITEM * head; ++ DLIST_ITEM * tail; ++} DLIST; ++ ++ ++void dlist_initialize(DLIST * list); ++void * dlist_pop_last(DLIST * list); ++void dlist_push_first(DLIST * list, void * item); ++void dlist_push_last(DLIST * list, void * item); ++DLIST_ITEM * dlist_get_first(DLIST * list); ++DLIST_ITEM * dlist_get_last(DLIST * list); ++DLIST_ITEM * dlist_get_next(DLIST_ITEM * item); ++int dlist_is_empty(DLIST * list); ++int dlist_count(DLIST * list); ++ ++#endif +diff --git a/src/plugins/ves/include/evel.h b/src/plugins/ves/include/evel.h +new file mode 100644 +index 00000000..817785ef +--- /dev/null ++++ b/src/plugins/ves/include/evel.h +@@ -0,0 +1,3662 @@ ++#ifndef EVEL_INCLUDED ++#define EVEL_INCLUDED ++/**************************************************************************//** ++ * @file ++ * Header for EVEL library ++ * ++ * This file implements the EVEL library which is intended to provide a ++ * simple wrapper around the complexity of AT&T's Vendor Event Listener API so ++ * that VNFs can use it without worrying about details of the API transport. ++ * ++ * Zero return value is success (::EVEL_SUCCESS), non-zero is failure and will ++ * be one of ::EVEL_ERR_CODES. ++ * ++ * License ++ * ------- ++ * ++ * Copyright © 2017 AT&T Intellectual Property. All rights reserved. ++ * ++ * 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. ++ *****************************************************************************/ ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include <stdbool.h> ++#include <stdio.h> ++#include <stdarg.h> ++#include <time.h> ++ ++#include "double_list.h" ++ ++/*****************************************************************************/ ++/* Supported API version. */ ++/*****************************************************************************/ ++#define EVEL_API_MAJOR_VERSION 3 ++#define EVEL_API_MINOR_VERSION 0 ++ ++/**************************************************************************//** ++ * Error codes ++ * ++ * Error codes for EVEL low level interface ++ *****************************************************************************/ ++typedef enum { ++ EVEL_SUCCESS, /** The operation was successful. */ ++ EVEL_ERR_GEN_FAIL, /** Non-specific failure. */ ++ EVEL_CURL_LIBRARY_FAIL, /** A cURL library operation failed. */ ++ EVEL_PTHREAD_LIBRARY_FAIL, /** A Posix threads operation failed. */ ++ EVEL_OUT_OF_MEMORY, /** A memory allocation failure occurred. */ ++ EVEL_EVENT_BUFFER_FULL, /** Too many events in the ring-buffer. */ ++ EVEL_EVENT_HANDLER_INACTIVE, /** Attempt to raise event when inactive. */ ++ EVEL_NO_METADATA, /** Failed to retrieve OpenStack metadata. */ ++ EVEL_BAD_METADATA, /** OpenStack metadata invalid format. */ ++ EVEL_BAD_JSON_FORMAT, /** JSON failed to parse correctly. */ ++ EVEL_JSON_KEY_NOT_FOUND, /** Failed to find the specified JSON key. */ ++ EVEL_MAX_ERROR_CODES /** Maximum number of valid error codes. */ ++} EVEL_ERR_CODES; ++ ++/**************************************************************************//** ++ * Logging levels ++ * ++ * Variable levels of verbosity in the logging functions. ++ *****************************************************************************/ ++typedef enum { ++ EVEL_LOG_MIN = 0, ++ EVEL_LOG_SPAMMY = 30, ++ EVEL_LOG_DEBUG = 40, ++ EVEL_LOG_INFO = 50, ++ EVEL_LOG_ERROR = 60, ++ EVEL_LOG_MAX = 101 ++} EVEL_LOG_LEVELS; ++ ++/*****************************************************************************/ ++/* Maximum string lengths. */ ++/*****************************************************************************/ ++#define EVEL_MAX_STRING_LEN 4096 ++#define EVEL_MAX_JSON_BODY 16000 ++#define EVEL_MAX_ERROR_STRING_LEN 255 ++#define EVEL_MAX_URL_LEN 511 ++ ++/**************************************************************************//** ++ * This value represents there being no restriction on the reporting interval. ++ *****************************************************************************/ ++static const int EVEL_MEASUREMENT_INTERVAL_UKNOWN = 0; ++ ++/**************************************************************************//** ++ * How many events can be backed-up before we start dropping events on the ++ * floor. ++ * ++ * @note This value should be tuned in accordance with expected burstiness of ++ * the event load and the expected response time of the ECOMP event ++ * listener so that the probability of the buffer filling is suitably ++ * low. ++ *****************************************************************************/ ++static const int EVEL_EVENT_BUFFER_DEPTH = 100; ++ ++/*****************************************************************************/ ++/* How many different IP Types-of-Service are supported. */ ++/*****************************************************************************/ ++#define EVEL_TOS_SUPPORTED 256 ++ ++/**************************************************************************//** ++ * Event domains for the various events we support. ++ * JSON equivalent field: domain ++ *****************************************************************************/ ++typedef enum { ++ EVEL_DOMAIN_INTERNAL, /** Internal event, not for external routing. */ ++ EVEL_DOMAIN_HEARTBEAT, /** A Heartbeat event (event header only). */ ++ EVEL_DOMAIN_FAULT, /** A Fault event. */ ++ EVEL_DOMAIN_MEASUREMENT, /** A Measurement for VF Scaling event. */ ++ EVEL_DOMAIN_MOBILE_FLOW, /** A Mobile Flow event. */ ++ EVEL_DOMAIN_REPORT, /** A Measurement for VF Reporting event. */ ++ EVEL_DOMAIN_SERVICE, /** A Service event. */ ++ EVEL_DOMAIN_SIGNALING, /** A Signaling event. */ ++ EVEL_DOMAIN_STATE_CHANGE, /** A State Change event. */ ++ EVEL_DOMAIN_SYSLOG, /** A Syslog event. */ ++ EVEL_DOMAIN_OTHER, /** Another event. */ ++ EVEL_MAX_DOMAINS /** Maximum number of recognized Event types. */ ++} EVEL_EVENT_DOMAINS; ++ ++/**************************************************************************//** ++ * Event priorities. ++ * JSON equivalent field: priority ++ *****************************************************************************/ ++typedef enum { ++ EVEL_PRIORITY_HIGH, ++ EVEL_PRIORITY_MEDIUM, ++ EVEL_PRIORITY_NORMAL, ++ EVEL_PRIORITY_LOW, ++ EVEL_MAX_PRIORITIES ++} EVEL_EVENT_PRIORITIES; ++ ++/**************************************************************************//** ++ * Fault / Threshold severities. ++ * JSON equivalent field: eventSeverity ++ *****************************************************************************/ ++typedef enum { ++ EVEL_SEVERITY_CRITICAL, ++ EVEL_SEVERITY_MAJOR, ++ EVEL_SEVERITY_MINOR, ++ EVEL_SEVERITY_WARNING, ++ EVEL_SEVERITY_NORMAL, ++ EVEL_MAX_SEVERITIES ++} EVEL_SEVERITIES; ++ ++/**************************************************************************//** ++ * Fault source types. ++ * JSON equivalent field: eventSourceType ++ *****************************************************************************/ ++typedef enum { ++ EVEL_SOURCE_OTHER, ++ EVEL_SOURCE_ROUTER, ++ EVEL_SOURCE_SWITCH, ++ EVEL_SOURCE_HOST, ++ EVEL_SOURCE_CARD, ++ EVEL_SOURCE_PORT, ++ EVEL_SOURCE_SLOT_THRESHOLD, ++ EVEL_SOURCE_PORT_THRESHOLD, ++ EVEL_SOURCE_VIRTUAL_MACHINE, ++ EVEL_SOURCE_VIRTUAL_NETWORK_FUNCTION, ++ /***************************************************************************/ ++ /* START OF VENDOR-SPECIFIC VALUES */ ++ /* */ ++ /* Vendor-specific values should be added here, and handled appropriately */ ++ /* in evel_event.c. */ ++ /***************************************************************************/ ++ ++ /***************************************************************************/ ++ /* END OF VENDOR-SPECIFIC VALUES */ ++ /***************************************************************************/ ++ EVEL_MAX_SOURCE_TYPES ++} EVEL_SOURCE_TYPES; ++ ++/**************************************************************************//** ++ * Fault VNF Status. ++ * JSON equivalent field: vfStatus ++ *****************************************************************************/ ++typedef enum { ++ EVEL_VF_STATUS_ACTIVE, ++ EVEL_VF_STATUS_IDLE, ++ EVEL_VF_STATUS_PREP_TERMINATE, ++ EVEL_VF_STATUS_READY_TERMINATE, ++ EVEL_VF_STATUS_REQ_TERMINATE, ++ EVEL_MAX_VF_STATUSES ++} EVEL_VF_STATUSES; ++ ++/**************************************************************************//** ++ * Counter criticalities. ++ * JSON equivalent field: criticality ++ *****************************************************************************/ ++typedef enum { ++ EVEL_COUNTER_CRITICALITY_CRIT, ++ EVEL_COUNTER_CRITICALITY_MAJ, ++ EVEL_MAX_COUNTER_CRITICALITIES ++} EVEL_COUNTER_CRITICALITIES; ++ ++/**************************************************************************//** ++ * Alert actions. ++ * JSON equivalent field: alertAction ++ *****************************************************************************/ ++typedef enum { ++ EVEL_ALERT_ACTION_CLEAR, ++ EVEL_ALERT_ACTION_CONT, ++ EVEL_ALERT_ACTION_SET, ++ EVEL_MAX_ALERT_ACTIONS ++} EVEL_ALERT_ACTIONS; ++ ++/**************************************************************************//** ++ * Alert types. ++ * JSON equivalent field: alertType ++ *****************************************************************************/ ++typedef enum { ++ EVEL_ALERT_TYPE_CARD, ++ EVEL_ALERT_TYPE_ELEMENT, ++ EVEL_ALERT_TYPE_INTERFACE, ++ EVEL_ALERT_TYPE_SERVICE, ++ EVEL_MAX_ALERT_TYPES ++} EVEL_ALERT_TYPES; ++ ++/**************************************************************************//** ++ * Alert types. ++ * JSON equivalent fields: newState, oldState ++ *****************************************************************************/ ++typedef enum { ++ EVEL_ENTITY_STATE_IN_SERVICE, ++ EVEL_ENTITY_STATE_MAINTENANCE, ++ EVEL_ENTITY_STATE_OUT_OF_SERVICE, ++ EVEL_MAX_ENTITY_STATES ++} EVEL_ENTITY_STATE; ++ ++/**************************************************************************//** ++ * Syslog facilities. ++ * JSON equivalent field: syslogFacility ++ *****************************************************************************/ ++typedef enum { ++ EVEL_SYSLOG_FACILITY_KERNEL, ++ EVEL_SYSLOG_FACILITY_USER, ++ EVEL_SYSLOG_FACILITY_MAIL, ++ EVEL_SYSLOG_FACILITY_SYSTEM_DAEMON, ++ EVEL_SYSLOG_FACILITY_SECURITY_AUTH, ++ EVEL_SYSLOG_FACILITY_INTERNAL, ++ EVEL_SYSLOG_FACILITY_LINE_PRINTER, ++ EVEL_SYSLOG_FACILITY_NETWORK_NEWS, ++ EVEL_SYSLOG_FACILITY_UUCP, ++ EVEL_SYSLOG_FACILITY_CLOCK_DAEMON, ++ EVEL_SYSLOG_FACILITY_SECURITY_AUTH2, ++ EVEL_SYSLOG_FACILITY_FTP_DAEMON, ++ EVEL_SYSLOG_FACILITY_NTP, ++ EVEL_SYSLOG_FACILITY_LOG_AUDIT, ++ EVEL_SYSLOG_FACILITY_LOG_ALERT, ++ EVEL_SYSLOG_FACILITY_CLOCK_DAEMON2, ++ EVEL_SYSLOG_FACILITY_LOCAL0, ++ EVEL_SYSLOG_FACILITY_LOCAL1, ++ EVEL_SYSLOG_FACILITY_LOCAL2, ++ EVEL_SYSLOG_FACILITY_LOCAL3, ++ EVEL_SYSLOG_FACILITY_LOCAL4, ++ EVEL_SYSLOG_FACILITY_LOCAL5, ++ EVEL_SYSLOG_FACILITY_LOCAL6, ++ EVEL_SYSLOG_FACILITY_LOCAL7, ++ EVEL_MAX_SYSLOG_FACILITIES ++} EVEL_SYSLOG_FACILITIES; ++ ++/**************************************************************************//** ++ * TCP flags. ++ * JSON equivalent fields: tcpFlagCountList, tcpFlagList ++ *****************************************************************************/ ++typedef enum { ++ EVEL_TCP_NS, ++ EVEL_TCP_CWR, ++ EVEL_TCP_ECE, ++ EVEL_TCP_URG, ++ EVEL_TCP_ACK, ++ EVEL_TCP_PSH, ++ EVEL_TCP_RST, ++ EVEL_TCP_SYN, ++ EVEL_TCP_FIN, ++ EVEL_MAX_TCP_FLAGS ++} EVEL_TCP_FLAGS; ++ ++/**************************************************************************//** ++ * Mobile QCI Classes of Service. ++ * JSON equivalent fields: mobileQciCosCountList, mobileQciCosList ++ *****************************************************************************/ ++typedef enum { ++ ++ /***************************************************************************/ ++ /* UMTS Classes of Service. */ ++ /***************************************************************************/ ++ EVEL_QCI_COS_UMTS_CONVERSATIONAL, ++ EVEL_QCI_COS_UMTS_STREAMING, ++ EVEL_QCI_COS_UMTS_INTERACTIVE, ++ EVEL_QCI_COS_UMTS_BACKGROUND, ++ ++ /***************************************************************************/ ++ /* LTE Classes of Service. */ ++ /***************************************************************************/ ++ EVEL_QCI_COS_LTE_1, ++ EVEL_QCI_COS_LTE_2, ++ EVEL_QCI_COS_LTE_3, ++ EVEL_QCI_COS_LTE_4, ++ EVEL_QCI_COS_LTE_65, ++ EVEL_QCI_COS_LTE_66, ++ EVEL_QCI_COS_LTE_5, ++ EVEL_QCI_COS_LTE_6, ++ EVEL_QCI_COS_LTE_7, ++ EVEL_QCI_COS_LTE_8, ++ EVEL_QCI_COS_LTE_9, ++ EVEL_QCI_COS_LTE_69, ++ EVEL_QCI_COS_LTE_70, ++ EVEL_MAX_QCI_COS_TYPES ++} EVEL_QCI_COS_TYPES; ++ ++/**************************************************************************//** ++ * Service Event endpoint description ++ * JSON equivalent field: endpointDesc ++ *****************************************************************************/ ++typedef enum { ++ EVEL_SERVICE_ENDPOINT_CALLEE, ++ EVEL_SERVICE_ENDPOINT_CALLER, ++ EVEL_MAX_SERVICE_ENDPOINT_DESC ++} EVEL_SERVICE_ENDPOINT_DESC; ++ ++/**************************************************************************//** ++ * Boolean type for EVEL library. ++ *****************************************************************************/ ++typedef enum { ++ EVEL_FALSE, ++ EVEL_TRUE ++} EVEL_BOOLEAN; ++ ++/**************************************************************************//** ++ * Optional parameter holder for double. ++ *****************************************************************************/ ++typedef struct evel_option_double ++{ ++ double value; ++ EVEL_BOOLEAN is_set; ++} EVEL_OPTION_DOUBLE; ++ ++/**************************************************************************//** ++ * Optional parameter holder for string. ++ *****************************************************************************/ ++typedef struct evel_option_string ++{ ++ char * value; ++ EVEL_BOOLEAN is_set; ++} EVEL_OPTION_STRING; ++ ++/**************************************************************************//** ++ * Optional parameter holder for int. ++ *****************************************************************************/ ++typedef struct evel_option_int ++{ ++ int value; ++ EVEL_BOOLEAN is_set; ++} EVEL_OPTION_INT; ++ ++/**************************************************************************//** ++ * Optional parameter holder for unsigned long long. ++ *****************************************************************************/ ++typedef struct evel_option_ull ++{ ++ unsigned long long value; ++ EVEL_BOOLEAN is_set; ++} EVEL_OPTION_ULL; ++ ++/**************************************************************************//** ++ * Optional parameter holder for time_t. ++ *****************************************************************************/ ++typedef struct evel_option_time ++{ ++ time_t value; ++ EVEL_BOOLEAN is_set; ++} EVEL_OPTION_TIME; ++ ++/*****************************************************************************/ ++/* Supported Common Event Header version. */ ++/*****************************************************************************/ ++#define EVEL_HEADER_MAJOR_VERSION 1 ++#define EVEL_HEADER_MINOR_VERSION 2 ++ ++/**************************************************************************//** ++ * Event header. ++ * JSON equivalent field: commonEventHeader ++ *****************************************************************************/ ++typedef struct event_header { ++ /***************************************************************************/ ++ /* Version */ ++ /***************************************************************************/ ++ int major_version; ++ int minor_version; ++ ++ /***************************************************************************/ ++ /* Mandatory fields */ ++ /***************************************************************************/ ++ EVEL_EVENT_DOMAINS event_domain; ++ char * event_id; ++ char * source_name; ++ char * functional_role; ++ char * reporting_entity_name; ++ EVEL_EVENT_PRIORITIES priority; ++ unsigned long long start_epoch_microsec; ++ unsigned long long last_epoch_microsec; ++ int sequence; ++ ++ /***************************************************************************/ ++ /* Optional fields */ ++ /***************************************************************************/ ++ EVEL_OPTION_STRING event_type; ++ EVEL_OPTION_STRING source_id; ++ EVEL_OPTION_STRING reporting_entity_id; ++ ++} EVENT_HEADER; ++ ++/*****************************************************************************/ ++/* Supported Fault version. */ ++/*****************************************************************************/ ++#define EVEL_FAULT_MAJOR_VERSION 1 ++#define EVEL_FAULT_MINOR_VERSION 1 ++ ++/**************************************************************************//** ++ * Fault. ++ * JSON equivalent field: faultFields ++ *****************************************************************************/ ++typedef struct event_fault { ++ /***************************************************************************/ ++ /* Header and version */ ++ /***************************************************************************/ ++ EVENT_HEADER header; ++ int major_version; ++ int minor_version; ++ ++ /***************************************************************************/ ++ /* Mandatory fields */ ++ /***************************************************************************/ ++ EVEL_SEVERITIES event_severity; ++ EVEL_SOURCE_TYPES event_source_type; ++ char * alarm_condition; ++ char * specific_problem; ++ EVEL_VF_STATUSES vf_status; ++ ++ /***************************************************************************/ ++ /* Optional fields */ ++ /***************************************************************************/ ++ EVEL_OPTION_STRING alarm_interface_a; ++ DLIST additional_info; ++ ++} EVENT_FAULT; ++ ++/**************************************************************************//** ++ * Fault Additional Info. ++ * JSON equivalent field: alarmAdditionalInformation ++ *****************************************************************************/ ++typedef struct fault_additional_info { ++ char * name; ++ char * value; ++} FAULT_ADDL_INFO; ++ ++/*****************************************************************************/ ++/* Supported Measurement version. */ ++/*****************************************************************************/ ++#define EVEL_MEASUREMENT_MAJOR_VERSION 1 ++#define EVEL_MEASUREMENT_MINOR_VERSION 1 ++ ++/**************************************************************************//** ++ * Errors. ++ * JSON equivalent field: errors ++ *****************************************************************************/ ++typedef struct measurement_errors { ++ int receive_discards; ++ int receive_errors; ++ int transmit_discards; ++ int transmit_errors; ++} MEASUREMENT_ERRORS; ++ ++/**************************************************************************//** ++ * Measurement. ++ * JSON equivalent field: measurementsForVfScalingFields ++ *****************************************************************************/ ++typedef struct event_measurement { ++ /***************************************************************************/ ++ /* Header and version */ ++ /***************************************************************************/ ++ EVENT_HEADER header; ++ int major_version; ++ int minor_version; ++ ++ /***************************************************************************/ ++ /* Mandatory fields */ ++ /***************************************************************************/ ++ double measurement_interval; ++ ++ /***************************************************************************/ ++ /* Optional fields */ ++ /***************************************************************************/ ++ DLIST additional_measurements; ++ EVEL_OPTION_DOUBLE aggregate_cpu_usage; ++ DLIST codec_usage; ++ EVEL_OPTION_INT concurrent_sessions; ++ EVEL_OPTION_INT configured_entities; ++ DLIST cpu_usage; ++ MEASUREMENT_ERRORS * errors; ++ DLIST feature_usage; ++ DLIST filesystem_usage; ++ DLIST latency_distribution; ++ EVEL_OPTION_DOUBLE mean_request_latency; ++ EVEL_OPTION_DOUBLE memory_configured; ++ EVEL_OPTION_DOUBLE memory_used; ++ EVEL_OPTION_INT media_ports_in_use; ++ EVEL_OPTION_INT request_rate; ++ EVEL_OPTION_DOUBLE vnfc_scaling_metric; ++ DLIST vnic_usage; ++ ++} EVENT_MEASUREMENT; ++ ++/**************************************************************************//** ++ * CPU Usage. ++ * JSON equivalent field: cpuUsage ++ *****************************************************************************/ ++typedef struct measurement_cpu_use { ++ char * id; ++ double usage; ++} MEASUREMENT_CPU_USE; ++ ++/**************************************************************************//** ++ * Filesystem Usage. ++ * JSON equivalent field: filesystemUsage ++ *****************************************************************************/ ++typedef struct measurement_fsys_use { ++ char * filesystem_name; ++ double block_configured; ++ int block_iops; ++ double block_used; ++ double ephemeral_configured; ++ int ephemeral_iops; ++ double ephemeral_used; ++} MEASUREMENT_FSYS_USE; ++ ++/**************************************************************************//** ++ * Latency Bucket. ++ * JSON equivalent field: latencyBucketMeasure ++ *****************************************************************************/ ++typedef struct measurement_latency_bucket { ++ int count; ++ ++ /***************************************************************************/ ++ /* Optional fields */ ++ /***************************************************************************/ ++ EVEL_OPTION_DOUBLE high_end; ++ EVEL_OPTION_DOUBLE low_end; ++ ++} MEASUREMENT_LATENCY_BUCKET; ++ ++/**************************************************************************//** ++ * Virtual NIC usage. ++ * JSON equivalent field: vNicUsage ++ *****************************************************************************/ ++typedef struct measurement_vnic_use { ++ int bytes_in; ++ int bytes_out; ++ int packets_in; ++ int packets_out; ++ char * vnic_id; ++ ++ /***************************************************************************/ ++ /* Optional fields */ ++ /***************************************************************************/ ++ EVEL_OPTION_INT broadcast_packets_in; ++ EVEL_OPTION_INT broadcast_packets_out; ++ EVEL_OPTION_INT multicast_packets_in; ++ EVEL_OPTION_INT multicast_packets_out; ++ EVEL_OPTION_INT unicast_packets_in; ++ EVEL_OPTION_INT unicast_packets_out; ++ ++} MEASUREMENT_VNIC_USE; ++ ++/**************************************************************************//** ++ * Codec Usage. ++ * JSON equivalent field: codecsInUse ++ *****************************************************************************/ ++typedef struct measurement_codec_use { ++ char * codec_id; ++ int number_in_use; ++} MEASUREMENT_CODEC_USE; ++ ++/**************************************************************************//** ++ * Feature Usage. ++ * JSON equivalent field: featuresInUse ++ *****************************************************************************/ ++typedef struct measurement_feature_use { ++ char * feature_id; ++ int feature_utilization; ++} MEASUREMENT_FEATURE_USE; ++ ++/**************************************************************************//** ++ * Measurement Group. ++ * JSON equivalent field: additionalMeasurements ++ *****************************************************************************/ ++typedef struct measurement_group { ++ char * name; ++ DLIST measurements; ++} MEASUREMENT_GROUP; ++ ++/**************************************************************************//** ++ * Custom Defined Measurement. ++ * JSON equivalent field: measurements ++ *****************************************************************************/ ++typedef struct custom_measurement { ++ char * name; ++ char * value; ++} CUSTOM_MEASUREMENT; ++ ++/*****************************************************************************/ ++/* Supported Report version. */ ++/*****************************************************************************/ ++#define EVEL_REPORT_MAJOR_VERSION 1 ++#define EVEL_REPORT_MINOR_VERSION 1 ++ ++/**************************************************************************//** ++ * Report. ++ * JSON equivalent field: measurementsForVfReportingFields ++ * ++ * @note This is an experimental event type and is not currently a formal part ++ * of AT&T's specification. ++ *****************************************************************************/ ++typedef struct event_report { ++ /***************************************************************************/ ++ /* Header and version */ ++ /***************************************************************************/ ++ EVENT_HEADER header; ++ int major_version; ++ int minor_version; ++ ++ /***************************************************************************/ ++ /* Mandatory fields */ ++ /***************************************************************************/ ++ double measurement_interval; ++ ++ /***************************************************************************/ ++ /* Optional fields */ ++ /***************************************************************************/ ++ DLIST feature_usage; ++ DLIST measurement_groups; ++ ++} EVENT_REPORT; ++ ++/**************************************************************************//** ++ * Mobile GTP Per Flow Metrics. ++ * JSON equivalent field: gtpPerFlowMetrics ++ *****************************************************************************/ ++typedef struct mobile_gtp_per_flow_metrics { ++ double avg_bit_error_rate; ++ double avg_packet_delay_variation; ++ int avg_packet_latency; ++ int avg_receive_throughput; ++ int avg_transmit_throughput; ++ int flow_activation_epoch; ++ int flow_activation_microsec; ++ int flow_deactivation_epoch; ++ int flow_deactivation_microsec; ++ time_t flow_deactivation_time; ++ char * flow_status; ++ int max_packet_delay_variation; ++ int num_activation_failures; ++ int num_bit_errors; ++ int num_bytes_received; ++ int num_bytes_transmitted; ++ int num_dropped_packets; ++ int num_l7_bytes_received; ++ int num_l7_bytes_transmitted; ++ int num_lost_packets; ++ int num_out_of_order_packets; ++ int num_packet_errors; ++ int num_packets_received_excl_retrans; ++ int num_packets_received_incl_retrans; ++ int num_packets_transmitted_incl_retrans; ++ int num_retries; ++ int num_timeouts; ++ int num_tunneled_l7_bytes_received; ++ int round_trip_time; ++ int time_to_first_byte; ++ ++ /***************************************************************************/ ++ /* Optional fields */ ++ /***************************************************************************/ ++ EVEL_OPTION_INT ip_tos_counts[EVEL_TOS_SUPPORTED]; ++ EVEL_OPTION_INT tcp_flag_counts[EVEL_MAX_TCP_FLAGS]; ++ EVEL_OPTION_INT qci_cos_counts[EVEL_MAX_QCI_COS_TYPES]; ++ EVEL_OPTION_INT dur_connection_failed_status; ++ EVEL_OPTION_INT dur_tunnel_failed_status; ++ EVEL_OPTION_STRING flow_activated_by; ++ EVEL_OPTION_TIME flow_activation_time; ++ EVEL_OPTION_STRING flow_deactivated_by; ++ EVEL_OPTION_STRING gtp_connection_status; ++ EVEL_OPTION_STRING gtp_tunnel_status; ++ EVEL_OPTION_INT large_packet_rtt; ++ EVEL_OPTION_DOUBLE large_packet_threshold; ++ EVEL_OPTION_INT max_receive_bit_rate; ++ EVEL_OPTION_INT max_transmit_bit_rate; ++ EVEL_OPTION_INT num_gtp_echo_failures; ++ EVEL_OPTION_INT num_gtp_tunnel_errors; ++ EVEL_OPTION_INT num_http_errors; ++ ++} MOBILE_GTP_PER_FLOW_METRICS; ++ ++/*****************************************************************************/ ++/* Supported Mobile Flow version. */ ++/*****************************************************************************/ ++#define EVEL_MOBILE_FLOW_MAJOR_VERSION 1 ++#define EVEL_MOBILE_FLOW_MINOR_VERSION 1 ++ ++/**************************************************************************//** ++ * Mobile Flow. ++ * JSON equivalent field: mobileFlow ++ *****************************************************************************/ ++typedef struct event_mobile_flow { ++ /***************************************************************************/ ++ /* Header and version */ ++ /***************************************************************************/ ++ EVENT_HEADER header; ++ int major_version; ++ int minor_version; ++ ++ /***************************************************************************/ ++ /* Mandatory fields */ ++ /***************************************************************************/ ++ char * flow_direction; ++ MOBILE_GTP_PER_FLOW_METRICS * gtp_per_flow_metrics; ++ char * ip_protocol_type; ++ char * ip_version; ++ char * other_endpoint_ip_address; ++ int other_endpoint_port; ++ char * reporting_endpoint_ip_addr; ++ int reporting_endpoint_port; ++ ++ /***************************************************************************/ ++ /* Optional fields */ ++ /***************************************************************************/ ++ EVEL_OPTION_STRING application_type; ++ EVEL_OPTION_STRING app_protocol_type; ++ EVEL_OPTION_STRING app_protocol_version; ++ EVEL_OPTION_STRING cid; ++ EVEL_OPTION_STRING connection_type; ++ EVEL_OPTION_STRING ecgi; ++ EVEL_OPTION_STRING gtp_protocol_type; ++ EVEL_OPTION_STRING gtp_version; ++ EVEL_OPTION_STRING http_header; ++ EVEL_OPTION_STRING imei; ++ EVEL_OPTION_STRING imsi; ++ EVEL_OPTION_STRING lac; ++ EVEL_OPTION_STRING mcc; ++ EVEL_OPTION_STRING mnc; ++ EVEL_OPTION_STRING msisdn; ++ EVEL_OPTION_STRING other_functional_role; ++ EVEL_OPTION_STRING rac; ++ EVEL_OPTION_STRING radio_access_technology; ++ EVEL_OPTION_STRING sac; ++ EVEL_OPTION_INT sampling_algorithm; ++ EVEL_OPTION_STRING tac; ++ EVEL_OPTION_STRING tunnel_id; ++ EVEL_OPTION_STRING vlan_id; ++ ++} EVENT_MOBILE_FLOW; ++ ++/**************************************************************************//** ++ * Other. ++ * JSON equivalent field: otherFields ++ *****************************************************************************/ ++typedef struct event_other { ++ EVENT_HEADER header; ++ DLIST other_fields; ++ ++} EVENT_OTHER; ++ ++/**************************************************************************//** ++ * Other Field. ++ * JSON equivalent field: otherFields ++ *****************************************************************************/ ++typedef struct other_field { ++ char * name; ++ char * value; ++} OTHER_FIELD; ++ ++/**************************************************************************//** ++ * Event Instance Identifier ++ * JSON equivalent field: eventInstanceIdentifier ++ *****************************************************************************/ ++typedef struct evel_event_instance_id { ++ ++ /***************************************************************************/ ++ /* Mandatory fields */ ++ /***************************************************************************/ ++ char * vendor_id; /* JSON: vendorId */ ++ char * event_id; /* JSON: eventId */ ++ ++ /***************************************************************************/ ++ /* Optional fields */ ++ /***************************************************************************/ ++ EVEL_OPTION_STRING product_id; /* JSON: productId */ ++ EVEL_OPTION_STRING subsystem_id; /* JSON: subsystemId */ ++ EVEL_OPTION_STRING event_friendly_name; /* JSON: eventFriendlyName */ ++ ++} EVEL_EVENT_INSTANCE_ID; ++ ++/*****************************************************************************/ ++/* Supported Service Events version. */ ++/*****************************************************************************/ ++#define EVEL_SERVICE_MAJOR_VERSION 1 ++#define EVEL_SERVICE_MINOR_VERSION 1 ++ ++/**************************************************************************//** ++ * Service Events. ++ * JSON equivalent field: serviceEventsFields ++ *****************************************************************************/ ++typedef struct event_service { ++ /***************************************************************************/ ++ /* Header and version */ ++ /***************************************************************************/ ++ EVENT_HEADER header; ++ int major_version; ++ int minor_version; ++ ++ /***************************************************************************/ ++ /* Mandatory fields */ ++ /***************************************************************************/ ++ EVEL_EVENT_INSTANCE_ID instance_id; /* JSON: eventInstanceIdentifier */ ++ ++ /***************************************************************************/ ++ /* Optional fields. */ ++ /***************************************************************************/ ++ EVEL_OPTION_STRING correlator; /* JSON: correlator */ ++ DLIST additional_fields; /* JSON: additionalFields */ ++ ++ /***************************************************************************/ ++ /* Optional fields within JSON equivalent object: codecSelected */ ++ /***************************************************************************/ ++ EVEL_OPTION_STRING codec; /* JSON: codec */ ++ ++ /***************************************************************************/ ++ /* Optional fields within JSON equivalent object: codecSelectedTranscoding */ ++ /***************************************************************************/ ++ EVEL_OPTION_STRING callee_side_codec; /* JSON: calleeSideCodec */ ++ EVEL_OPTION_STRING caller_side_codec; /* JSON: callerSideCodec */ ++ ++ /***************************************************************************/ ++ /* Optional fields within JSON equivalent object: midCallRtcp */ ++ /***************************************************************************/ ++ EVEL_OPTION_STRING rtcp_data; /* JSON: rtcpData */ ++ ++ /***************************************************************************/ ++ /* Optional fields within JSON equivalent object: endOfCallVqmSummaries */ ++ /***************************************************************************/ ++ EVEL_OPTION_STRING adjacency_name; /* JSON: adjacencyName */ ++ EVEL_OPTION_STRING endpoint_description; /* JSON: endpointDescription */ ++ EVEL_OPTION_INT endpoint_jitter; /* JSON: endpointJitter */ ++ EVEL_OPTION_INT endpoint_rtp_oct_disc; /* JSON: endpointRtpOctetsDiscarded */ ++ EVEL_OPTION_INT endpoint_rtp_oct_recv; /* JSON: endpointRtpOctetsReceived */ ++ EVEL_OPTION_INT endpoint_rtp_oct_sent; /* JSON: endpointRtpOctetsSent */ ++ EVEL_OPTION_INT endpoint_rtp_pkt_disc;/* JSON: endpointRtpPacketsDiscarded */ ++ EVEL_OPTION_INT endpoint_rtp_pkt_recv; /* JSON: endpointRtpPacketsReceived */ ++ EVEL_OPTION_INT endpoint_rtp_pkt_sent; /* JSON: endpointRtpPacketsSent */ ++ EVEL_OPTION_INT local_jitter; /* JSON: localJitter */ ++ EVEL_OPTION_INT local_rtp_oct_disc; /* JSON: localRtpOctetsDiscarded */ ++ EVEL_OPTION_INT local_rtp_oct_recv; /* JSON: localRtpOctetsReceived */ ++ EVEL_OPTION_INT local_rtp_oct_sent; /* JSON: localRtpOctetsSent */ ++ EVEL_OPTION_INT local_rtp_pkt_disc; /* JSON: localRtpPacketsDiscarded */ ++ EVEL_OPTION_INT local_rtp_pkt_recv; /* JSON: localRtpPacketsReceived */ ++ EVEL_OPTION_INT local_rtp_pkt_sent; /* JSON: localRtpPacketsSent */ ++ EVEL_OPTION_DOUBLE mos_cqe; /* JSON: mosCqe */ ++ EVEL_OPTION_INT packets_lost; /* JSON: packetsLost */ ++ EVEL_OPTION_DOUBLE packet_loss_percent; /* JSON: packetLossPercent */ ++ EVEL_OPTION_INT r_factor; /* JSON: rFactor */ ++ EVEL_OPTION_INT round_trip_delay; /* JSON: roundTripDelay */ ++ ++ /***************************************************************************/ ++ /* Optional fields within JSON equivalent object: marker */ ++ /***************************************************************************/ ++ EVEL_OPTION_STRING phone_number; /* JSON: phoneNumber */ ++ ++} EVENT_SERVICE; ++ ++/*****************************************************************************/ ++/* Supported Signaling version. */ ++/*****************************************************************************/ ++#define EVEL_SIGNALING_MAJOR_VERSION 1 ++#define EVEL_SIGNALING_MINOR_VERSION 1 ++ ++/**************************************************************************//** ++ * Signaling. ++ * JSON equivalent field: signalingFields ++ *****************************************************************************/ ++typedef struct event_signaling { ++ /***************************************************************************/ ++ /* Header and version */ ++ /***************************************************************************/ ++ EVENT_HEADER header; ++ int major_version; ++ int minor_version; ++ ++ /***************************************************************************/ ++ /* Mandatory fields */ ++ /***************************************************************************/ ++ EVEL_EVENT_INSTANCE_ID instance_id; /* JSON: eventInstanceIdentifier */ ++ ++ /***************************************************************************/ ++ /* Optional fields */ ++ /***************************************************************************/ ++ EVEL_OPTION_STRING correlator; /* JSON: correlator */ ++ EVEL_OPTION_STRING local_ip_address; /* JSON: localIpAddress */ ++ EVEL_OPTION_STRING local_port; /* JSON: localPort */ ++ EVEL_OPTION_STRING remote_ip_address; /* JSON: remoteIpAddress */ ++ EVEL_OPTION_STRING remote_port; /* JSON: remotePort */ ++ EVEL_OPTION_STRING compressed_sip; /* JSON: compressedSip */ ++ EVEL_OPTION_STRING summary_sip; /* JSON: summarySip */ ++ ++} EVENT_SIGNALING; ++ ++/*****************************************************************************/ ++/* Supported State Change version. */ ++/*****************************************************************************/ ++#define EVEL_STATE_CHANGE_MAJOR_VERSION 1 ++#define EVEL_STATE_CHANGE_MINOR_VERSION 1 ++ ++/**************************************************************************//** ++ * State Change. ++ * JSON equivalent field: stateChangeFields ++ *****************************************************************************/ ++typedef struct event_state_change { ++ /***************************************************************************/ ++ /* Header and version */ ++ /***************************************************************************/ ++ EVENT_HEADER header; ++ int major_version; ++ int minor_version; ++ ++ /***************************************************************************/ ++ /* Mandatory fields */ ++ /***************************************************************************/ ++ EVEL_ENTITY_STATE new_state; ++ EVEL_ENTITY_STATE old_state; ++ char * state_interface; ++ ++ /***************************************************************************/ ++ /* Optional fields */ ++ /***************************************************************************/ ++ DLIST additional_fields; ++ ++} EVENT_STATE_CHANGE; ++ ++/**************************************************************************//** ++ * State Change Additional Field. ++ * JSON equivalent field: additionalFields ++ *****************************************************************************/ ++typedef struct state_change_additional_field { ++ char * name; ++ char * value; ++} STATE_CHANGE_ADDL_FIELD; ++ ++/*****************************************************************************/ ++/* Supported Syslog version. */ ++/*****************************************************************************/ ++#define EVEL_SYSLOG_MAJOR_VERSION 1 ++#define EVEL_SYSLOG_MINOR_VERSION 1 ++ ++/**************************************************************************//** ++ * Syslog. ++ * JSON equivalent field: syslogFields ++ *****************************************************************************/ ++typedef struct event_syslog { ++ /***************************************************************************/ ++ /* Header and version */ ++ /***************************************************************************/ ++ EVENT_HEADER header; ++ int major_version; ++ int minor_version; ++ ++ /***************************************************************************/ ++ /* Mandatory fields */ ++ /***************************************************************************/ ++ EVEL_SOURCE_TYPES event_source_type; ++ char * syslog_msg; ++ char * syslog_tag; ++ ++ /***************************************************************************/ ++ /* Optional fields */ ++ /***************************************************************************/ ++ DLIST additional_fields; ++ EVEL_OPTION_STRING event_source_host; ++ EVEL_OPTION_INT syslog_facility; ++ EVEL_OPTION_STRING syslog_proc; ++ EVEL_OPTION_INT syslog_proc_id; ++ EVEL_OPTION_STRING syslog_s_data; ++ EVEL_OPTION_INT syslog_ver; ++ ++} EVENT_SYSLOG; ++ ++/**************************************************************************//** ++ * Syslog Additional Field. ++ * JSON equivalent field: additionalFields ++ *****************************************************************************/ ++typedef struct syslog_additional_field { ++ char * name; ++ char * value; ++} SYSLOG_ADDL_FIELD; ++ ++/**************************************************************************//** ++ * Copyright. ++ * JSON equivalent object: attCopyrightNotice ++ *****************************************************************************/ ++typedef struct copyright { ++ char * useAndRedistribution; ++ char * condition1; ++ char * condition2; ++ char * condition3; ++ char * condition4; ++ char * disclaimerLine1; ++ char * disclaimerLine2; ++ char * disclaimerLine3; ++ char * disclaimerLine4; ++} COPYRIGHT; ++ ++/**************************************************************************//** ++ * Library initialization. ++ * ++ * Initialize the EVEL library. ++ * ++ * @note This function initializes the cURL library. Applications making use ++ * of libcurl may need to pull the initialization out of here. Note ++ * also that this function is not threadsafe as a result - refer to ++ * libcurl's API documentation for relevant warnings. ++ * ++ * @sa Matching Term function. ++ * ++ * @param fqdn The API's FQDN or IP address. ++ * @param port The API's port. ++ * @param path The optional path (may be NULL). ++ * @param topic The optional topic part of the URL (may be NULL). ++ * @param secure Whether to use HTTPS (0=HTTP, 1=HTTPS). ++ * @param username Username for Basic Authentication of requests. ++ * @param password Password for Basic Authentication of requests. ++ * @param source_type The kind of node we represent. ++ * @param role The role this node undertakes. ++ * @param verbosity 0 for normal operation, positive values for chattier ++ * logs. ++ * ++ * @returns Status code ++ * @retval EVEL_SUCCESS On success ++ * @retval ::EVEL_ERR_CODES On failure. ++ *****************************************************************************/ ++EVEL_ERR_CODES evel_initialize(const char * const fqdn, ++ int port, ++ const char * const path, ++ const char * const topic, ++ int secure, ++ const char * const username, ++ const char * const password, ++ EVEL_SOURCE_TYPES source_type, ++ const char * const role, ++ int verbosity ++ ); ++ ++/**************************************************************************//** ++ * Clean up the EVEL library. ++ * ++ * @note that at present don't expect Init/Term cycling not to leak memory! ++ * ++ * @returns Status code ++ * @retval EVEL_SUCCESS On success ++ * @retval "One of ::EVEL_ERR_CODES" On failure. ++ *****************************************************************************/ ++EVEL_ERR_CODES evel_terminate(void); ++ ++EVEL_ERR_CODES evel_post_event(EVENT_HEADER * event); ++const char * evel_error_string(void); ++ ++ ++/**************************************************************************//** ++ * Free an event. ++ * ++ * Free off the event supplied. Will free all the contained allocated memory. ++ * ++ * @note It is safe to free a NULL pointer. ++ *****************************************************************************/ ++void evel_free_event(void * event); ++ ++/**************************************************************************//** ++ * Encode the event as a JSON event object according to AT&T's schema. ++ * ++ * @param json Pointer to where to store the JSON encoded data. ++ * @param max_size Size of storage available in json_body. ++ * @param event Pointer to the ::EVENT_HEADER to encode. ++ * @returns Number of bytes actually written. ++ *****************************************************************************/ ++int evel_json_encode_event(char * json, ++ int max_size, ++ EVENT_HEADER * event); ++ ++/**************************************************************************//** ++ * Callback function to provide returned data. ++ * ++ * Copy data into the supplied buffer, write_callback::ptr, checking size ++ * limits. ++ * ++ * @returns Number of bytes placed into write_callback::ptr. 0 for EOF. ++ *****************************************************************************/ ++size_t evel_write_callback(void *contents, ++ size_t size, ++ size_t nmemb, ++ void *userp); ++ ++/*****************************************************************************/ ++/*****************************************************************************/ ++/* */ ++/* HEARTBEAT - (includes common header, too) */ ++/* */ ++/*****************************************************************************/ ++/*****************************************************************************/ ++ ++/**************************************************************************//** ++ * Create a new heartbeat event. ++ * ++ * @note that the heartbeat is just a "naked" commonEventHeader! ++ * ++ * @returns pointer to the newly manufactured ::EVENT_HEADER. If the event is ++ * not used it must be released using ::evel_free_event ++ * @retval NULL Failed to create the event. ++ *****************************************************************************/ ++EVENT_HEADER * evel_new_heartbeat(void); ++ ++/**************************************************************************//** ++ * Free an event header. ++ * ++ * Free off the event header supplied. Will free all the contained allocated ++ * memory. ++ * ++ * @note It does not free the header itself, since that may be part of a ++ * larger structure. ++ *****************************************************************************/ ++void evel_free_header(EVENT_HEADER * const event); ++ ++/**************************************************************************//** ++ * Initialize a newly created event header. ++ * ++ * @param header Pointer to the header being initialized. ++ *****************************************************************************/ ++void evel_init_header(EVENT_HEADER * const header); ++ ++/**************************************************************************//** ++ * Set the Event Type property of the event header. ++ * ++ * @param header Pointer to the ::EVENT_HEADER. ++ * @param type The Event Type to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_header_type_set(EVENT_HEADER * const header, ++ const char * const type); ++ ++/**************************************************************************//** ++ * Set the Start Epoch property of the event header. ++ * ++ * @note The Start Epoch defaults to the time of event creation. ++ * ++ * @param header Pointer to the ::EVENT_HEADER. ++ * @param start_epoch_microsec ++ * The start epoch to set, in microseconds. ++ *****************************************************************************/ ++void evel_start_epoch_set(EVENT_HEADER * const header, ++ const unsigned long long start_epoch_microsec); ++ ++/**************************************************************************//** ++ * Set the Last Epoch property of the event header. ++ * ++ * @note The Last Epoch defaults to the time of event creation. ++ * ++ * @param header Pointer to the ::EVENT_HEADER. ++ * @param last_epoch_microsec ++ * The last epoch to set, in microseconds. ++ *****************************************************************************/ ++void evel_last_epoch_set(EVENT_HEADER * const header, ++ const unsigned long long last_epoch_microsec); ++ ++/**************************************************************************//** ++ * Set the Reporting Entity Name property of the event header. ++ * ++ * @note The Reporting Entity Name defaults to the OpenStack VM Name. ++ * ++ * @param header Pointer to the ::EVENT_HEADER. ++ * @param entity_name The entity name to set. ++ *****************************************************************************/ ++void evel_reporting_entity_name_set(EVENT_HEADER * const header, ++ const char * const entity_name); ++ ++/**************************************************************************//** ++ * Set the Reporting Entity Id property of the event header. ++ * ++ * @note The Reporting Entity Id defaults to the OpenStack VM UUID. ++ * ++ * @param header Pointer to the ::EVENT_HEADER. ++ * @param entity_id The entity id to set. ++ *****************************************************************************/ ++void evel_reporting_entity_id_set(EVENT_HEADER * const header, ++ const char * const entity_id); ++ ++/*****************************************************************************/ ++/*****************************************************************************/ ++/* */ ++/* FAULT */ ++/* */ ++/*****************************************************************************/ ++/*****************************************************************************/ ++ ++/**************************************************************************//** ++ * Create a new fault event. ++ * ++ * ++ * @returns pointer to the newly manufactured ::EVENT_FAULT. If the event is ++ * not used it must be released using ::evel_free_fault ++ * @retval NULL Failed to create the event. ++ *****************************************************************************/ ++EVENT_FAULT * evel_new_fault(const char * const condition, ++ const char * const specific_problem, ++ EVEL_EVENT_PRIORITIES priority, ++ EVEL_SEVERITIES severity); ++ ++/**************************************************************************//** ++ * Free a Fault. ++ * ++ * Free off the Fault supplied. Will free all the contained allocated memory. ++ * ++ * @note It does not free the Fault itself, since that may be part of a ++ * larger structure. ++ *****************************************************************************/ ++void evel_free_fault(EVENT_FAULT * event); ++ ++ ++/**************************************************************************//** ++ * Set the Alarm Interface A property of the Fault. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param fault Pointer to the fault. ++ * @param interface The Alarm Interface A to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_fault_interface_set(EVENT_FAULT * fault, ++ const char * const interface); ++ ++/**************************************************************************//** ++ * Add an additional value name/value pair to the Fault. ++ * ++ * The name and value are null delimited ASCII strings. The library takes ++ * a copy so the caller does not have to preserve values after the function ++ * returns. ++ * ++ * @param fault Pointer to the fault. ++ * @param name ASCIIZ string with the attribute's name. ++ * @param value ASCIIZ string with the attribute's value. ++ *****************************************************************************/ ++void evel_fault_addl_info_add(EVENT_FAULT * fault, char * name, char * value); ++ ++/**************************************************************************//** ++ * Set the Event Type property of the Fault. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param fault Pointer to the fault. ++ * @param type The Event Type to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_fault_type_set(EVENT_FAULT * fault, const char * const type); ++ ++/*****************************************************************************/ ++/*****************************************************************************/ ++/* */ ++/* MEASUREMENT */ ++/* */ ++/*****************************************************************************/ ++/*****************************************************************************/ ++ ++/**************************************************************************//** ++ * Create a new Measurement event. ++ * ++ * @note The mandatory fields on the Measurement must be supplied to this ++ * factory function and are immutable once set. Optional fields have ++ * explicit setter functions, but again values may only be set once so ++ * that the Measurement has immutable properties. ++ * ++ * @param measurement_interval ++ * ++ * @returns pointer to the newly manufactured ::EVENT_MEASUREMENT. If the ++ * event is not used (i.e. posted) it must be released using ++ * ::evel_free_event. ++ * @retval NULL Failed to create the event. ++ *****************************************************************************/ ++EVENT_MEASUREMENT * evel_new_measurement(double measurement_interval); ++ ++/**************************************************************************//** ++ * Free a Measurement. ++ * ++ * Free off the Measurement supplied. Will free all the contained allocated ++ * memory. ++ * ++ * @note It does not free the Measurement itself, since that may be part of a ++ * larger structure. ++ *****************************************************************************/ ++void evel_free_measurement(EVENT_MEASUREMENT * event); ++ ++/**************************************************************************//** ++ * Set the Event Type property of the Measurement. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param measurement Pointer to the Measurement. ++ * @param type The Event Type to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_measurement_type_set(EVENT_MEASUREMENT * measurement, ++ const char * const type); ++ ++/**************************************************************************//** ++ * Set the Concurrent Sessions property of the Measurement. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param measurement Pointer to the Measurement. ++ * @param concurrent_sessions The Concurrent Sessions to be set. ++ *****************************************************************************/ ++void evel_measurement_conc_sess_set(EVENT_MEASUREMENT * measurement, ++ int concurrent_sessions); ++ ++/**************************************************************************//** ++ * Set the Configured Entities property of the Measurement. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param measurement Pointer to the Measurement. ++ * @param configured_entities The Configured Entities to be set. ++ *****************************************************************************/ ++void evel_measurement_cfg_ents_set(EVENT_MEASUREMENT * measurement, ++ int configured_entities); ++ ++/**************************************************************************//** ++ * Add an additional set of Errors to the Measurement. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param measurement Pointer to the measurement. ++ * @param receive_discards The number of receive discards. ++ * @param receive_errors The number of receive errors. ++ * @param transmit_discards The number of transmit discards. ++ * @param transmit_errors The number of transmit errors. ++ *****************************************************************************/ ++void evel_measurement_errors_set(EVENT_MEASUREMENT * measurement, ++ int receive_discards, ++ int receive_errors, ++ int transmit_discards, ++ int transmit_errors); ++ ++/**************************************************************************//** ++ * Set the Mean Request Latency property of the Measurement. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param measurement Pointer to the Measurement. ++ * @param mean_request_latency The Mean Request Latency to be set. ++ *****************************************************************************/ ++void evel_measurement_mean_req_lat_set(EVENT_MEASUREMENT * measurement, ++ double mean_request_latency); ++ ++/**************************************************************************//** ++ * Set the Memory Configured property of the Measurement. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param measurement Pointer to the Measurement. ++ * @param memory_configured The Memory Configured to be set. ++ *****************************************************************************/ ++void evel_measurement_mem_cfg_set(EVENT_MEASUREMENT * measurement, ++ double memory_configured); ++ ++/**************************************************************************//** ++ * Set the Memory Used property of the Measurement. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param measurement Pointer to the Measurement. ++ * @param memory_used The Memory Used to be set. ++ *****************************************************************************/ ++void evel_measurement_mem_used_set(EVENT_MEASUREMENT * measurement, ++ double memory_used); ++ ++/**************************************************************************//** ++ * Set the Request Rate property of the Measurement. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param measurement Pointer to the Measurement. ++ * @param request_rate The Request Rate to be set. ++ *****************************************************************************/ ++void evel_measurement_request_rate_set(EVENT_MEASUREMENT * measurement, ++ int request_rate); ++ ++/**************************************************************************//** ++ * Add an additional CPU usage value name/value pair to the Measurement. ++ * ++ * The name and value are null delimited ASCII strings. The library takes ++ * a copy so the caller does not have to preserve values after the function ++ * returns. ++ * ++ * @param measurement Pointer to the measurement. ++ * @param id ASCIIZ string with the CPU's identifier. ++ * @param usage CPU utilization. ++ *****************************************************************************/ ++void evel_measurement_cpu_use_add(EVENT_MEASUREMENT * measurement, ++ char * id, double usage); ++ ++/**************************************************************************//** ++ * Add an additional File System usage value name/value pair to the ++ * Measurement. ++ * ++ * The filesystem_name is null delimited ASCII string. The library takes a ++ * copy so the caller does not have to preserve values after the function ++ * returns. ++ * ++ * @param measurement Pointer to the measurement. ++ * @param filesystem_name ASCIIZ string with the file-system's UUID. ++ * @param block_configured Block storage configured. ++ * @param block_used Block storage in use. ++ * @param block_iops Block storage IOPS. ++ * @param ephemeral_configured Ephemeral storage configured. ++ * @param ephemeral_used Ephemeral storage in use. ++ * @param ephemeral_iops Ephemeral storage IOPS. ++ *****************************************************************************/ ++void evel_measurement_fsys_use_add(EVENT_MEASUREMENT * measurement, ++ char * filesystem_name, ++ double block_configured, ++ double block_used, ++ int block_iops, ++ double ephemeral_configured, ++ double ephemeral_used, ++ int ephemeral_iops); ++ ++/**************************************************************************//** ++ * Add a Feature usage value name/value pair to the Measurement. ++ * ++ * The name is null delimited ASCII string. The library takes ++ * a copy so the caller does not have to preserve values after the function ++ * returns. ++ * ++ * @param measurement Pointer to the measurement. ++ * @param feature ASCIIZ string with the feature's name. ++ * @param utilization Utilization of the feature. ++ *****************************************************************************/ ++void evel_measurement_feature_use_add(EVENT_MEASUREMENT * measurement, ++ char * feature, ++ int utilization); ++ ++/**************************************************************************//** ++ * Add a Additional Measurement value name/value pair to the Measurement. ++ * ++ * The name is null delimited ASCII string. The library takes ++ * a copy so the caller does not have to preserve values after the function ++ * returns. ++ * ++ * @param measurement Pointer to the Measurement. ++ * @param group ASCIIZ string with the measurement group's name. ++ * @param name ASCIIZ string containing the measurement's name. ++ * @param name ASCIIZ string containing the measurement's value. ++ *****************************************************************************/ ++void evel_measurement_custom_measurement_add(EVENT_MEASUREMENT * measurement, ++ const char * const group, ++ const char * const name, ++ const char * const value); ++ ++/**************************************************************************//** ++ * Add a Codec usage value name/value pair to the Measurement. ++ * ++ * The name is null delimited ASCII string. The library takes ++ * a copy so the caller does not have to preserve values after the function ++ * returns. ++ * ++ * @param measurement Pointer to the measurement. ++ * @param codec ASCIIZ string with the codec's name. ++ * @param utilization Utilization of the feature. ++ *****************************************************************************/ ++void evel_measurement_codec_use_add(EVENT_MEASUREMENT * measurement, ++ char * codec, ++ int utilization); ++ ++/**************************************************************************//** ++} ++ * Set the Aggregate CPU Use property of the Measurement. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param measurement Pointer to the measurement. ++ * @param cpu_use The CPU use to set. ++ *****************************************************************************/ ++void evel_measurement_agg_cpu_use_set(EVENT_MEASUREMENT * measurement, ++ double cpu_use); ++ ++/**************************************************************************//** ++ * Set the Media Ports in Use property of the Measurement. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param measurement Pointer to the measurement. ++ * @param media_ports_in_use The media port usage to set. ++ *****************************************************************************/ ++void evel_measurement_media_port_use_set(EVENT_MEASUREMENT * measurement, ++ int media_ports_in_use); ++ ++/**************************************************************************//** ++ * Set the VNFC Scaling Metric property of the Measurement. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param measurement Pointer to the measurement. ++ * @param scaling_metric The scaling metric to set. ++ *****************************************************************************/ ++void evel_measurement_vnfc_scaling_metric_set(EVENT_MEASUREMENT * measurement, ++ double scaling_metric); ++ ++/**************************************************************************//** ++ * Create a new Latency Bucket to be added to a Measurement event. ++ * ++ * @note The mandatory fields on the ::MEASUREMENT_LATENCY_BUCKET must be ++ * supplied to this factory function and are immutable once set. ++ * Optional fields have explicit setter functions, but again values ++ * may only be set once so that the ::MEASUREMENT_LATENCY_BUCKET has ++ * immutable properties. ++ * ++ * @param count Count of events in this bucket. ++ * ++ * @returns pointer to the newly manufactured ::MEASUREMENT_LATENCY_BUCKET. ++ * @retval NULL Failed to create the Latency Bucket. ++ *****************************************************************************/ ++MEASUREMENT_LATENCY_BUCKET * evel_new_meas_latency_bucket(const int count); ++ ++/**************************************************************************//** ++ * Set the High End property of the Measurement Latency Bucket. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param bucket Pointer to the Measurement Latency Bucket. ++ * @param high_end High end of the bucket's range. ++ *****************************************************************************/ ++void evel_meas_latency_bucket_high_end_set( ++ MEASUREMENT_LATENCY_BUCKET * const bucket, ++ const double high_end); ++ ++/**************************************************************************//** ++ * Set the Low End property of the Measurement Latency Bucket. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param bucket Pointer to the Measurement Latency Bucket. ++ * @param low_end Low end of the bucket's range. ++ *****************************************************************************/ ++void evel_meas_latency_bucket_low_end_set( ++ MEASUREMENT_LATENCY_BUCKET * const bucket, ++ const double low_end); ++ ++/**************************************************************************//** ++ * Add an additional Measurement Latency Bucket to the specified event. ++ * ++ * @param measurement Pointer to the Measurement event. ++ * @param bucket Pointer to the Measurement Latency Bucket to add. ++ *****************************************************************************/ ++void evel_meas_latency_bucket_add(EVENT_MEASUREMENT * const measurement, ++ MEASUREMENT_LATENCY_BUCKET * const bucket); ++ ++/**************************************************************************//** ++ * Add an additional Latency Distribution bucket to the Measurement. ++ * ++ * This function implements the previous API, purely for convenience. ++ * ++ * @param measurement Pointer to the measurement. ++ * @param low_end Low end of the bucket's range. ++ * @param high_end High end of the bucket's range. ++ * @param count Count of events in this bucket. ++ *****************************************************************************/ ++void evel_measurement_latency_add(EVENT_MEASUREMENT * const measurement, ++ const double low_end, ++ const double high_end, ++ const int count); ++ ++/**************************************************************************//** ++ * Create a new vNIC Use to be added to a Measurement event. ++ * ++ * @note The mandatory fields on the ::MEASUREMENT_VNIC_USE must be supplied ++ * to this factory function and are immutable once set. Optional ++ * fields have explicit setter functions, but again values may only be ++ * set once so that the ::MEASUREMENT_VNIC_USE has immutable ++ * properties. ++ * ++ * @param vnic_id ASCIIZ string with the vNIC's ID. ++ * @param packets_in Total packets received. ++ * @param packets_out Total packets transmitted. ++ * @param bytes_in Total bytes received. ++ * @param bytes_out Total bytes transmitted. ++ * ++ * @returns pointer to the newly manufactured ::MEASUREMENT_VNIC_USE. ++ * If the structure is not used it must be released using ++ * ::evel_free_measurement_vnic_use. ++ * @retval NULL Failed to create the vNIC Use. ++ *****************************************************************************/ ++MEASUREMENT_VNIC_USE * evel_new_measurement_vnic_use(char * const vnic_id, ++ const int packets_in, ++ const int packets_out, ++ const int bytes_in, ++ const int bytes_out); ++ ++/**************************************************************************//** ++ * Free a vNIC Use. ++ * ++ * Free off the ::MEASUREMENT_VNIC_USE supplied. Will free all the contained ++ * allocated memory. ++ * ++ * @note It does not free the vNIC Use itself, since that may be part of a ++ * larger structure. ++ *****************************************************************************/ ++void evel_free_measurement_vnic_use(MEASUREMENT_VNIC_USE * const vnic_use); ++ ++/**************************************************************************//** ++ * Set the Broadcast Packets Received property of the vNIC Use. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param vnic_use Pointer to the vNIC Use. ++ * @param broadcast_packets_in ++ * Broadcast packets received. ++ *****************************************************************************/ ++void evel_vnic_use_bcast_pkt_in_set(MEASUREMENT_VNIC_USE * const vnic_use, ++ const int broadcast_packets_in); ++ ++/**************************************************************************//** ++ * Set the Broadcast Packets Transmitted property of the vNIC Use. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param vnic_use Pointer to the vNIC Use. ++ * @param broadcast_packets_out ++ * Broadcast packets transmitted. ++ *****************************************************************************/ ++void evel_vnic_use_bcast_pkt_out_set(MEASUREMENT_VNIC_USE * const vnic_use, ++ const int broadcast_packets_out); ++ ++/**************************************************************************//** ++ * Set the Multicast Packets Received property of the vNIC Use. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param vnic_use Pointer to the vNIC Use. ++ * @param multicast_packets_in ++ * Multicast packets received. ++ *****************************************************************************/ ++void evel_vnic_use_mcast_pkt_in_set(MEASUREMENT_VNIC_USE * const vnic_use, ++ const int multicast_packets_in); ++ ++/**************************************************************************//** ++ * Set the Multicast Packets Transmitted property of the vNIC Use. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param vnic_use Pointer to the vNIC Use. ++ * @param multicast_packets_out ++ * Multicast packets transmitted. ++ *****************************************************************************/ ++void evel_vnic_use_mcast_pkt_out_set(MEASUREMENT_VNIC_USE * const vnic_use, ++ const int multicast_packets_out); ++ ++/**************************************************************************//** ++ * Set the Unicast Packets Received property of the vNIC Use. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param vnic_use Pointer to the vNIC Use. ++ * @param unicast_packets_in ++ * Unicast packets received. ++ *****************************************************************************/ ++void evel_vnic_use_ucast_pkt_in_set(MEASUREMENT_VNIC_USE * const vnic_use, ++ const int unicast_packets_in); ++ ++/**************************************************************************//** ++ * Set the Unicast Packets Transmitted property of the vNIC Use. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param vnic_use Pointer to the vNIC Use. ++ * @param unicast_packets_out ++ * Unicast packets transmitted. ++ *****************************************************************************/ ++void evel_vnic_use_ucast_pkt_out_set(MEASUREMENT_VNIC_USE * const vnic_use, ++ const int unicast_packets_out); ++ ++/**************************************************************************//** ++ * Add an additional vNIC Use to the specified Measurement event. ++ * ++ * @param measurement Pointer to the measurement. ++ * @param vnic_use Pointer to the vNIC Use to add. ++ *****************************************************************************/ ++void evel_meas_vnic_use_add(EVENT_MEASUREMENT * const measurement, ++ MEASUREMENT_VNIC_USE * const vnic_use); ++ ++/**************************************************************************//** ++ * Add an additional vNIC usage record Measurement. ++ * ++ * This function implements the previous API, purely for convenience. ++ * ++ * The ID is null delimited ASCII string. The library takes a copy so the ++ * caller does not have to preserve values after the function returns. ++ * ++ * @param measurement Pointer to the measurement. ++ * @param vnic_id ASCIIZ string with the vNIC's ID. ++ * @param packets_in Total packets received. ++ * @param packets_out Total packets transmitted. ++ * @param broadcast_packets_in Broadcast packets received. ++ * @param broadcast_packets_out Broadcast packets transmitted. ++ * @param bytes_in Total bytes received. ++ * @param bytes_out Total bytes transmitted. ++ * @param multicast_packets_in Multicast packets received. ++ * @param multicast_packets_out Multicast packets transmitted. ++ * @param unicast_packets_in Unicast packets received. ++ * @param unicast_packets_out Unicast packets transmitted. ++ *****************************************************************************/ ++void evel_measurement_vnic_use_add(EVENT_MEASUREMENT * const measurement, ++ char * const vnic_id, ++ const int packets_in, ++ const int packets_out, ++ const int broadcast_packets_in, ++ const int broadcast_packets_out, ++ const int bytes_in, ++ const int bytes_out, ++ const int multicast_packets_in, ++ const int multicast_packets_out, ++ const int unicast_packets_in, ++ const int unicast_packets_out); ++ ++/*****************************************************************************/ ++/*****************************************************************************/ ++/* */ ++/* REPORT */ ++/* */ ++/*****************************************************************************/ ++/*****************************************************************************/ ++ ++/**************************************************************************//** ++ * Create a new Report event. ++ * ++ * @note The mandatory fields on the Report must be supplied to this ++ * factory function and are immutable once set. Optional fields have ++ * explicit setter functions, but again values may only be set once so ++ * that the Report has immutable properties. ++ * ++ * @param measurement_interval ++ * ++ * @returns pointer to the newly manufactured ::EVENT_REPORT. If the event is ++ * not used (i.e. posted) it must be released using ++ * ::evel_free_report. ++ * @retval NULL Failed to create the event. ++ *****************************************************************************/ ++EVENT_REPORT * evel_new_report(double measurement_interval); ++ ++/**************************************************************************//** ++ * Free a Report. ++ * ++ * Free off the Report supplied. Will free all the contained allocated memory. ++ * ++ * @note It does not free the Report itself, since that may be part of a ++ * larger structure. ++ *****************************************************************************/ ++void evel_free_report(EVENT_REPORT * event); ++ ++/**************************************************************************//** ++ * Set the Event Type property of the Report. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param report Pointer to the Report. ++ * @param type The Event Type to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_report_type_set(EVENT_REPORT * report, const char * const type); ++ ++/**************************************************************************//** ++ * Add a Feature usage value name/value pair to the Report. ++ * ++ * The name is null delimited ASCII string. The library takes ++ * a copy so the caller does not have to preserve values after the function ++ * returns. ++ * ++ * @param report Pointer to the report. ++ * @param feature ASCIIZ string with the feature's name. ++ * @param utilization Utilization of the feature. ++ *****************************************************************************/ ++void evel_report_feature_use_add(EVENT_REPORT * report, ++ char * feature, ++ int utilization); ++ ++/**************************************************************************//** ++ * Add a Additional Measurement value name/value pair to the Report. ++ * ++ * The name is null delimited ASCII string. The library takes ++ * a copy so the caller does not have to preserve values after the function ++ * returns. ++ * ++ * @param report Pointer to the report. ++ * @param group ASCIIZ string with the measurement group's name. ++ * @param name ASCIIZ string containing the measurement's name. ++ * @param value ASCIIZ string containing the measurement's value. ++ *****************************************************************************/ ++void evel_report_custom_measurement_add(EVENT_REPORT * report, ++ const char * const group, ++ const char * const name, ++ const char * const value); ++ ++/*****************************************************************************/ ++/*****************************************************************************/ ++/* */ ++/* MOBILE_FLOW */ ++/* */ ++/*****************************************************************************/ ++/*****************************************************************************/ ++ ++/**************************************************************************//** ++ * Create a new Mobile Flow event. ++ * ++ * @note The mandatory fields on the Mobile Flow must be supplied to this ++ * factory function and are immutable once set. Optional fields have ++ * explicit setter functions, but again values may only be set once so ++ * that the Mobile Flow has immutable properties. ++ * ++ * @param flow_direction ++ * @param gtp_per_flow_metrics ++ * @param ip_protocol_type ++ * @param ip_version ++ * @param other_endpoint_ip_address ++ * @param other_endpoint_port ++ * @param reporting_endpoint_ip_addr ++ * @param reporting_endpoint_port ++ * ++ * @returns pointer to the newly manufactured ::EVENT_MOBILE_FLOW. If the ++ * event is not used (i.e. posted) it must be released using ++ * ::evel_free_mobile_flow. ++ * @retval NULL Failed to create the event. ++ *****************************************************************************/ ++EVENT_MOBILE_FLOW * evel_new_mobile_flow( ++ const char * const flow_direction, ++ MOBILE_GTP_PER_FLOW_METRICS * gtp_per_flow_metrics, ++ const char * const ip_protocol_type, ++ const char * const ip_version, ++ const char * const other_endpoint_ip_address, ++ int other_endpoint_port, ++ const char * const reporting_endpoint_ip_addr, ++ int reporting_endpoint_port); ++ ++/**************************************************************************//** ++ * Free a Mobile Flow. ++ * ++ * Free off the Mobile Flow supplied. Will free all the contained allocated ++ * memory. ++ * ++ * @note It does not free the Mobile Flow itself, since that may be part of a ++ * larger structure. ++ *****************************************************************************/ ++void evel_free_mobile_flow(EVENT_MOBILE_FLOW * event); ++ ++/**************************************************************************//** ++ * Set the Event Type property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param type The Event Type to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_mobile_flow_type_set(EVENT_MOBILE_FLOW * mobile_flow, ++ const char * const type); ++ ++/**************************************************************************//** ++ * Set the Application Type property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param type The Application Type to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_mobile_flow_app_type_set(EVENT_MOBILE_FLOW * mobile_flow, ++ const char * const type); ++ ++/**************************************************************************//** ++ * Set the Application Protocol Type property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param type The Application Protocol Type to be set. ASCIIZ string. ++ * The caller does not need to preserve the value once the ++ * function returns. ++ *****************************************************************************/ ++void evel_mobile_flow_app_prot_type_set(EVENT_MOBILE_FLOW * mobile_flow, ++ const char * const type); ++ ++/**************************************************************************//** ++ * Set the Application Protocol Version property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param version The Application Protocol Version to be set. ASCIIZ ++ * string. The caller does not need to preserve the value ++ * once the function returns. ++ *****************************************************************************/ ++void evel_mobile_flow_app_prot_ver_set(EVENT_MOBILE_FLOW * mobile_flow, ++ const char * const version); ++ ++/**************************************************************************//** ++ * Set the CID property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param cid The CID to be set. ASCIIZ string. The caller does not ++ * need to preserve the value once the function returns. ++ *****************************************************************************/ ++void evel_mobile_flow_cid_set(EVENT_MOBILE_FLOW * mobile_flow, ++ const char * const cid); ++ ++/**************************************************************************//** ++ * Set the Connection Type property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param type The Connection Type to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_mobile_flow_con_type_set(EVENT_MOBILE_FLOW * mobile_flow, ++ const char * const type); ++ ++/**************************************************************************//** ++ * Set the ECGI property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param ecgi The ECGI to be set. ASCIIZ string. The caller does not ++ * need to preserve the value once the function returns. ++ *****************************************************************************/ ++void evel_mobile_flow_ecgi_set(EVENT_MOBILE_FLOW * mobile_flow, ++ const char * const ecgi); ++ ++/**************************************************************************//** ++ * Set the GTP Protocol Type property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param type The GTP Protocol Type to be set. ASCIIZ string. The ++ * caller does not need to preserve the value once the ++ * function returns. ++ *****************************************************************************/ ++void evel_mobile_flow_gtp_prot_type_set(EVENT_MOBILE_FLOW * mobile_flow, ++ const char * const type); ++ ++/**************************************************************************//** ++ * Set the GTP Protocol Version property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param version The GTP Protocol Version to be set. ASCIIZ string. The ++ * caller does not need to preserve the value once the ++ * function returns. ++ *****************************************************************************/ ++void evel_mobile_flow_gtp_prot_ver_set(EVENT_MOBILE_FLOW * mobile_flow, ++ const char * const version); ++ ++/**************************************************************************//** ++ * Set the HTTP Header property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param header The HTTP header to be set. ASCIIZ string. The caller does ++ * not need to preserve the value once the function returns. ++ *****************************************************************************/ ++void evel_mobile_flow_http_header_set(EVENT_MOBILE_FLOW * mobile_flow, ++ const char * const header); ++ ++/**************************************************************************//** ++ * Set the IMEI property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param imei The IMEI to be set. ASCIIZ string. The caller does not ++ * need to preserve the value once the function returns. ++ *****************************************************************************/ ++void evel_mobile_flow_imei_set(EVENT_MOBILE_FLOW * mobile_flow, ++ const char * const imei); ++ ++/**************************************************************************//** ++ * Set the IMSI property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param imsi The IMSI to be set. ASCIIZ string. The caller does not ++ * need to preserve the value once the function returns. ++ *****************************************************************************/ ++void evel_mobile_flow_imsi_set(EVENT_MOBILE_FLOW * mobile_flow, ++ const char * const imsi); ++ ++/**************************************************************************//** ++ * Set the LAC property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param lac The LAC to be set. ASCIIZ string. The caller does not ++ * need to preserve the value once the function returns. ++ *****************************************************************************/ ++void evel_mobile_flow_lac_set(EVENT_MOBILE_FLOW * mobile_flow, ++ const char * const lac); ++ ++/**************************************************************************//** ++ * Set the MCC property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param mcc The MCC to be set. ASCIIZ string. The caller does not ++ * need to preserve the value once the function returns. ++ *****************************************************************************/ ++void evel_mobile_flow_mcc_set(EVENT_MOBILE_FLOW * mobile_flow, ++ const char * const mcc); ++ ++/**************************************************************************//** ++ * Set the MNC property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param mnc The MNC to be set. ASCIIZ string. The caller does not ++ * need to preserve the value once the function returns. ++ *****************************************************************************/ ++void evel_mobile_flow_mnc_set(EVENT_MOBILE_FLOW * mobile_flow, ++ const char * const mnc); ++ ++/**************************************************************************//** ++ * Set the MSISDN property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param msisdn The MSISDN to be set. ASCIIZ string. The caller does not ++ * need to preserve the value once the function returns. ++ *****************************************************************************/ ++void evel_mobile_flow_msisdn_set(EVENT_MOBILE_FLOW * mobile_flow, ++ const char * const msisdn); ++ ++/**************************************************************************//** ++ * Set the Other Functional Role property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param role The Other Functional Role to be set. ASCIIZ string. The ++ * caller does not need to preserve the value once the ++ * function returns. ++ *****************************************************************************/ ++void evel_mobile_flow_other_func_role_set(EVENT_MOBILE_FLOW * mobile_flow, ++ const char * const role); ++ ++/**************************************************************************//** ++ * Set the RAC property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param rac The RAC to be set. ASCIIZ string. The caller does not ++ * need to preserve the value once the function returns. ++ *****************************************************************************/ ++void evel_mobile_flow_rac_set(EVENT_MOBILE_FLOW * mobile_flow, ++ const char * const rac); ++ ++/**************************************************************************//** ++ * Set the Radio Access Technology property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param tech The Radio Access Technology to be set. ASCIIZ string. The ++ * caller does not need to preserve the value once the ++ * function returns. ++ *****************************************************************************/ ++void evel_mobile_flow_radio_acc_tech_set(EVENT_MOBILE_FLOW * mobile_flow, ++ const char * const tech); ++ ++/**************************************************************************//** ++ * Set the SAC property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param sac The SAC to be set. ASCIIZ string. The caller does not ++ * need to preserve the value once the function returns. ++ *****************************************************************************/ ++void evel_mobile_flow_sac_set(EVENT_MOBILE_FLOW * mobile_flow, ++ const char * const sac); ++ ++/**************************************************************************//** ++ * Set the Sampling Algorithm property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param algorithm The Sampling Algorithm to be set. ++ *****************************************************************************/ ++void evel_mobile_flow_samp_alg_set(EVENT_MOBILE_FLOW * mobile_flow, ++ int algorithm); ++ ++/**************************************************************************//** ++ * Set the TAC property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param tac The TAC to be set. ASCIIZ string. The caller does not ++ * need to preserve the value once the function returns. ++ *****************************************************************************/ ++void evel_mobile_flow_tac_set(EVENT_MOBILE_FLOW * mobile_flow, ++ const char * const tac); ++ ++/**************************************************************************//** ++ * Set the Tunnel ID property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param tunnel_id The Tunnel ID to be set. ASCIIZ string. The caller does ++ * not need to preserve the value once the function returns. ++ *****************************************************************************/ ++void evel_mobile_flow_tunnel_id_set(EVENT_MOBILE_FLOW * mobile_flow, ++ const char * const tunnel_id); ++ ++/**************************************************************************//** ++ * Set the VLAN ID property of the Mobile Flow. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param mobile_flow Pointer to the Mobile Flow. ++ * @param vlan_id The VLAN ID to be set. ASCIIZ string. The caller does ++ * not need to preserve the value once the function returns. ++ *****************************************************************************/ ++void evel_mobile_flow_vlan_id_set(EVENT_MOBILE_FLOW * mobile_flow, ++ const char * const vlan_id); ++ ++/**************************************************************************//** ++ * Create a new Mobile GTP Per Flow Metrics. ++ * ++ * @note The mandatory fields on the Mobile GTP Per Flow Metrics must be ++ * supplied to this factory function and are immutable once set. ++ * Optional fields have explicit setter functions, but again values ++ * may only be set once so that the Mobile GTP Per Flow Metrics has ++ * immutable properties. ++ * ++ * @param avg_bit_error_rate ++ * @param avg_packet_delay_variation ++ * @param avg_packet_latency ++ * @param avg_receive_throughput ++ * @param avg_transmit_throughput ++ * @param flow_activation_epoch ++ * @param flow_activation_microsec ++ * @param flow_deactivation_epoch ++ * @param flow_deactivation_microsec ++ * @param flow_deactivation_time ++ * @param flow_status ++ * @param max_packet_delay_variation ++ * @param num_activation_failures ++ * @param num_bit_errors ++ * @param num_bytes_received ++ * @param num_bytes_transmitted ++ * @param num_dropped_packets ++ * @param num_l7_bytes_received ++ * @param num_l7_bytes_transmitted ++ * @param num_lost_packets ++ * @param num_out_of_order_packets ++ * @param num_packet_errors ++ * @param num_packets_received_excl_retrans ++ * @param num_packets_received_incl_retrans ++ * @param num_packets_transmitted_incl_retrans ++ * @param num_retries ++ * @param num_timeouts ++ * @param num_tunneled_l7_bytes_received ++ * @param round_trip_time ++ * @param time_to_first_byte ++ * ++ * @returns pointer to the newly manufactured ::MOBILE_GTP_PER_FLOW_METRICS. ++ * If the structure is not used it must be released using ++ * ::evel_free_mobile_gtp_flow_metrics. ++ * @retval NULL Failed to create the event. ++ *****************************************************************************/ ++MOBILE_GTP_PER_FLOW_METRICS * evel_new_mobile_gtp_flow_metrics( ++ double avg_bit_error_rate, ++ double avg_packet_delay_variation, ++ int avg_packet_latency, ++ int avg_receive_throughput, ++ int avg_transmit_throughput, ++ int flow_activation_epoch, ++ int flow_activation_microsec, ++ int flow_deactivation_epoch, ++ int flow_deactivation_microsec, ++ time_t flow_deactivation_time, ++ const char * const flow_status, ++ int max_packet_delay_variation, ++ int num_activation_failures, ++ int num_bit_errors, ++ int num_bytes_received, ++ int num_bytes_transmitted, ++ int num_dropped_packets, ++ int num_l7_bytes_received, ++ int num_l7_bytes_transmitted, ++ int num_lost_packets, ++ int num_out_of_order_packets, ++ int num_packet_errors, ++ int num_packets_received_excl_retrans, ++ int num_packets_received_incl_retrans, ++ int num_packets_transmitted_incl_retrans, ++ int num_retries, ++ int num_timeouts, ++ int num_tunneled_l7_bytes_received, ++ int round_trip_time, ++ int time_to_first_byte); ++ ++/**************************************************************************//** ++ * Free a Mobile GTP Per Flow Metrics. ++ * ++ * Free off the Mobile GTP Per Flow Metrics supplied. Will free all the ++ * contained allocated memory. ++ * ++ * @note It does not free the Mobile GTP Per Flow Metrics itself, since that ++ * may be part of a larger structure. ++ *****************************************************************************/ ++void evel_free_mobile_gtp_flow_metrics(MOBILE_GTP_PER_FLOW_METRICS * metrics); ++ ++/**************************************************************************//** ++ * Set the Duration of Connection Failed Status property of the Mobile GTP Per ++ * Flow Metrics. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param metrics Pointer to the Mobile GTP Per Flow Metrics. ++ * @param duration The Duration of Connection Failed Status to be set. ++ *****************************************************************************/ ++void evel_mobile_gtp_metrics_dur_con_fail_set( ++ MOBILE_GTP_PER_FLOW_METRICS * metrics, ++ int duration); ++ ++/**************************************************************************//** ++ * Set the Duration of Tunnel Failed Status property of the Mobile GTP Per Flow ++ * Metrics. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param metrics Pointer to the Mobile GTP Per Flow Metrics. ++ * @param duration The Duration of Tunnel Failed Status to be set. ++ *****************************************************************************/ ++void evel_mobile_gtp_metrics_dur_tun_fail_set( ++ MOBILE_GTP_PER_FLOW_METRICS * metrics, ++ int duration); ++ ++/**************************************************************************//** ++ * Set the Activated By property of the Mobile GTP Per Flow metrics. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param metrics Pointer to the Mobile GTP Per Flow Metrics. ++ * @param act_by The Activated By to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_mobile_gtp_metrics_act_by_set(MOBILE_GTP_PER_FLOW_METRICS * metrics, ++ const char * const act_by); ++ ++/**************************************************************************//** ++ * Set the Activation Time property of the Mobile GTP Per Flow metrics. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param metrics Pointer to the Mobile GTP Per Flow Metrics. ++ * @param act_time The Activation Time to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_mobile_gtp_metrics_act_time_set( ++ MOBILE_GTP_PER_FLOW_METRICS * metrics, ++ time_t act_time); ++ ++/**************************************************************************//** ++ * Set the Deactivated By property of the Mobile GTP Per Flow metrics. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param metrics Pointer to the Mobile GTP Per Flow Metrics. ++ * @param deact_by The Deactivated By to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_mobile_gtp_metrics_deact_by_set( ++ MOBILE_GTP_PER_FLOW_METRICS * metrics, ++ const char * const deact_by); ++ ++/**************************************************************************//** ++ * Set the GTP Connection Status property of the Mobile GTP Per Flow metrics. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param metrics Pointer to the Mobile GTP Per Flow Metrics. ++ * @param status The GTP Connection Status to be set. ASCIIZ string. The ++ * caller does not need to preserve the value once the ++ * function returns. ++ *****************************************************************************/ ++void evel_mobile_gtp_metrics_con_status_set( ++ MOBILE_GTP_PER_FLOW_METRICS * metrics, ++ const char * const status); ++ ++/**************************************************************************//** ++ * Set the GTP Tunnel Status property of the Mobile GTP Per Flow metrics. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param metrics Pointer to the Mobile GTP Per Flow Metrics. ++ * @param status The GTP Tunnel Status to be set. ASCIIZ string. The ++ * caller does not need to preserve the value once the ++ * function returns. ++ *****************************************************************************/ ++void evel_mobile_gtp_metrics_tun_status_set( ++ MOBILE_GTP_PER_FLOW_METRICS * metrics, ++ const char * const status); ++ ++/**************************************************************************//** ++ * Set an IP Type-of-Service count property of the Mobile GTP Per Flow metrics. ++ * ++ * @param metrics Pointer to the Mobile GTP Per Flow Metrics. ++ * @param index The index of the IP Type-of-Service. ++ * @param count The count. ++ *****************************************************************************/ ++void evel_mobile_gtp_metrics_iptos_set(MOBILE_GTP_PER_FLOW_METRICS * metrics, ++ int index, ++ int count); ++ ++/**************************************************************************//** ++ * Set the Large Packet Round-Trip Time property of the Mobile GTP Per Flow ++ * Metrics. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param metrics Pointer to the Mobile GTP Per Flow Metrics. ++ * @param rtt The Large Packet Round-Trip Time to be set. ++ *****************************************************************************/ ++void evel_mobile_gtp_metrics_large_pkt_rtt_set( ++ MOBILE_GTP_PER_FLOW_METRICS * metrics, ++ int rtt); ++ ++/**************************************************************************//** ++ * Set the Large Packet Threshold property of the Mobile GTP Per Flow Metrics. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param metrics Pointer to the Mobile GTP Per Flow Metrics. ++ * @param threshold The Large Packet Threshold to be set. ++ *****************************************************************************/ ++void evel_mobile_gtp_metrics_large_pkt_thresh_set( ++ MOBILE_GTP_PER_FLOW_METRICS * metrics, ++ double threshold); ++ ++/**************************************************************************//** ++ * Set the Max Receive Bit Rate property of the Mobile GTP Per Flow Metrics. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param metrics Pointer to the Mobile GTP Per Flow Metrics. ++ * @param rate The Max Receive Bit Rate to be set. ++ *****************************************************************************/ ++void evel_mobile_gtp_metrics_max_rcv_bit_rate_set( ++ MOBILE_GTP_PER_FLOW_METRICS * metrics, ++ int rate); ++ ++/**************************************************************************//** ++ * Set the Max Transmit Bit Rate property of the Mobile GTP Per Flow Metrics. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param metrics Pointer to the Mobile GTP Per Flow Metrics. ++ * @param rate The Max Transmit Bit Rate to be set. ++ *****************************************************************************/ ++void evel_mobile_gtp_metrics_max_trx_bit_rate_set( ++ MOBILE_GTP_PER_FLOW_METRICS * metrics, ++ int rate); ++ ++/**************************************************************************//** ++ * Set the Number of GTP Echo Failures property of the Mobile GTP Per Flow ++ * Metrics. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param metrics Pointer to the Mobile GTP Per Flow Metrics. ++ * @param num The Number of GTP Echo Failures to be set. ++ *****************************************************************************/ ++void evel_mobile_gtp_metrics_num_echo_fail_set( ++ MOBILE_GTP_PER_FLOW_METRICS * metrics, ++ int num); ++ ++/**************************************************************************//** ++ * Set the Number of GTP Tunnel Errors property of the Mobile GTP Per Flow ++ * Metrics. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param metrics Pointer to the Mobile GTP Per Flow Metrics. ++ * @param num The Number of GTP Tunnel Errors to be set. ++ *****************************************************************************/ ++void evel_mobile_gtp_metrics_num_tun_fail_set( ++ MOBILE_GTP_PER_FLOW_METRICS * metrics, ++ int num); ++ ++/**************************************************************************//** ++ * Set the Number of HTTP Errors property of the Mobile GTP Per Flow Metrics. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param metrics Pointer to the Mobile GTP Per Flow Metrics. ++ * @param num The Number of HTTP Errors to be set. ++ *****************************************************************************/ ++void evel_mobile_gtp_metrics_num_http_errors_set( ++ MOBILE_GTP_PER_FLOW_METRICS * metrics, ++ int num); ++ ++/**************************************************************************//** ++ * Add a TCP flag count to the metrics. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param metrics Pointer to the Mobile GTP Per Flow Metrics. ++ * @param tcp_flag The TCP flag count to be updated. ++ * @param count The associated flag count. ++ *****************************************************************************/ ++void evel_mobile_gtp_metrics_tcp_flag_count_add( ++ MOBILE_GTP_PER_FLOW_METRICS * metrics, ++ const EVEL_TCP_FLAGS tcp_flag, ++ const int count); ++ ++/**************************************************************************//** ++ * Add a QCI COS count to the metrics. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param metrics Pointer to the Mobile GTP Per Flow Metrics. ++ * @param qci_cos The QCI COS count to be updated. ++ * @param count The associated QCI COS count. ++ *****************************************************************************/ ++void evel_mobile_gtp_metrics_qci_cos_count_add( ++ MOBILE_GTP_PER_FLOW_METRICS * metrics, ++ const EVEL_QCI_COS_TYPES qci_cos, ++ const int count); ++ ++/*****************************************************************************/ ++/*****************************************************************************/ ++/* */ ++/* SERVICE EVENTS */ ++/* */ ++/*****************************************************************************/ ++/*****************************************************************************/ ++ ++/**************************************************************************//** ++ * Create a new Service event. ++ * ++ * @note The mandatory fields on the Service must be supplied to ++ * this factory function and are immutable once set. Optional fields ++ * have explicit setter functions, but again values may only be set ++ * once so that the event has immutable properties. ++ * @param vendor_id The vendor id to encode in the event instance id. ++ * @param event_id The vendor event id to encode in the event instance id. ++ * @returns pointer to the newly manufactured ::EVENT_SERVICE. If the event ++ * is not used (i.e. posted) it must be released using ++ * ::evel_free_service. ++ * @retval NULL Failed to create the event. ++ *****************************************************************************/ ++EVENT_SERVICE * evel_new_service(const char * const vendor_id, ++ const char * const event_id); ++ ++/**************************************************************************//** ++ * Free a Service Events event. ++ * ++ * Free off the event supplied. Will free all the contained allocated memory. ++ * ++ * @note It does not free the event itself, since that may be part of a larger ++ * structure. ++ *****************************************************************************/ ++void evel_free_service(EVENT_SERVICE * const event); ++ ++/**************************************************************************//** ++ * Set the Event Type property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param type The Event Type to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_service_type_set(EVENT_SERVICE * const event, ++ const char * const type); ++ ++/**************************************************************************//** ++ * Set the Product Id property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param product_id The vendor product id to be set. ASCIIZ string. The ++ * caller does not need to preserve the value once the ++ * function returns. ++ *****************************************************************************/ ++void evel_service_product_id_set(EVENT_SERVICE * const event, ++ const char * const product_id); ++ ++/**************************************************************************//** ++ * Set the Subsystem Id property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param subsystem_id The vendor subsystem id to be set. ASCIIZ string. The ++ * caller does not need to preserve the value once the ++ * function returns. ++ *****************************************************************************/ ++void evel_service_subsystem_id_set(EVENT_SERVICE * const event, ++ const char * const subsystem_id); ++ ++/**************************************************************************//** ++ * Set the Friendly Name property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param friendly_name The vendor friendly name to be set. ASCIIZ string. The ++ * caller does not need to preserve the value once the ++ * function returns. ++ *****************************************************************************/ ++void evel_service_friendly_name_set(EVENT_SERVICE * const event, ++ const char * const friendly_name); ++ ++/**************************************************************************//** ++ * Set the correlator property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param correlator The correlator to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_service_correlator_set(EVENT_SERVICE * const event, ++ const char * const correlator); ++ ++/**************************************************************************//** ++ * Set the Codec property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param codec The codec to be set. ASCIIZ string. The caller does not ++ * need to preserve the value once the function returns. ++ *****************************************************************************/ ++void evel_service_codec_set(EVENT_SERVICE * const event, ++ const char * const codec); ++ ++/**************************************************************************//** ++ * Set the Callee Side Codec property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param codec The codec to be set. ASCIIZ string. The caller does not ++ * need to preserve the value once the function returns. ++ *****************************************************************************/ ++void evel_service_callee_codec_set(EVENT_SERVICE * const event, ++ const char * const codec); ++ ++/**************************************************************************//** ++ * Set the Caller Side Codec property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param codec The codec to be set. ASCIIZ string. The caller does not ++ * need to preserve the value once the function returns. ++ *****************************************************************************/ ++void evel_service_caller_codec_set(EVENT_SERVICE * const event, ++ const char * const codec); ++ ++/**************************************************************************//** ++ * Set the RTCP Data property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param rtcp_data The RTCP Data to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_service_rtcp_data_set(EVENT_SERVICE * const event, ++ const char * const rtcp_data); ++ ++/**************************************************************************//** ++ * Set the Adjacency Name property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param adjacency_name ++ * The adjacency name to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_service_adjacency_name_set(EVENT_SERVICE * const event, ++ const char * const adjacency_name); ++ ++/**************************************************************************//** ++ * Set the Endpoint Descriptor property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param endpoint_desc The endpoint descriptor to be set. ++ *****************************************************************************/ ++void evel_service_endpoint_desc_set( ++ EVENT_SERVICE * const event, ++ const EVEL_SERVICE_ENDPOINT_DESC endpoint_desc); ++ ++/**************************************************************************//** ++ * Set the Endpoint Jitter property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param jitter The jitter to be set. ++ *****************************************************************************/ ++void evel_service_endpoint_jitter_set(EVENT_SERVICE * const event, ++ const int jitter); ++ ++/**************************************************************************//** ++ * Set the Endpoint Rtp Octets Discarded property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param rtp_oct_disc The discard count. ++ *****************************************************************************/ ++void evel_service_endpoint_rtp_oct_disc_set(EVENT_SERVICE * const event, ++ const int rtp_oct_disc); ++ ++/**************************************************************************//** ++ * Set the Endpoint Rtp Octets Received property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param rtp_oct_recv The receive count. ++ *****************************************************************************/ ++void evel_service_endpoint_rtp_oct_recv_set(EVENT_SERVICE * const event, ++ const int rtp_oct_recv); ++ ++/**************************************************************************//** ++ * Set the Endpoint Rtp Octets Sent property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param rtp_oct_sent The send count. ++ *****************************************************************************/ ++void evel_service_endpoint_rtp_oct_sent_set(EVENT_SERVICE * const event, ++ const int rtp_oct_sent); ++ ++/**************************************************************************//** ++ * Set the Endpoint Rtp Packets Discarded property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param rtp_pkt_disc The discard count. ++ *****************************************************************************/ ++void evel_service_endpoint_rtp_pkt_disc_set(EVENT_SERVICE * const event, ++ const int rtp_pkt_disc); ++ ++/**************************************************************************//** ++ * Set the Endpoint Rtp Packets Received property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param rtp_pkt_recv The receive count. ++ *****************************************************************************/ ++void evel_service_endpoint_rtp_pkt_recv_set(EVENT_SERVICE * const event, ++ const int rtp_pkt_recv); ++ ++/**************************************************************************//** ++ * Set the Endpoint Rtp Packets Sent property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param rtp_pkt_sent The send count. ++ *****************************************************************************/ ++void evel_service_endpoint_rtp_pkt_sent_set(EVENT_SERVICE * const event, ++ const int rtp_pkt_sent); ++ ++/**************************************************************************//** ++ * Set the Local Jitter property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param jitter The jitter to be set. ++ *****************************************************************************/ ++void evel_service_local_jitter_set(EVENT_SERVICE * const event, ++ const int jitter); ++ ++/**************************************************************************//** ++ * Set the Local Rtp Octets Discarded property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param rtp_oct_disc The discard count. ++ *****************************************************************************/ ++void evel_service_local_rtp_oct_disc_set(EVENT_SERVICE * const event, ++ const int rtp_oct_disc); ++ ++/**************************************************************************//** ++ * Set the Local Rtp Octets Received property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param rtp_oct_recv The receive count. ++ *****************************************************************************/ ++void evel_service_local_rtp_oct_recv_set(EVENT_SERVICE * const event, ++ const int rtp_oct_recv); ++ ++/**************************************************************************//** ++ * Set the Local Rtp Octets Sent property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param rtp_oct_sent The send count. ++ *****************************************************************************/ ++void evel_service_local_rtp_oct_sent_set(EVENT_SERVICE * const event, ++ const int rtp_oct_sent); ++ ++/**************************************************************************//** ++ * Set the Local Rtp Packets Discarded property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param rtp_pkt_disc The discard count. ++ *****************************************************************************/ ++void evel_service_local_rtp_pkt_disc_set(EVENT_SERVICE * const event, ++ const int rtp_pkt_disc); ++ ++/**************************************************************************//** ++ * Set the Local Rtp Packets Received property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param rtp_pkt_recv The receive count. ++ *****************************************************************************/ ++void evel_service_local_rtp_pkt_recv_set(EVENT_SERVICE * const event, ++ const int rtp_pkt_recv); ++ ++/**************************************************************************//** ++ * Set the Local Rtp Packets Sent property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param rtp_pkt_sent The send count. ++ *****************************************************************************/ ++void evel_service_local_rtp_pkt_sent_set(EVENT_SERVICE * const event, ++ const int rtp_pkt_sent); ++ ++/**************************************************************************//** ++ * Set the Mos Cqe property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param mos_cqe The mosCqe to be set. ++ *****************************************************************************/ ++void evel_service_mos_cqe_set(EVENT_SERVICE * const event, ++ const double mos_cqe); ++ ++/**************************************************************************//** ++ * Set the Packets Lost property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param packets_lost The number of packets lost to be set. ++ *****************************************************************************/ ++void evel_service_packets_lost_set(EVENT_SERVICE * const event, ++ const int packets_lost); ++ ++/**************************************************************************//** ++ * Set the packet Loss Percent property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param packet_loss_percent ++ * The packet loss in percent. ++ *****************************************************************************/ ++void evel_service_packet_loss_percent_set(EVENT_SERVICE * const event, ++ const double packet_loss_percent); ++ ++/**************************************************************************//** ++ * Set the R Factor property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param r_factor The R Factor to be set. ++ *****************************************************************************/ ++void evel_service_r_factor_set(EVENT_SERVICE * const event, ++ const int r_factor); ++ ++/**************************************************************************//** ++ * Set the Round Trip Delay property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param round_trip_delay ++ * The Round trip delay to be set. ++ *****************************************************************************/ ++void evel_service_round_trip_delay_set(EVENT_SERVICE * const event, ++ const int round_trip_delay); ++ ++/**************************************************************************//** ++ * Set the Phone Number property of the Service event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Service event. ++ * @param phone_number The Phone Number to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_service_phone_number_set(EVENT_SERVICE * const event, ++ const char * const phone_number); ++ ++/**************************************************************************//** ++ * Add a name/value pair to the Service, under the additionalFields array. ++ * ++ * The name and value are null delimited ASCII strings. The library takes ++ * a copy so the caller does not have to preserve values after the function ++ * returns. ++ * ++ * @param event Pointer to the Service event. ++ * @param name ASCIIZ string with the field's name. The caller does not ++ * need to preserve the value once the function returns. ++ * @param value ASCIIZ string with the field's value. The caller does not ++ * need to preserve the value once the function returns. ++ *****************************************************************************/ ++void evel_service_addl_field_add(EVENT_SERVICE * const event, ++ const char * const name, ++ const char * const value); ++ ++/*****************************************************************************/ ++/*****************************************************************************/ ++/* */ ++/* SIGNALING */ ++/* */ ++/*****************************************************************************/ ++/*****************************************************************************/ ++ ++/**************************************************************************//** ++ * Create a new Signaling event. ++ * ++ * @note The mandatory fields on the Signaling must be supplied to ++ * this factory function and are immutable once set. Optional fields ++ * have explicit setter functions, but again values may only be set ++ * once so that the event has immutable properties. ++ * @param vendor_id The vendor id to encode in the event instance id. ++ * @param event_id The vendor event id to encode in the event instance id. ++ * @returns pointer to the newly manufactured ::EVENT_SIGNALING. If the event ++ * is not used (i.e. posted) it must be released using ++ * ::evel_free_signaling. ++ * @retval NULL Failed to create the event. ++ *****************************************************************************/ ++EVENT_SIGNALING * evel_new_signaling(const char * const vendor_id, ++ const char * const event_id); ++ ++/**************************************************************************//** ++ * Free a Signaling event. ++ * ++ * Free off the event supplied. Will free all the contained allocated memory. ++ * ++ * @note It does not free the event itself, since that may be part of a larger ++ * structure. ++ *****************************************************************************/ ++void evel_free_signaling(EVENT_SIGNALING * const event); ++ ++/**************************************************************************//** ++ * Set the Event Type property of the Signaling event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Signaling event. ++ * @param type The Event Type to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_signaling_type_set(EVENT_SIGNALING * const event, ++ const char * const type); ++ ++/**************************************************************************//** ++ * Set the Product Id property of the Signaling event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Signaling event. ++ * @param product_id The vendor product id to be set. ASCIIZ string. The ++ * caller does not need to preserve the value once the ++ * function returns. ++ *****************************************************************************/ ++void evel_signaling_product_id_set(EVENT_SIGNALING * const event, ++ const char * const product_id); ++ ++/**************************************************************************//** ++ * Set the Subsystem Id property of the Signaling event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Signaling event. ++ * @param subsystem_id The vendor subsystem id to be set. ASCIIZ string. The ++ * caller does not need to preserve the value once the ++ * function returns. ++ *****************************************************************************/ ++void evel_signaling_subsystem_id_set(EVENT_SIGNALING * const event, ++ const char * const subsystem_id); ++ ++/**************************************************************************//** ++ * Set the Friendly Name property of the Signaling event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Signaling event. ++ * @param friendly_name The vendor friendly name to be set. ASCIIZ string. The ++ * caller does not need to preserve the value once the ++ * function returns. ++ *****************************************************************************/ ++void evel_signaling_friendly_name_set(EVENT_SIGNALING * const event, ++ const char * const friendly_name); ++ ++/**************************************************************************//** ++ * Set the Correlator property of the Signaling event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Signaling event. ++ * @param correlator The correlator to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_signaling_correlator_set(EVENT_SIGNALING * const event, ++ const char * const correlator); ++ ++/**************************************************************************//** ++ * Set the Local Ip Address property of the Signaling event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Signaling event. ++ * @param local_ip_address ++ * The Local Ip Address to be set. ASCIIZ string. The ++ * caller does not need to preserve the value once the ++ * function returns. ++ *****************************************************************************/ ++void evel_signaling_local_ip_address_set(EVENT_SIGNALING * const event, ++ const char * const local_ip_address); ++ ++/**************************************************************************//** ++ * Set the Local Port property of the Signaling event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Signaling event. ++ * @param local_port The Local Port to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_signaling_local_port_set(EVENT_SIGNALING * const event, ++ const char * const local_port); ++ ++/**************************************************************************//** ++ * Set the Remote Ip Address property of the Signaling event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Signaling event. ++ * @param remote_ip_address ++ * The Remote Ip Address to be set. ASCIIZ string. The ++ * caller does not need to preserve the value once the ++ * function returns. ++ *****************************************************************************/ ++void evel_signaling_remote_ip_address_set(EVENT_SIGNALING * const event, ++ const char * const remote_ip_address); ++ ++/**************************************************************************//** ++ * Set the Remote Port property of the Signaling event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Signaling event. ++ * @param remote_port The Remote Port to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_signaling_remote_port_set(EVENT_SIGNALING * const event, ++ const char * const remote_port); ++ ++/**************************************************************************//** ++ * Set the Compressed SIP property of the Signaling event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Signaling event. ++ * @param compressed_sip ++ * The Compressed SIP to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_signaling_compressed_sip_set(EVENT_SIGNALING * const event, ++ const char * const compressed_sip); ++ ++/**************************************************************************//** ++ * Set the Summary SIP property of the Signaling event. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param event Pointer to the Signaling event. ++ * @param summary_sip The Summary SIP to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_signaling_summary_sip_set(EVENT_SIGNALING * const event, ++ const char * const summary_sip); ++ ++/*****************************************************************************/ ++/*****************************************************************************/ ++/* */ ++/* STATE CHANGE */ ++/* */ ++/*****************************************************************************/ ++/*****************************************************************************/ ++ ++/**************************************************************************//** ++ * Create a new State Change event. ++ * ++ * @note The mandatory fields on the Syslog must be supplied to this factory ++ * function and are immutable once set. Optional fields have explicit ++ * setter functions, but again values may only be set once so that the ++ * Syslog has immutable properties. ++ * ++ * @param new_state The new state of the reporting entity. ++ * @param old_state The old state of the reporting entity. ++ * @param interface The card or port name of the reporting entity. ++ * ++ * @returns pointer to the newly manufactured ::EVENT_STATE_CHANGE. If the ++ * event is not used it must be released using ++ * ::evel_free_state_change ++ * @retval NULL Failed to create the event. ++ *****************************************************************************/ ++EVENT_STATE_CHANGE * evel_new_state_change(const EVEL_ENTITY_STATE new_state, ++ const EVEL_ENTITY_STATE old_state, ++ const char * const interface); ++ ++/**************************************************************************//** ++ * Free a State Change. ++ * ++ * Free off the State Change supplied. Will free all the contained allocated ++ * memory. ++ * ++ * @note It does not free the State Change itself, since that may be part of a ++ * larger structure. ++ *****************************************************************************/ ++void evel_free_state_change(EVENT_STATE_CHANGE * const state_change); ++ ++/**************************************************************************//** ++ * Set the Event Type property of the State Change. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param state_change Pointer to the ::EVENT_STATE_CHANGE. ++ * @param type The Event Type to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_state_change_type_set(EVENT_STATE_CHANGE * const state_change, ++ const char * const type); ++ ++/**************************************************************************//** ++ * Add an additional field name/value pair to the State Change. ++ * ++ * The name and value are null delimited ASCII strings. The library takes ++ * a copy so the caller does not have to preserve values after the function ++ * returns. ++ * ++ * @param state_change Pointer to the ::EVENT_STATE_CHANGE. ++ * @param name ASCIIZ string with the attribute's name. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ * @param value ASCIIZ string with the attribute's value. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_state_change_addl_field_add(EVENT_STATE_CHANGE * const state_change, ++ const char * const name, ++ const char * const value); ++ ++/*****************************************************************************/ ++/*****************************************************************************/ ++/* */ ++/* SYSLOG */ ++/* */ ++/*****************************************************************************/ ++/*****************************************************************************/ ++ ++/**************************************************************************//** ++ * Create a new syslog event. ++ * ++ * @note The mandatory fields on the Syslog must be supplied to this factory ++ * function and are immutable once set. Optional fields have explicit ++ * setter functions, but again values may only be set once so that the ++ * Syslog has immutable properties. ++ * ++ * @param event_source_type ++ * @param syslog_msg ++ * @param syslog_tag ++ * ++ * @returns pointer to the newly manufactured ::EVENT_SYSLOG. If the event is ++ * not used it must be released using ::evel_free_syslog ++ * @retval NULL Failed to create the event. ++ *****************************************************************************/ ++EVENT_SYSLOG * evel_new_syslog(EVEL_SOURCE_TYPES event_source_type, ++ const char * const syslog_msg, ++ const char * const syslog_tag); ++ ++/**************************************************************************//** ++ * Set the Event Type property of the Syslog. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param syslog Pointer to the syslog. ++ * @param type The Event Type to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_syslog_type_set(EVENT_SYSLOG * syslog, ++ const char * const type); ++ ++/**************************************************************************//** ++ * Free a Syslog. ++ * ++ * Free off the Syslog supplied. Will free all the contained allocated memory. ++ * ++ * @note It does not free the Syslog itself, since that may be part of a ++ * larger structure. ++ *****************************************************************************/ ++void evel_free_syslog(EVENT_SYSLOG * event); ++ ++/**************************************************************************//** ++ * Add an additional field name/value pair to the Syslog. ++ * ++ * The name and value are null delimited ASCII strings. The library takes ++ * a copy so the caller does not have to preserve values after the function ++ * returns. ++ * ++ * @param syslog Pointer to the syslog. ++ * @param name ASCIIZ string with the attribute's name. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ * @param value ASCIIZ string with the attribute's value. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_syslog_addl_field_add(EVENT_SYSLOG * syslog, ++ char * name, ++ char * value); ++ ++/**************************************************************************//** ++ * Set the Event Source Host property of the Syslog. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param syslog Pointer to the Syslog. ++ * @param host The Event Source Host to be set. ASCIIZ string. The ++ * caller does not need to preserve the value once the ++ * function returns. ++ *****************************************************************************/ ++void evel_syslog_event_source_host_set(EVENT_SYSLOG * syslog, ++ const char * const host); ++ ++/**************************************************************************//** ++ * Set the Syslog Facility property of the Syslog. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param syslog Pointer to the Syslog. ++ * @param facility The Syslog Facility to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_syslog_facility_set(EVENT_SYSLOG * syslog, ++ EVEL_SYSLOG_FACILITIES facility); ++ ++/**************************************************************************//** ++ * Set the Process property of the Syslog. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param syslog Pointer to the Syslog. ++ * @param proc The Process to be set. ASCIIZ string. The caller does ++ * not need to preserve the value once the function returns. ++ *****************************************************************************/ ++void evel_syslog_proc_set(EVENT_SYSLOG * syslog, const char * const proc); ++ ++/**************************************************************************//** ++ * Set the Process ID property of the Syslog. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param syslog Pointer to the Syslog. ++ * @param proc_id The Process ID to be set. ++ *****************************************************************************/ ++void evel_syslog_proc_id_set(EVENT_SYSLOG * syslog, int proc_id); ++ ++/**************************************************************************//** ++ * Set the Version property of the Syslog. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param syslog Pointer to the Syslog. ++ * @param version The Version to be set. ++ *****************************************************************************/ ++void evel_syslog_version_set(EVENT_SYSLOG * syslog, int version); ++ ++/**************************************************************************//** ++ * Set the Structured Data property of the Syslog. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param syslog Pointer to the Syslog. ++ * @param s_data The Structured Data to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_syslog_s_data_set(EVENT_SYSLOG * syslog, const char * const s_data); ++ ++/*****************************************************************************/ ++/*****************************************************************************/ ++/* */ ++/* OTHER */ ++/* */ ++/*****************************************************************************/ ++/*****************************************************************************/ ++ ++/**************************************************************************//** ++ * Create a new other event. ++ * ++ * ++ * @returns pointer to the newly manufactured ::EVENT_OTHER. If the event is ++ * not used it must be released using ::evel_free_other. ++ * @retval NULL Failed to create the event. ++ *****************************************************************************/ ++EVENT_OTHER * evel_new_other(void); ++ ++/**************************************************************************//** ++ * Free an Other. ++ * ++ * Free off the Other supplied. Will free all the contained allocated memory. ++ * ++ * @note It does not free the Other itself, since that may be part of a ++ * larger structure. ++ *****************************************************************************/ ++void evel_free_other(EVENT_OTHER * event); ++ ++/**************************************************************************//** ++ * Set the Event Type property of the Other. ++ * ++ * @note The property is treated as immutable: it is only valid to call ++ * the setter once. However, we don't assert if the caller tries to ++ * overwrite, just ignoring the update instead. ++ * ++ * @param other Pointer to the Other. ++ * @param type The Event Type to be set. ASCIIZ string. The caller ++ * does not need to preserve the value once the function ++ * returns. ++ *****************************************************************************/ ++void evel_other_type_set(EVENT_OTHER * other, ++ const char * const type); ++ ++/**************************************************************************//** ++ * Add a value name/value pair to the Other. ++ * ++ * The name and value are null delimited ASCII strings. The library takes ++ * a copy so the caller does not have to preserve values after the function ++ * returns. ++ * ++ * @param other Pointer to the Other. ++ * @param name ASCIIZ string with the attribute's name. ++ * @param value ASCIIZ string with the attribute's value. ++ *****************************************************************************/ ++void evel_other_field_add(EVENT_OTHER * other, ++ char * name, ++ char * value); ++ ++/*****************************************************************************/ ++/*****************************************************************************/ ++/* */ ++/* THROTTLING */ ++/* */ ++/*****************************************************************************/ ++/*****************************************************************************/ ++ ++/**************************************************************************//** ++ * Return the current measurement interval provided by the Event Listener. ++ * ++ * @returns The current measurement interval ++ * @retval EVEL_MEASUREMENT_INTERVAL_UKNOWN (0) - interval has not been ++ * specified ++ *****************************************************************************/ ++int evel_get_measurement_interval(); ++ ++/*****************************************************************************/ ++/*****************************************************************************/ ++/* */ ++/* LOGGING */ ++/* */ ++/*****************************************************************************/ ++/*****************************************************************************/ ++ ++/*****************************************************************************/ ++/* Debug macros. */ ++/*****************************************************************************/ ++#define EVEL_DEBUG(FMT, ...) log_debug(EVEL_LOG_DEBUG, (FMT), ##__VA_ARGS__) ++#define EVEL_INFO(FMT, ...) log_debug(EVEL_LOG_INFO, (FMT), ##__VA_ARGS__) ++#define EVEL_SPAMMY(FMT, ...) log_debug(EVEL_LOG_SPAMMY, (FMT), ##__VA_ARGS__) ++#define EVEL_ERROR(FMT, ...) log_debug(EVEL_LOG_ERROR, "ERROR: " FMT, \ ++ ##__VA_ARGS__) ++#define EVEL_ENTER() \ ++ { \ ++ log_debug(EVEL_LOG_DEBUG, "Enter %s {", __FUNCTION__); \ ++ debug_indent += 2; \ ++ } ++#define EVEL_EXIT() \ ++ { \ ++ debug_indent -= 2; \ ++ log_debug(EVEL_LOG_DEBUG, "Exit %s }", __FUNCTION__); \ ++ } ++ ++#define INDENT_SEPARATORS \ ++ "| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | " ++ ++extern EVEL_LOG_LEVELS debug_level; ++extern int debug_indent; ++extern FILE * fout; ++ ++#define EVEL_DEBUG_ON() ((debug_level) >= EVEL_LOG_DEBUG) ++ ++/**************************************************************************//** ++ * Initialize logging ++ * ++ * @param[in] level The debugging level - one of ::EVEL_LOG_LEVELS. ++ * @param[in] ident The identifier for our logs. ++ *****************************************************************************/ ++void log_initialize(EVEL_LOG_LEVELS level, const char * ident); ++ ++/**************************************************************************//** ++ * Log debug information ++ * ++ * Logs debugging information in a platform independent manner. ++ * ++ * @param[in] level The debugging level - one of ::EVEL_LOG_LEVELS. ++ * @param[in] format Log formatting string in printf format. ++ * @param[in] ... Variable argument list. ++ *****************************************************************************/ ++void log_debug(EVEL_LOG_LEVELS level, char * format, ...); ++ ++/***************************************************************************//* ++ * Store the formatted string into the static error string and log the error. ++ * ++ * @param format Error string in standard printf format. ++ * @param ... Variable parameters to be substituted into the format string. ++ *****************************************************************************/ ++void log_error_state(char * format, ...); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif +diff --git a/src/plugins/ves/include/evel_internal.h b/src/plugins/ves/include/evel_internal.h +new file mode 100644 +index 00000000..4608f751 +--- /dev/null ++++ b/src/plugins/ves/include/evel_internal.h +@@ -0,0 +1,852 @@ ++#ifndef EVEL_INTERNAL_INCLUDED ++#define EVEL_INTERNAL_INCLUDED ++ ++/**************************************************************************//** ++ * @file ++ * EVEL internal definitions. ++ * ++ * These are internal definitions which need to be shared between modules ++ * within the library but are not intended for external consumption. ++ * ++ * License ++ * ------- ++ * ++ * Copyright © 2017 AT&T Intellectual Property. All rights reserved. ++ * ++ * 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. ++ *****************************************************************************/ ++ ++#include "evel.h" ++ ++/*****************************************************************************/ ++/* Define some type-safe min/max macros. */ ++/*****************************************************************************/ ++#define max(a,b) \ ++ ({ __typeof__ (a) _a = (a); \ ++ __typeof__ (b) _b = (b); \ ++ _a > _b ? _a : _b; }) ++ ++#define min(a,b) \ ++ ({ __typeof__ (a) _a = (a); \ ++ __typeof__ (b) _b = (b); \ ++ _a < _b ? _a : _b; }) ++ ++ ++/**************************************************************************//** ++ * Compile-time assertion. ++ *****************************************************************************/ ++#define EVEL_CT_ASSERT(X) switch (0) {case 0: case (X):;} ++ ++/**************************************************************************//** ++ * The Functional Role of the equipment represented by this VNF. ++ *****************************************************************************/ ++extern char * functional_role; ++ ++/**************************************************************************//** ++ * The type of equipment represented by this VNF. ++ *****************************************************************************/ ++extern EVEL_SOURCE_TYPES event_source_type; ++ ++/**************************************************************************//** ++ * A chunk of memory used in the cURL functions. ++ *****************************************************************************/ ++typedef struct memory_chunk { ++ char * memory; ++ size_t size; ++} MEMORY_CHUNK; ++ ++/**************************************************************************//** ++ * Global commands that may be sent to the Event Handler thread. ++ *****************************************************************************/ ++typedef enum { ++ EVT_CMD_TERMINATE, ++ EVT_CMD_MAX_COMMANDS ++} EVT_HANDLER_COMMAND; ++ ++/**************************************************************************//** ++ * State of the Event Handler thread. ++ *****************************************************************************/ ++typedef enum { ++ EVT_HANDLER_UNINITIALIZED, /** The library cannot handle events. */ ++ EVT_HANDLER_INACTIVE, /** The event handler thread not started. */ ++ EVT_HANDLER_ACTIVE, /** The event handler thread is started. */ ++ EVT_HANDLER_REQUEST_TERMINATE, /** Initial stages of shutdown. */ ++ EVT_HANDLER_TERMINATING, /** The ring-buffer is being depleted. */ ++ EVT_HANDLER_TERMINATED, /** The library is exited. */ ++ EVT_HANDLER_MAX_STATES /** Maximum number of valid states. */ ++} EVT_HANDLER_STATE; ++ ++/**************************************************************************//** ++ * Internal event. ++ * Pseudo-event used for routing internal commands. ++ *****************************************************************************/ ++typedef struct event_internal { ++ EVENT_HEADER header; ++ EVT_HANDLER_COMMAND command; ++} EVENT_INTERNAL; ++ ++/**************************************************************************//** ++ * Suppressed NV pairs list entry. ++ * JSON equivalent field: suppressedNvPairs ++ *****************************************************************************/ ++typedef struct evel_suppressed_nv_pairs { ++ ++ /***************************************************************************/ ++ /* Mandatory fields */ ++ /* JSON equivalent field: nvPairFieldName */ ++ /***************************************************************************/ ++ char * nv_pair_field_name; ++ ++ /***************************************************************************/ ++ /* Optional fields */ ++ /* JSON equivalent field: suppressedNvPairNames */ ++ /* Type of each list entry: char * */ ++ /***************************************************************************/ ++ DLIST suppressed_nv_pair_names; ++ ++ /***************************************************************************/ ++ /* Hash table containing suppressed_nv_pair_names as keys. */ ++ /***************************************************************************/ ++ struct hsearch_data * hash_nv_pair_names; ++ ++} EVEL_SUPPRESSED_NV_PAIRS; ++ ++/**************************************************************************//** ++ * Event Throttling Specification for a domain which is in a throttled state. ++ * JSON equivalent object: eventThrottlingState ++ *****************************************************************************/ ++typedef struct evel_throttle_spec { ++ ++ /***************************************************************************/ ++ /* List of field names to be suppressed. */ ++ /* JSON equivalent field: suppressedFieldNames */ ++ /* Type of each list entry: char * */ ++ /***************************************************************************/ ++ DLIST suppressed_field_names; ++ ++ /***************************************************************************/ ++ /* List of name-value pairs to be suppressed. */ ++ /* JSON equivalent field: suppressedNvPairsList */ ++ /* Type of each list entry: EVEL_SUPPRESSED_NV_PAIRS * */ ++ /***************************************************************************/ ++ DLIST suppressed_nv_pairs_list; ++ ++ /***************************************************************************/ ++ /* Hash table containing suppressed_nv_pair_names as keys. */ ++ /***************************************************************************/ ++ struct hsearch_data * hash_field_names; ++ ++ /***************************************************************************/ ++ /* Hash table containing nv_pair_field_name as keys, and */ ++ /* suppressed_nv_pairs_list as values. */ ++ /***************************************************************************/ ++ struct hsearch_data * hash_nv_pairs_list; ++ ++} EVEL_THROTTLE_SPEC; ++ ++/*****************************************************************************/ ++/* RFC2822 format string for strftime. */ ++/*****************************************************************************/ ++#define EVEL_RFC2822_STRFTIME_FORMAT "%a, %d %b %Y %T %z" ++ ++/*****************************************************************************/ ++/* EVEL_JSON_BUFFER depth at which we throttle fields. */ ++/*****************************************************************************/ ++#define EVEL_THROTTLE_FIELD_DEPTH 3 ++ ++/**************************************************************************//** ++ * Initialize the event handler. ++ * ++ * Primarily responsible for getting cURL ready for use. ++ * ++ * @param[in] event_api_url ++ * The URL where the Vendor Event Listener API is expected ++ * to be. ++ * @param[in] throt_api_url ++ * The URL where the Throttling API is expected to be. ++ * @param[in] username The username for the Basic Authentication of requests. ++ * @param[in] password The password for the Basic Authentication of requests. ++ * @param verbosity 0 for normal operation, positive values for chattier ++ * logs. ++ *****************************************************************************/ ++EVEL_ERR_CODES event_handler_initialize(const char * const event_api_url, ++ const char * const throt_api_url, ++ const char * const username, ++ const char * const password, ++ int verbosity); ++ ++/**************************************************************************//** ++ * Terminate the event handler. ++ * ++ * Shuts down the event handler thread in as clean a way as possible. Sets the ++ * global exit flag and then signals the thread to interrupt it since it's ++ * most likely waiting on the ring-buffer. ++ * ++ * Having achieved an orderly shutdown of the event handler thread, clean up ++ * the cURL library's resources cleanly. ++ * ++ * @return Status code. ++ * @retval ::EVEL_SUCCESS if everything OK. ++ * @retval One of ::EVEL_ERR_CODES if there was a problem. ++ *****************************************************************************/ ++EVEL_ERR_CODES event_handler_terminate(); ++ ++/**************************************************************************//** ++ * Run the event handler. ++ * ++ * Spawns the thread responsible for handling events and sending them to the ++ * API. ++ * ++ * @return Status code. ++ * @retval ::EVEL_SUCCESS if everything OK. ++ * @retval One of ::EVEL_ERR_CODES if there was a problem. ++ *****************************************************************************/ ++EVEL_ERR_CODES event_handler_run(); ++ ++/**************************************************************************//** ++ * Create a new internal event. ++ * ++ * @note The mandatory fields on the Fault must be supplied to this factory ++ * function and are immutable once set. Optional fields have explicit ++ * setter functions, but again values may only be set once so that the ++ * Fault has immutable properties. ++ * @param command The condition indicated by the event. ++ * @returns pointer to the newly manufactured ::EVENT_INTERNAL. If the event ++ * is not used (i.e. posted) it must be released using ++ * ::evel_free_event. ++ * @retval NULL Failed to create the event. ++ *****************************************************************************/ ++EVENT_INTERNAL * evel_new_internal_event(EVT_HANDLER_COMMAND command); ++ ++/**************************************************************************//** ++ * Free an internal event. ++ * ++ * Free off the event supplied. Will free all the contained* allocated memory. ++ * ++ * @note It does not free the internal event itself, since that may be part of ++ * a larger structure. ++ *****************************************************************************/ ++void evel_free_internal_event(EVENT_INTERNAL * event); ++ ++/**************************************************************************//** ++ * Initialize an event instance id, typically embedded in an event. ++ * ++ * @param instance_id Pointer to the event instance id being initialized. ++ * @param vendor_id The vendor id to encode in the event instance id. ++ * @param event_id The event id to encode in the event instance id. ++ *****************************************************************************/ ++void evel_init_event_instance_id(EVEL_EVENT_INSTANCE_ID * const instance_id, ++ const char * const vendor_id, ++ const char * const event_id); ++ ++/**************************************************************************//** ++ * Free an event instance id. ++ * ++ * @param instance_id Pointer to the event instance id being initialized. ++ *****************************************************************************/ ++void evel_free_event_instance_id(EVEL_EVENT_INSTANCE_ID * const instance_id); ++ ++/*****************************************************************************/ ++/* Structure to hold JSON buffer and associated tracking, as it is written. */ ++/*****************************************************************************/ ++typedef struct evel_json_buffer ++{ ++ char * json; ++ int offset; ++ int max_size; ++ ++ /***************************************************************************/ ++ /* The working throttle specification, which can be NULL. */ ++ /***************************************************************************/ ++ EVEL_THROTTLE_SPEC * throttle_spec; ++ ++ /***************************************************************************/ ++ /* Current object/list nesting depth. */ ++ /***************************************************************************/ ++ int depth; ++ ++ /***************************************************************************/ ++ /* The checkpoint. */ ++ /***************************************************************************/ ++ int checkpoint; ++ ++} EVEL_JSON_BUFFER; ++ ++/**************************************************************************//** ++ * Encode the event as a JSON event object according to AT&T's schema. ++ * ++ * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to encode into. ++ * @param event Pointer to the ::EVENT_HEADER to encode. ++ *****************************************************************************/ ++void evel_json_encode_header(EVEL_JSON_BUFFER * jbuf, ++ EVENT_HEADER * event); ++ ++/**************************************************************************//** ++ * Encode the instance id as a JSON object according to AT&T's schema. ++ * ++ * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to encode into. ++ * @param instance_id Pointer to the ::EVEL_EVENT_INSTANCE_ID to encode. ++ *****************************************************************************/ ++void evel_json_encode_instance_id(EVEL_JSON_BUFFER * jbuf, ++ EVEL_EVENT_INSTANCE_ID * instance_id); ++ ++/**************************************************************************//** ++ * Encode the fault in JSON according to AT&T's schema for the fault type. ++ * ++ * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to encode into. ++ * @param event Pointer to the ::EVENT_HEADER to encode. ++ *****************************************************************************/ ++void evel_json_encode_fault(EVEL_JSON_BUFFER * jbuf, ++ EVENT_FAULT * event); ++ ++/**************************************************************************//** ++ * Encode the measurement as a JSON measurement. ++ * ++ * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to encode into. ++ * @param event Pointer to the ::EVENT_HEADER to encode. ++ *****************************************************************************/ ++void evel_json_encode_measurement(EVEL_JSON_BUFFER * jbuf, ++ EVENT_MEASUREMENT * event); ++ ++/**************************************************************************//** ++ * Encode the Mobile Flow in JSON according to AT&T's schema for the event ++ * type. ++ * ++ * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to encode into. ++ * @param event Pointer to the ::EVENT_HEADER to encode. ++ *****************************************************************************/ ++void evel_json_encode_mobile_flow(EVEL_JSON_BUFFER * jbuf, ++ EVENT_MOBILE_FLOW * event); ++ ++/**************************************************************************//** ++ * Encode the report as a JSON report. ++ * ++ * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to encode into. ++ * @param event Pointer to the ::EVENT_HEADER to encode. ++ *****************************************************************************/ ++void evel_json_encode_report(EVEL_JSON_BUFFER * jbuf, ++ EVENT_REPORT * event); ++ ++/**************************************************************************//** ++ * Encode the Service Event in JSON according to AT&T's schema for the event ++ * type. ++ * ++ * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to encode into. ++ * @param event Pointer to the ::EVENT_HEADER to encode. ++ *****************************************************************************/ ++void evel_json_encode_service(EVEL_JSON_BUFFER * const jbuf, ++ EVENT_SERVICE * const event); ++ ++/**************************************************************************//** ++ * Encode the Signaling in JSON according to AT&T's schema for the event type. ++ * ++ * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to encode into. ++ * @param event Pointer to the ::EVENT_HEADER to encode. ++ *****************************************************************************/ ++void evel_json_encode_signaling(EVEL_JSON_BUFFER * const jbuf, ++ EVENT_SIGNALING * const event); ++ ++/**************************************************************************//** ++ * Encode the state change as a JSON state change. ++ * ++ * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to encode into. ++ * @param state_change Pointer to the ::EVENT_STATE_CHANGE to encode. ++ *****************************************************************************/ ++void evel_json_encode_state_change(EVEL_JSON_BUFFER * jbuf, ++ EVENT_STATE_CHANGE * state_change); ++ ++/**************************************************************************//** ++ * Encode the Syslog in JSON according to AT&T's schema for the event type. ++ * ++ * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to encode into. ++ * @param event Pointer to the ::EVENT_HEADER to encode. ++ *****************************************************************************/ ++void evel_json_encode_syslog(EVEL_JSON_BUFFER * jbuf, ++ EVENT_SYSLOG * event); ++ ++/**************************************************************************//** ++ * Encode the Other in JSON according to AT&T's schema for the event type. ++ * ++ * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to encode into. ++ * @param event Pointer to the ::EVENT_HEADER to encode. ++ *****************************************************************************/ ++void evel_json_encode_other(EVEL_JSON_BUFFER * jbuf, ++ EVENT_OTHER * event); ++ ++/**************************************************************************//** ++ * Set the next event_sequence to use. ++ * ++ * @param sequence The next sequence number to use. ++ *****************************************************************************/ ++void evel_set_next_event_sequence(const int sequence); ++ ++/**************************************************************************//** ++ * Handle a JSON response from the listener, contained in a ::MEMORY_CHUNK. ++ * ++ * Tokenize the response, and decode any tokens found. ++ * ++ * @param chunk The memory chunk containing the response. ++ * @param post The memory chunk in which to place any resulting POST. ++ *****************************************************************************/ ++void evel_handle_event_response(const MEMORY_CHUNK * const chunk, ++ MEMORY_CHUNK * const post); ++ ++/**************************************************************************//** ++ * Initialize a ::EVEL_JSON_BUFFER. ++ * ++ * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to initialise. ++ * @param json Pointer to the underlying working buffer to use. ++ * @param max_size Size of storage available in the JSON buffer. ++ * @param throttle_spec Pointer to throttle specification. Can be NULL. ++ *****************************************************************************/ ++void evel_json_buffer_init(EVEL_JSON_BUFFER * jbuf, ++ char * const json, ++ const int max_size, ++ EVEL_THROTTLE_SPEC * throttle_spec); ++ ++/**************************************************************************//** ++ * Encode a string key and string value to a ::EVEL_JSON_BUFFER. ++ * ++ * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. ++ * @param key Pointer to the key to encode. ++ * @param option Pointer to holder of the corresponding value to encode. ++ * @return true if the key, value was added, false if it was suppressed. ++ *****************************************************************************/ ++bool evel_enc_kv_opt_string(EVEL_JSON_BUFFER * jbuf, ++ const char * const key, ++ const EVEL_OPTION_STRING * const option); ++ ++/**************************************************************************//** ++ * Encode a string key and string value to a ::EVEL_JSON_BUFFER. ++ * ++ * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. ++ * @param key Pointer to the key to encode. ++ * @param value Pointer to the corresponding value to encode. ++ *****************************************************************************/ ++void evel_enc_kv_string(EVEL_JSON_BUFFER * jbuf, ++ const char * const key, ++ const char * const value); ++ ++/**************************************************************************//** ++ * Encode a string key and integer value to a ::EVEL_JSON_BUFFER. ++ * ++ * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. ++ * @param key Pointer to the key to encode. ++ * @param option Pointer to holder of the corresponding value to encode. ++ * @return true if the key, value was added, false if it was suppressed. ++ *****************************************************************************/ ++bool evel_enc_kv_opt_int(EVEL_JSON_BUFFER * jbuf, ++ const char * const key, ++ const EVEL_OPTION_INT * const option); ++ ++/**************************************************************************//** ++ * Encode a string key and integer value to a ::EVEL_JSON_BUFFER. ++ * ++ * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. ++ * @param key Pointer to the key to encode. ++ * @param value The corresponding value to encode. ++ *****************************************************************************/ ++void evel_enc_kv_int(EVEL_JSON_BUFFER * jbuf, ++ const char * const key, ++ const int value); ++ ++/**************************************************************************//** ++ * Encode a string key and double value to a ::EVEL_JSON_BUFFER. ++ * ++ * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. ++ * @param key Pointer to the key to encode. ++ * @param option Pointer to holder of the corresponding value to encode. ++ * @return true if the key, value was added, false if it was suppressed. ++ *****************************************************************************/ ++bool evel_enc_kv_opt_double(EVEL_JSON_BUFFER * jbuf, ++ const char * const key, ++ const EVEL_OPTION_DOUBLE * const option); ++ ++/**************************************************************************//** ++ * Encode a string key and double value to a ::EVEL_JSON_BUFFER. ++ * ++ * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. ++ * @param key Pointer to the key to encode. ++ * @param value The corresponding value to encode. ++ *****************************************************************************/ ++void evel_enc_kv_double(EVEL_JSON_BUFFER * jbuf, ++ const char * const key, ++ const double value); ++ ++/**************************************************************************//** ++ * Encode a string key and unsigned long long value to a ::EVEL_JSON_BUFFER. ++ * ++ * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. ++ * @param key Pointer to the key to encode. ++ * @param option Pointer to holder of the corresponding value to encode. ++ * @return true if the key, value was added, false if it was suppressed. ++ *****************************************************************************/ ++bool evel_enc_kv_opt_ull(EVEL_JSON_BUFFER * jbuf, ++ const char * const key, ++ const EVEL_OPTION_ULL * const option); ++ ++/**************************************************************************//** ++ * Encode a string key and unsigned long long value to a ::EVEL_JSON_BUFFER. ++ * ++ * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. ++ * @param key Pointer to the key to encode. ++ * @param value The corresponding value to encode. ++ *****************************************************************************/ ++void evel_enc_kv_ull(EVEL_JSON_BUFFER * jbuf, ++ const char * const key, ++ const unsigned long long value); ++ ++/**************************************************************************//** ++ * Encode a string key and time value to a ::EVEL_JSON_BUFFER. ++ * ++ * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. ++ * @param key Pointer to the key to encode. ++ * @param option Pointer to holder of the corresponding value to encode. ++ * @return true if the key, value was added, false if it was suppressed. ++ *****************************************************************************/ ++bool evel_enc_kv_opt_time(EVEL_JSON_BUFFER * jbuf, ++ const char * const key, ++ const EVEL_OPTION_TIME * const option); ++ ++/**************************************************************************//** ++ * Encode a string key and time value to a ::EVEL_JSON_BUFFER. ++ * ++ * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. ++ * @param key Pointer to the key to encode. ++ * @param time Pointer to the time to encode. ++ *****************************************************************************/ ++void evel_enc_kv_time(EVEL_JSON_BUFFER * jbuf, ++ const char * const key, ++ const time_t * time); ++ ++/**************************************************************************//** ++ * Encode a key and version. ++ * ++ * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. ++ * @param key Pointer to the key to encode. ++ * @param major_version The major version to encode. ++ * @param minor_version The minor version to encode. ++ *****************************************************************************/ ++void evel_enc_version(EVEL_JSON_BUFFER * jbuf, ++ const char * const key, ++ const int major_version, ++ const int minor_version); ++ ++/**************************************************************************//** ++ * Add the key and opening bracket of an optional named list to a JSON buffer. ++ * ++ * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. ++ * @param key Pointer to the key to encode. ++ * @return true if the list was opened, false if it was suppressed. ++ *****************************************************************************/ ++bool evel_json_open_opt_named_list(EVEL_JSON_BUFFER * jbuf, ++ const char * const key); ++ ++/**************************************************************************//** ++ * Add the key and opening bracket of a named list to a JSON buffer. ++ * ++ * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. ++ * @param key Pointer to the key to encode. ++ *****************************************************************************/ ++void evel_json_open_named_list(EVEL_JSON_BUFFER * jbuf, ++ const char * const key); ++ ++/**************************************************************************//** ++ * Add the closing bracket of a list to a JSON buffer. ++ * ++ * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. ++ *****************************************************************************/ ++void evel_json_close_list(EVEL_JSON_BUFFER * jbuf); ++ ++/**************************************************************************//** ++ * Encode a list item with format and param list to a ::EVEL_JSON_BUFFER. ++ * ++ * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. ++ * @param format Format string in standard printf format. ++ * @param ... Variable parameters for format string. ++ *****************************************************************************/ ++void evel_enc_list_item(EVEL_JSON_BUFFER * jbuf, ++ const char * const format, ++ ...); ++ ++/**************************************************************************//** ++ * Add the opening bracket of an optional named object to a JSON buffer. ++ * ++ * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. ++ * @param key Pointer to the key to encode. ++ *****************************************************************************/ ++bool evel_json_open_opt_named_object(EVEL_JSON_BUFFER * jbuf, ++ const char * const key); ++ ++/**************************************************************************//** ++ * Add the opening bracket of an object to a JSON buffer. ++ * ++ * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. ++ * @param key Pointer to the key to encode. ++ * @return true if the object was opened, false if it was suppressed. ++ *****************************************************************************/ ++void evel_json_open_named_object(EVEL_JSON_BUFFER * jbuf, ++ const char * const key); ++ ++/**************************************************************************//** ++ * Add the opening bracket of an object to a JSON buffer. ++ * ++ * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. ++ *****************************************************************************/ ++void evel_json_open_object(EVEL_JSON_BUFFER * jbuf); ++ ++/**************************************************************************//** ++ * Add the closing bracket of an object to a JSON buffer. ++ * ++ * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. ++ *****************************************************************************/ ++void evel_json_close_object(EVEL_JSON_BUFFER * jbuf); ++ ++/**************************************************************************//** ++ * Add a checkpoint - a stake in the ground to which we can rewind. ++ * ++ * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. ++ *****************************************************************************/ ++void evel_json_checkpoint(EVEL_JSON_BUFFER * jbuf); ++ ++/**************************************************************************//** ++ * Rewind to the latest checkoint. ++ * ++ * @param jbuf Pointer to working ::EVEL_JSON_BUFFER. ++ *****************************************************************************/ ++void evel_json_rewind(EVEL_JSON_BUFFER * jbuf); ++ ++/**************************************************************************//** ++ * Free the underlying resources of an ::EVEL_OPTION_STRING. ++ * ++ * @param option Pointer to the ::EVEL_OPTION_STRING. ++ *****************************************************************************/ ++void evel_free_option_string(EVEL_OPTION_STRING * const option); ++ ++/**************************************************************************//** ++ * Initialize an ::EVEL_OPTION_STRING to a not-set state. ++ * ++ * @param option Pointer to the ::EVEL_OPTION_STRING. ++ *****************************************************************************/ ++void evel_init_option_string(EVEL_OPTION_STRING * const option); ++ ++/**************************************************************************//** ++ * Set the value of an ::EVEL_OPTION_STRING. ++ * ++ * @param option Pointer to the ::EVEL_OPTION_STRING. ++ * @param value The value to set. ++ * @param description Description to be used in logging. ++ *****************************************************************************/ ++void evel_set_option_string(EVEL_OPTION_STRING * const option, ++ const char * const value, ++ const char * const description); ++ ++/**************************************************************************//** ++ * Force the value of an ::EVEL_OPTION_STRING. ++ * ++ * @param option Pointer to the ::EVEL_OPTION_STRING. ++ * @param value The value to set. ++ *****************************************************************************/ ++void evel_force_option_string(EVEL_OPTION_STRING * const option, ++ const char * const value); ++ ++/**************************************************************************//** ++ * Initialize an ::EVEL_OPTION_INT to a not-set state. ++ * ++ * @param option Pointer to the ::EVEL_OPTION_INT. ++ *****************************************************************************/ ++void evel_init_option_int(EVEL_OPTION_INT * const option); ++ ++/**************************************************************************//** ++ * Force the value of an ::EVEL_OPTION_INT. ++ * ++ * @param option Pointer to the ::EVEL_OPTION_INT. ++ * @param value The value to set. ++ *****************************************************************************/ ++void evel_force_option_int(EVEL_OPTION_INT * const option, ++ const int value); ++ ++/**************************************************************************//** ++ * Set the value of an ::EVEL_OPTION_INT. ++ * ++ * @param option Pointer to the ::EVEL_OPTION_INT. ++ * @param value The value to set. ++ * @param description Description to be used in logging. ++ *****************************************************************************/ ++void evel_set_option_int(EVEL_OPTION_INT * const option, ++ const int value, ++ const char * const description); ++ ++/**************************************************************************//** ++ * Initialize an ::EVEL_OPTION_DOUBLE to a not-set state. ++ * ++ * @param option Pointer to the ::EVEL_OPTION_DOUBLE. ++ *****************************************************************************/ ++void evel_init_option_double(EVEL_OPTION_DOUBLE * const option); ++ ++/**************************************************************************//** ++ * Force the value of an ::EVEL_OPTION_DOUBLE. ++ * ++ * @param option Pointer to the ::EVEL_OPTION_DOUBLE. ++ * @param value The value to set. ++ *****************************************************************************/ ++void evel_force_option_double(EVEL_OPTION_DOUBLE * const option, ++ const double value); ++ ++/**************************************************************************//** ++ * Set the value of an ::EVEL_OPTION_DOUBLE. ++ * ++ * @param option Pointer to the ::EVEL_OPTION_DOUBLE. ++ * @param value The value to set. ++ * @param description Description to be used in logging. ++ *****************************************************************************/ ++void evel_set_option_double(EVEL_OPTION_DOUBLE * const option, ++ const double value, ++ const char * const description); ++ ++/**************************************************************************//** ++ * Initialize an ::EVEL_OPTION_ULL to a not-set state. ++ * ++ * @param option Pointer to the ::EVEL_OPTION_ULL. ++ *****************************************************************************/ ++void evel_init_option_ull(EVEL_OPTION_ULL * const option); ++ ++/**************************************************************************//** ++ * Force the value of an ::EVEL_OPTION_ULL. ++ * ++ * @param option Pointer to the ::EVEL_OPTION_ULL. ++ * @param value The value to set. ++ *****************************************************************************/ ++void evel_force_option_ull(EVEL_OPTION_ULL * const option, ++ const unsigned long long value); ++ ++/**************************************************************************//** ++ * Set the value of an ::EVEL_OPTION_ULL. ++ * ++ * @param option Pointer to the ::EVEL_OPTION_ULL. ++ * @param value The value to set. ++ * @param description Description to be used in logging. ++ *****************************************************************************/ ++void evel_set_option_ull(EVEL_OPTION_ULL * const option, ++ const unsigned long long value, ++ const char * const description); ++ ++/**************************************************************************//** ++ * Initialize an ::EVEL_OPTION_TIME to a not-set state. ++ * ++ * @param option Pointer to the ::EVEL_OPTION_TIME. ++ *****************************************************************************/ ++void evel_init_option_time(EVEL_OPTION_TIME * const option); ++ ++/**************************************************************************//** ++ * Force the value of an ::EVEL_OPTION_TIME. ++ * ++ * @param option Pointer to the ::EVEL_OPTION_TIME. ++ * @param value The value to set. ++ *****************************************************************************/ ++void evel_force_option_time(EVEL_OPTION_TIME * const option, ++ const time_t value); ++ ++/**************************************************************************//** ++ * Set the value of an ::EVEL_OPTION_TIME. ++ * ++ * @param option Pointer to the ::EVEL_OPTION_TIME. ++ * @param value The value to set. ++ * @param description Description to be used in logging. ++ *****************************************************************************/ ++void evel_set_option_time(EVEL_OPTION_TIME * const option, ++ const time_t value, ++ const char * const description); ++ ++/**************************************************************************//** ++ * Map an ::EVEL_COUNTER_CRITICALITIES enum value to the equivalent string. ++ * ++ * @param criticality The criticality to convert. ++ * @returns The equivalent string. ++ *****************************************************************************/ ++char * evel_criticality(const EVEL_COUNTER_CRITICALITIES criticality); ++ ++/**************************************************************************//** ++ * Map an ::EVEL_SEVERITIES enum value to the equivalent string. ++ * ++ * @param severity The severity to convert. ++ * @returns The equivalent string. ++ *****************************************************************************/ ++char * evel_severity(const EVEL_SEVERITIES severity); ++ ++/**************************************************************************//** ++ * Map an ::EVEL_ALERT_ACTIONS enum value to the equivalent string. ++ * ++ * @param alert_action The alert_action to convert. ++ * @returns The equivalent string. ++ *****************************************************************************/ ++char * evel_alert_action(const EVEL_ALERT_ACTIONS alert_action); ++ ++/**************************************************************************//** ++ * Map an ::EVEL_ALERT_TYPES enum value to the equivalent string. ++ * ++ * @param alert_type The alert_type to convert. ++ * @returns The equivalent string. ++ *****************************************************************************/ ++char * evel_alert_type(const EVEL_ALERT_TYPES alert_type); ++ ++/**************************************************************************//** ++ * Map an ::EVEL_EVENT_DOMAINS enum value to the equivalent string. ++ * ++ * @param domain The domain to convert. ++ * @returns The equivalent string. ++ *****************************************************************************/ ++char * evel_event_domain(const EVEL_EVENT_DOMAINS domain); ++ ++/**************************************************************************//** ++ * Map an ::EVEL_EVENT_PRIORITIES enum value to the equivalent string. ++ * ++ * @param priority The priority to convert. ++ * @returns The equivalent string. ++ *****************************************************************************/ ++char * evel_event_priority(const EVEL_EVENT_PRIORITIES priority); ++ ++/**************************************************************************//** ++ * Map an ::EVEL_SOURCE_TYPES enum value to the equivalent string. ++ * ++ * @param source_type The source type to convert. ++ * @returns The equivalent string. ++ *****************************************************************************/ ++char * evel_source_type(const EVEL_SOURCE_TYPES source_type); ++ ++/**************************************************************************//** ++ * Map an ::EVEL_VF_STATUSES enum value to the equivalent string. ++ * ++ * @param vf_status The vf_status to convert. ++ * @returns The equivalent string. ++ *****************************************************************************/ ++char * evel_vf_status(const EVEL_VF_STATUSES vf_status); ++ ++/**************************************************************************//** ++ * Convert a ::EVEL_ENTITY_STATE to it's string form for JSON encoding. ++ * ++ * @param state The entity state to encode. ++ * ++ * @returns the corresponding string ++ *****************************************************************************/ ++char * evel_entity_state(const EVEL_ENTITY_STATE state); ++ ++/**************************************************************************//** ++ * Convert a ::EVEL_SERVICE_ENDPOINT_DESC to string form for JSON encoding. ++ * ++ * @param endpoint_desc endpoint description to encode. ++ * ++ * @returns the corresponding string ++ *****************************************************************************/ ++char * evel_service_endpoint_desc(const EVEL_ENTITY_STATE endpoint_desc); ++ ++#endif +diff --git a/src/plugins/ves/include/evel_throttle.h b/src/plugins/ves/include/evel_throttle.h +new file mode 100644 +index 00000000..70371410 +--- /dev/null ++++ b/src/plugins/ves/include/evel_throttle.h +@@ -0,0 +1,213 @@ ++#ifndef EVEL_THROTTLE_INCLUDED ++#define EVEL_THROTTLE_INCLUDED ++ ++/**************************************************************************//** ++ * @file ++ * EVEL throttle definitions. ++ * ++ * These are internal definitions related to throttling specicications, which ++ * are required within the library but are not intended for external ++ * consumption. ++ * ++ * License ++ * ------- ++ * ++ * Copyright © 2017 AT&T Intellectual Property. All rights reserved. ++ * ++ * 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. ++ *****************************************************************************/ ++ ++#include "evel_internal.h" ++#include "jsmn.h" ++ ++/*****************************************************************************/ ++/* Maximum depth of JSON response that we can handle. */ ++/*****************************************************************************/ ++#define EVEL_JSON_STACK_DEPTH 10 ++ ++/**************************************************************************//** ++ * Maximum number of tokens that we allow for in a JSON response. ++ *****************************************************************************/ ++#define EVEL_MAX_RESPONSE_TOKENS 1024 ++ ++/**************************************************************************//** ++ * The nature of the next token that we are iterating through. Within an ++ * object, we alternate between collecting keys and values. Within an array, ++ * we only collect items. ++ *****************************************************************************/ ++typedef enum { ++ EVEL_JSON_KEY, ++ EVEL_JSON_VALUE, ++ EVEL_JSON_ITEM ++} EVEL_JSON_STATE; ++ ++/**************************************************************************//** ++ * States which we move through during JSON processing, tracking our way ++ * through the supported JSON structure. ++ *****************************************************************************/ ++typedef enum ++{ ++ /***************************************************************************/ ++ /* Initial state. */ ++ /***************************************************************************/ ++ EVEL_JCS_START, ++ ++ /***************************************************************************/ ++ /* {"commandList": [ */ ++ /***************************************************************************/ ++ EVEL_JCS_COMMAND_LIST, ++ ++ /***************************************************************************/ ++ /* {"commandList": [{ */ ++ /***************************************************************************/ ++ EVEL_JCS_COMMAND_LIST_ENTRY, ++ ++ /***************************************************************************/ ++ /* {"commandList": [{"command": { */ ++ /***************************************************************************/ ++ EVEL_JCS_COMMAND, ++ ++ /***************************************************************************/ ++ /* ... "eventDomainThrottleSpecification": { */ ++ /***************************************************************************/ ++ EVEL_JCS_SPEC, ++ ++ /***************************************************************************/ ++ /* ... "suppressedFieldNames": [ */ ++ /***************************************************************************/ ++ EVEL_JCS_FIELD_NAMES, ++ ++ /***************************************************************************/ ++ /* ... "suppressedNvPairsList": [ */ ++ /***************************************************************************/ ++ EVEL_JCS_PAIRS_LIST, ++ ++ /***************************************************************************/ ++ /* ... "suppressedNvPairsList": [{ */ ++ /***************************************************************************/ ++ EVEL_JCS_PAIRS_LIST_ENTRY, ++ ++ /***************************************************************************/ ++ /* ... "suppressedNvPairNames": [ */ ++ /***************************************************************************/ ++ EVEL_JCS_NV_PAIR_NAMES, ++ ++ EVEL_JCS_MAX ++} EVEL_JSON_COMMAND_STATE; ++ ++/**************************************************************************//** ++ * An entry in the JSON stack. ++ *****************************************************************************/ ++typedef struct evel_json_stack_entry { ++ ++ /***************************************************************************/ ++ /* The number of elements required at this level. */ ++ /***************************************************************************/ ++ int num_required; ++ ++ /***************************************************************************/ ++ /* The number of elements collected at this level. */ ++ /***************************************************************************/ ++ int json_count; ++ ++ /***************************************************************************/ ++ /* The collection state at this level in the JSON stack. */ ++ /***************************************************************************/ ++ EVEL_JSON_STATE json_state; ++ ++ /***************************************************************************/ ++ /* The key being collected (if json_state is EVEL_JSON_VALUE), or NULL. */ ++ /***************************************************************************/ ++ char * json_key; ++ ++} EVEL_JSON_STACK_ENTRY; ++ ++/**************************************************************************//** ++ * The JSON stack. ++ *****************************************************************************/ ++typedef struct evel_json_stack { ++ ++ /***************************************************************************/ ++ /* The current position of the stack - starting at zero. */ ++ /***************************************************************************/ ++ int level; ++ ++ /***************************************************************************/ ++ /* The stack itself. */ ++ /***************************************************************************/ ++ EVEL_JSON_STACK_ENTRY entry[EVEL_JSON_STACK_DEPTH]; ++ ++ /***************************************************************************/ ++ /* The underlying memory chunk. */ ++ /***************************************************************************/ ++ const MEMORY_CHUNK * chunk; ++ ++} EVEL_JSON_STACK; ++ ++/**************************************************************************//** ++ * Initialize event throttling to the default state. ++ * ++ * Called from ::evel_initialize. ++ *****************************************************************************/ ++void evel_throttle_initialize(); ++ ++/**************************************************************************//** ++ * Clean up event throttling. ++ * ++ * Called from ::evel_terminate. ++ *****************************************************************************/ ++void evel_throttle_terminate(); ++ ++/**************************************************************************//** ++ * Handle a JSON response from the listener, as a list of tokens from JSMN. ++ * ++ * @param chunk Memory chunk containing the JSON buffer. ++ * @param json_tokens Array of tokens to handle. ++ * @param num_tokens The number of tokens to handle. ++ * @param post The memory chunk in which to place any resulting POST. ++ * @return true if the command was handled, false otherwise. ++ *****************************************************************************/ ++bool evel_handle_command_list(const MEMORY_CHUNK * const chunk, ++ const jsmntok_t * const json_tokens, ++ const int num_tokens, ++ MEMORY_CHUNK * const post); ++ ++/**************************************************************************//** ++ * Return the ::EVEL_THROTTLE_SPEC for a given domain. ++ * ++ * @param domain The domain for which to return state. ++ *****************************************************************************/ ++EVEL_THROTTLE_SPEC * evel_get_throttle_spec(EVEL_EVENT_DOMAINS domain); ++ ++/**************************************************************************//** ++ * Determine whether a field_name should be suppressed. ++ * ++ * @param throttle_spec Throttle specification for the domain being encoded. ++ * @param field_name The field name to encoded or suppress. ++ * @return true if the field_name should be suppressed, false otherwise. ++ *****************************************************************************/ ++bool evel_throttle_suppress_field(EVEL_THROTTLE_SPEC * throttle_spec, ++ const char * const field_name); ++ ++/**************************************************************************//** ++ * Determine whether a name-value pair should be allowed (not suppressed). ++ * ++ * @param throttle_spec Throttle specification for the domain being encoded. ++ * @param field_name The field name holding the name-value pairs. ++ * @param name The name of the name-value pair to encoded or suppress. ++ * @return true if the name-value pair should be suppressed, false otherwise. ++ *****************************************************************************/ ++bool evel_throttle_suppress_nv_pair(EVEL_THROTTLE_SPEC * throttle_spec, ++ const char * const field_name, ++ const char * const name); ++ ++#endif +diff --git a/src/plugins/ves/include/jsmn.h b/src/plugins/ves/include/jsmn.h +new file mode 100644 +index 00000000..01ca99c8 +--- /dev/null ++++ b/src/plugins/ves/include/jsmn.h +@@ -0,0 +1,76 @@ ++#ifndef __JSMN_H_ ++#define __JSMN_H_ ++ ++#include <stddef.h> ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/** ++ * JSON type identifier. Basic types are: ++ * o Object ++ * o Array ++ * o String ++ * o Other primitive: number, boolean (true/false) or null ++ */ ++typedef enum { ++ JSMN_UNDEFINED = 0, ++ JSMN_OBJECT = 1, ++ JSMN_ARRAY = 2, ++ JSMN_STRING = 3, ++ JSMN_PRIMITIVE = 4 ++} jsmntype_t; ++ ++enum jsmnerr { ++ /* Not enough tokens were provided */ ++ JSMN_ERROR_NOMEM = -1, ++ /* Invalid character inside JSON string */ ++ JSMN_ERROR_INVAL = -2, ++ /* The string is not a full JSON packet, more bytes expected */ ++ JSMN_ERROR_PART = -3 ++}; ++ ++/** ++ * JSON token description. ++ * @param type type (object, array, string etc.) ++ * @param start start position in JSON data string ++ * @param end end position in JSON data string ++ */ ++typedef struct { ++ jsmntype_t type; ++ int start; ++ int end; ++ int size; ++#ifdef JSMN_PARENT_LINKS ++ int parent; ++#endif ++} jsmntok_t; ++ ++/** ++ * JSON parser. Contains an array of token blocks available. Also stores ++ * the string being parsed now and current position in that string ++ */ ++typedef struct { ++ unsigned int pos; /* offset in the JSON string */ ++ unsigned int toknext; /* next token to allocate */ ++ int toksuper; /* superior token node, e.g parent object or array */ ++} jsmn_parser; ++ ++/** ++ * Create JSON parser over an array of tokens ++ */ ++void jsmn_init(jsmn_parser *parser); ++ ++/** ++ * Run JSON parser. It parses a JSON data string into and array of tokens, each describing ++ * a single JSON object. ++ */ ++int jsmn_parse(jsmn_parser *parser, const char *js, size_t len, ++ jsmntok_t *tokens, unsigned int num_tokens); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* __JSMN_H_ */ +diff --git a/src/plugins/ves/include/metadata.h b/src/plugins/ves/include/metadata.h +new file mode 100644 +index 00000000..bddb8003 +--- /dev/null ++++ b/src/plugins/ves/include/metadata.h +@@ -0,0 +1,57 @@ ++#ifndef METADATA_INCLUDED ++#define METADATA_INCLUDED ++/**************************************************************************//** ++ * @file ++ * Wrap the OpenStack metadata service. ++ * ++ * License ++ * ------- ++ * ++ * Copyright © 2017 AT&T Intellectual Property. All rights reserved. ++ * ++ * 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. ++ *****************************************************************************/ ++ ++ ++#include "evel.h" ++ ++/**************************************************************************//** ++ * Download metadata from the OpenStack metadata service. ++ * ++ * @param verbosity Controls whether to generate debug to stdout. Zero: ++ * none. Non-zero: generate debug. ++ * @returns Status code ++ * @retval EVEL_SUCCESS On success ++ * @retval ::EVEL_ERR_CODES On failure. ++ *****************************************************************************/ ++EVEL_ERR_CODES openstack_metadata(int verbosity); ++ ++/**************************************************************************//** ++ * Initialize default values for vm_name and vm_uuid - for testing purposes. ++ *****************************************************************************/ ++void openstack_metadata_initialize(); ++ ++/**************************************************************************//** ++ * Get the VM name provided by the metadata service. ++ * ++ * @returns VM name ++ *****************************************************************************/ ++const char *openstack_vm_name(); ++ ++/**************************************************************************//** ++ * Get the VM UUID provided by the metadata service. ++ * ++ * @returns VM UUID ++ *****************************************************************************/ ++const char *openstack_vm_uuid(); ++ ++#endif +diff --git a/src/plugins/ves/include/ring_buffer.h b/src/plugins/ves/include/ring_buffer.h +new file mode 100644 +index 00000000..cc08c1ff +--- /dev/null ++++ b/src/plugins/ves/include/ring_buffer.h +@@ -0,0 +1,94 @@ ++#ifndef RING_BUFFER_INCLUDED ++#define RING_BUFFER_INCLUDED ++ ++/**************************************************************************//** ++ * @file ++ * A ring buffer. ++ * ++ * License ++ * ------- ++ * ++ * Copyright © 2017 AT&T Intellectual Property. All rights reserved. ++ * ++ * 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. ++ *****************************************************************************/ ++ ++#include <pthread.h> ++ ++/**************************************************************************//** ++ * Ring buffer structure. ++ *****************************************************************************/ ++typedef struct ring_buffer ++{ ++ int size; ++ int next_write; ++ int next_read; ++ void ** ring; ++ pthread_cond_t ring_cv; ++ pthread_mutex_t ring_mutex; ++} ring_buffer; ++ ++/**************************************************************************//** ++ * Ring buffer initialization. ++ * ++ * Initialize the buffer supplied to the specified size. ++ * ++ * @param buffer Pointer to the ring-buffer to be initialized. ++ * @param size How many elements to be stored in the ring-buffer. ++ * ++ * @returns Nothing ++******************************************************************************/ ++void ring_buffer_initialize(ring_buffer * buffer, int size); ++ ++/**************************************************************************//** ++ * Read an element from a ring_buffer. ++ * ++ * Reads an element from the ring_buffer, advancing the next-read position. ++ * Operation is synchronized and therefore MT-safe. Blocks if no data is ++ * available. ++ * ++ * @param buffer Pointer to the ring-buffer to be read. ++ * ++ * @returns Pointer to the element read from the buffer. ++******************************************************************************/ ++void * ring_buffer_read(ring_buffer * buffer); ++ ++/**************************************************************************//** ++ * Write an element into a ring_buffer. ++ * ++ * Writes an element into the ring_buffer, advancing the next-write position. ++ * Operation is synchronized and therefore MT-safe. Fails if the buffer is ++ * full without blocking. ++ * ++ * @param buffer Pointer to the ring-buffer to be written. ++ * @param msg Pointer to data to be stored in the ring_buffer. ++ * ++ * @returns Number of items written. ++ * @retval 1 The data was written successfully. ++ * @retval 0 The ring_buffer was full so no data written. ++******************************************************************************/ ++int ring_buffer_write(ring_buffer * buffer, void * msg); ++ ++/**************************************************************************//** ++ * Tests whether there is data in the ring_buffer. ++ * ++ * Tests whether there is currently data in the ring_buffer without blocking. ++ * ++ * @param buffer Pointer to the ring-buffer to be tested. ++ * ++ * @returns Whether there is data in the ring_buffer. ++ * @retval 0 There isn't any data in the ring_buffer. ++ * @retval 1 There is data in the ring_buffer. ++******************************************************************************/ ++int ring_buffer_is_empty(ring_buffer * buffer); ++ ++#endif +diff --git a/src/plugins/ves/libs/libevel.a b/src/plugins/ves/libs/libevel.a +new file mode 100644 +index 0000000000000000000000000000000000000000..a56ea84ecf054cbbb23bdaf3c323ce581549dce6 +GIT binary patch +literal 414098 +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 +z@x#4X^43e+	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∋FKVLDQ#J_g=>+NK@;7 +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 +z(MVIzT9%6zv(9dau4#2Z$_CbZK+m)uN1hF>48%0DW@G*7EbDrtIoo;#mN&L;L>Ze{ +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 +z%0D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 +U-CuI!6~$h`9=0Zt-ST?>5B{UL7XSbN + +literal 0 +HcmV?d00001 + +diff --git a/src/plugins/ves/libs/libevel.so b/src/plugins/ves/libs/libevel.so +new file mode 100644 +index 0000000000000000000000000000000000000000..de2b5ed1162ce632aa8b00c7bf15fe57134a9b9a +GIT binary patch +literal 416440 +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�u;mwmOC9r&d*t^D +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 + +literal 0 +HcmV?d00001 + +diff --git a/src/plugins/ves/ves.api b/src/plugins/ves/ves.api +new file mode 100644 +index 00000000..a7106f8d +--- /dev/null ++++ b/src/plugins/ves/ves.api +@@ -0,0 +1,72 @@ ++/* ++ * Copyright (c) 2017 Intel and/or its affiliates. ++ * 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. ++ */ ++ ++/** \brief VES Agent config add / del request ++ @param client_index - opaque cookie to identify the sender ++ @param context - sender context, to match reply w/ request ++ @param server_port - VES Server port ++ @param read_interval - Time period for each loop ++ @param is_add - add the config if non-zero, else delete ++ @param server_addr[] - server address ++*/ ++define ves_agent_config ++{ ++ u32 client_index; ++ u32 context; ++ u32 server_port; ++ u32 read_interval; ++ u32 is_add; ++ u8 server_addr[16]; ++}; ++ ++/** \brief VES Agent config response ++ @param context - sender context, to match reply w/ request ++ @param retval - return code for the request ++*/ ++define ves_agent_config_reply ++{ ++ u32 context; ++ i32 retval; ++}; ++ ++/** \brief VES Agent mode set request ++ @param client_index - opaque cookie to identify the sender ++ @param context - sender context, to match reply w/ request ++ @param pkt_loss_rate - Base packet loss rate if Demo Mode ++ @param work_mode[] - Agent's work mode, real or demo ++*/ ++define ves_agent_mode ++{ ++ u32 client_index; ++ u32 context; ++ u32 pkt_loss_rate; ++ u8 work_mode[8]; ++}; ++ ++/** \brief VES Agent Mode response ++ @param context - sender context, to match reply w/ request ++ @param retval - return code for the request ++*/ ++define ves_agent_mode_reply ++{ ++ u32 context; ++ i32 retval; ++}; ++ ++/* ++ * Local Variables: ++ * eval: (c-set-style "gnu") ++ * End: ++ */ +diff --git a/src/plugins/ves/ves_all_api_h.h b/src/plugins/ves/ves_all_api_h.h +new file mode 100644 +index 00000000..72b15697 +--- /dev/null ++++ b/src/plugins/ves/ves_all_api_h.h +@@ -0,0 +1,18 @@ ++/* ++ * ves_all_api_h.h - skeleton vpp engine plug-in api #include file ++ * ++ * Copyright (c) 2017 Intel and/or its affiliates. ++ * 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. ++ */ ++ ++#include <ves/ves.api.h> +diff --git a/src/plugins/ves/ves_api.c b/src/plugins/ves/ves_api.c +new file mode 100644 +index 00000000..7a9b8004 +--- /dev/null ++++ b/src/plugins/ves/ves_api.c +@@ -0,0 +1,139 @@ ++/* ++ *------------------------------------------------------------------ ++ * ves_api.c - ves api ++ * ++ * Copyright (c) 2017 Intel and/or its affiliates. ++ * 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. ++ *------------------------------------------------------------------ ++ */ ++ ++#include <vnet/vnet.h> ++#include <vlibmemory/api.h> ++ ++#include <vnet/interface.h> ++#include <vnet/api_errno.h> ++#include <vnet/ip/ip.h> ++#include <vnet/ip/ip4.h> ++ ++#include <ves/ves_node.h> ++ ++#include <ves/ves_msg_enum.h> /* define message IDs */ ++ ++#define vl_typedefs /* define message structures */ ++#include <ves/ves_all_api_h.h> ++#undef vl_typedefs ++ ++#define vl_endianfun /* define message structures */ ++#include <ves/ves_all_api_h.h> ++#undef vl_endianfun ++ ++/* instantiate all the print functions we know about */ ++#define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__) ++ ++#define vl_printfun ++#include <ves/ves_all_api_h.h> ++#undef vl_printfun ++ ++ ++#include <vlibapi/api_helper_macros.h> ++ ++#define foreach_vpe_api_msg \ ++_(VES_AGENT_CONFIG,ves_agent_config) \ ++_(VES_AGENT_MODE,ves_agent_mode) ++ ++static void vl_api_ves_agent_config_t_handler ++ (vl_api_ves_agent_config_t *mp) ++{ ++ vl_api_ves_agent_config_reply_t *rmp; ++ ip46_address_t server; ++ int rv = -1; ++ ++ ip46_address_reset (&server); ++ clib_memcpy (&server.ip4, mp->server_addr, sizeof (server.ip4)); ++ ++ rv = ves_set_server(&server, ++ (u32) ntohl (mp->server_port), ++ (u32) ntohl (mp->read_interval), ++ (int) (mp->is_add == 0)); ++ ++ REPLY_MACRO (VL_API_VES_AGENT_CONFIG_REPLY); ++} ++ ++static void vl_api_ves_agent_mode_t_handler ++ (vl_api_ves_agent_mode_t *mp) ++{ ++ vl_api_ves_agent_mode_reply_t *rmp; ++ ves_agent_mode_t mode = VES_AGENT_MODE_REAL; ++ int rv = -1; ++ ++ if (!strcmp((char *)mp->work_mode, "demo") ++ || !strcmp((char *)mp->work_mode, "Demo") ++ || !strcmp((char *)mp->work_mode, "DEMO")) ++ mode = VES_AGENT_MODE_DEMO; ++ ++ rv = ves_agent_set_mode(mode, (u32) ntohl(mp->pkt_loss_rate)); ++ ++ REPLY_MACRO (VL_API_VES_AGENT_MODE_REPLY); ++} ++ ++/* ++ * ves_api_hookup ++ * Add vpe's API message handlers to the table. ++ * vlib has alread mapped shared memory and ++ * added the client registration handlers. ++ * See .../vlib-api/vlibmemory/memclnt_vlib.c:memclnt_process() ++ */ ++#define vl_msg_name_crc_list ++#include <ves/ves_all_api_h.h> ++#undef vl_msg_name_crc_list ++ ++static void ++setup_message_id_table (api_main_t * am) ++{ ++#define _(id,n,crc) vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id); ++ foreach_vl_msg_name_crc_ves; ++#undef _ ++} ++ ++static clib_error_t * ++ves_api_hookup (vlib_main_t * vm) ++{ ++ api_main_t *am = &api_main; ++ ++#define _(N,n) \ ++ vl_msg_api_set_handlers(VL_API_##N, #n, \ ++ vl_api_##n##_t_handler, \ ++ vl_noop_handler, \ ++ vl_api_##n##_t_endian, \ ++ vl_api_##n##_t_print, \ ++ sizeof(vl_api_##n##_t), 1); ++ foreach_vpe_api_msg; ++#undef _ ++ ++ /* ++ * Set up the (msg_name, crc, message-id) table ++ */ ++ setup_message_id_table (am); ++ ++ return 0; ++} ++ ++VLIB_API_INIT_FUNCTION (ves_api_hookup); ++ ++/* ++ * fd.io coding-style-patch-verification: ON ++ * ++ * Local Variables: ++ * eval: (c-set-style "gnu") ++ * End: ++ */ +diff --git a/src/plugins/ves/ves_msg_enum.h b/src/plugins/ves/ves_msg_enum.h +new file mode 100644 +index 00000000..6e8a5dfa +--- /dev/null ++++ b/src/plugins/ves/ves_msg_enum.h +@@ -0,0 +1,31 @@ ++/* ++ * ves_msg_enum.h - vpp engine plug-in message enumeration ++ * ++ * Copyright (c) 2017 Intel and/or its affiliates. ++ * 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. ++ */ ++#ifndef _VES_MSG_ENUM_H_ ++#define _VES_MSG_ENUM_H_ ++ ++#include <vppinfra/byte_order.h> ++ ++#define vl_msg_id(n,h) n, ++typedef enum ++{ ++#include <ves/ves_all_api_h.h> ++ /* We'll want to know how many messages IDs we need... */ ++ VL_MSG_FIRST_AVAILABLE, ++} vl_msg_id_t; ++#undef vl_msg_id ++ ++#endif /* _VES_MSG_ENUM_H_ */ +diff --git a/src/plugins/ves/ves_node.c b/src/plugins/ves/ves_node.c +new file mode 100644 +index 00000000..be9a886c +--- /dev/null ++++ b/src/plugins/ves/ves_node.c +@@ -0,0 +1,582 @@ ++/* ++ * Copyright (c) 2017 Intel and/or its affiliates and others. ++ * 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. ++ */ ++ ++#include <stdio.h> ++#include <stdlib.h> ++#include <unistd.h> ++#include <string.h> ++#include <sys/time.h> ++ ++#include <vnet/plugin/plugin.h> ++#include <vpp/app/version.h> ++ ++#include "ves_node.h" ++ ++#define BUFSIZE 128 ++ ++typedef struct dummy_vpp_metrics_struct { ++ int bytes_in; ++ int bytes_out; ++ int packets_in; ++ int packets_out; ++} vpp_metrics_struct; ++ ++static vlib_node_registration_t ves_agent_process_node; ++vpp_metrics_struct *last_vpp_metrics; ++vpp_metrics_struct *curr_vpp_metrics; ++time_t start_epoch; ++time_t last_epoch; ++char hostname[BUFSIZE]; ++ ++static u8 *format_ves_agent_config(u8 *s, va_list *args); ++ ++void read_vpp_metrics(vpp_metrics_struct *vpp_metrics, char *vnic) { ++ // Define an array of char that contains the parameters of the unix 'cut' command ++ char* params[] = {"-f3", "-f11", "-f4", "-f12"}; ++ // Define the unix command to execute in order to read metrics from the vNIC ++ char* cmd_prefix = "sudo cat /proc/net/dev | grep \""; ++ char* cmd_mid = "\" | tr -s \' \' | cut -d\' \' "; ++ char cmd[BUFSIZE]; ++ // Define other variables ++ char buf[BUFSIZE]; /* buffer used to store VPP metrics */ ++ int temp[] = {0, 0, 0, 0}; /* temp array that contains VPP values */ ++ FILE *fp; /* file descriptor to pipe cmd to shell */ ++ int i; ++ ++ for(i = 0; i < 4; i++) { ++ // Clear buffers ++ memset(buf, 0, BUFSIZE); ++ memset(cmd, 0, BUFSIZE); ++ // Build shell command to read metrics from the vNIC ++ strcat(cmd, cmd_prefix); ++ strcat(cmd, vnic); ++ strcat(cmd, cmd_mid); ++ strcat(cmd, params[i]); ++ ++ // Open a pipe and read VPP values ++ if ((fp = popen(cmd, "r")) == NULL) { ++ printf("Error opening pipe!\n"); ++ return; ++ } ++ ++ while (fgets(buf, BUFSIZE, fp) != NULL); ++ temp[i] = atoi(buf); ++ ++ if(pclose(fp)) { ++ printf("Command not found or exited with error status\n"); ++ return; ++ } ++ } ++ ++ // Store metrics read from the vNIC in the struct passed from the main function ++ vpp_metrics->bytes_in = temp[0]; ++ vpp_metrics->bytes_out = temp[1]; ++ vpp_metrics->packets_in = temp[2]; ++ vpp_metrics->packets_out = temp[3]; ++} ++ ++int ++ves_agent_report_vnic_stats(ves_agent_main_t *vam) ++{ ++ EVEL_ERR_CODES evel_rc = EVEL_SUCCESS; ++ EVENT_MEASUREMENT* vpp_m = NULL; ++ EVENT_HEADER* vpp_m_header = NULL; ++ int bytes_in_this_round; ++ int bytes_out_this_round; ++ int packets_in_this_round; ++ int packets_out_this_round; ++ struct timeval time_val; ++ ++ /* Is not enabled, do nothing */ ++ if (vam->config.is_enabled == VES_AGENT_DISABLED) { ++ return 0; ++ } ++ ++ memset(curr_vpp_metrics, 0, sizeof(vpp_metrics_struct)); ++ read_vpp_metrics(curr_vpp_metrics, DEFAULT_MEASURE_ETH); ++ ++ if(curr_vpp_metrics->bytes_in - last_vpp_metrics->bytes_in > 0) { ++ bytes_in_this_round = curr_vpp_metrics->bytes_in - last_vpp_metrics->bytes_in; ++ } else { ++ bytes_in_this_round = 0; ++ } ++ ++ if(curr_vpp_metrics->bytes_out - last_vpp_metrics->bytes_out > 0) { ++ bytes_out_this_round = curr_vpp_metrics->bytes_out - last_vpp_metrics->bytes_out; ++ } else { ++ bytes_out_this_round = 0; ++ } ++ ++ if(curr_vpp_metrics->packets_in - last_vpp_metrics->packets_in > 0) { ++ packets_in_this_round = curr_vpp_metrics->packets_in - last_vpp_metrics->packets_in; ++ } else { ++ packets_in_this_round = 0; ++ } ++ ++ if(curr_vpp_metrics->packets_out - last_vpp_metrics->packets_out > 0) { ++ packets_out_this_round = curr_vpp_metrics->packets_out - last_vpp_metrics->packets_out; ++ } else { ++ packets_out_this_round = 0; ++ } ++ ++ vpp_m = evel_new_measurement(vam->config.read_interval); ++ if(vpp_m != NULL) { ++ char str_pkt_loss[12]; ++ printf("New measurement report created...\n"); ++ evel_measurement_vnic_use_add(vpp_m, /* Pointer to the measurement */ ++ DEFAULT_MEASURE_ETH, /* ASCII string with the vNIC's ID */ ++ packets_in_this_round, /* Packets received */ ++ packets_out_this_round, /* Packets transmitted */ ++ 0, /* Broadcast packets received */ ++ 0, /* Broadcast packets transmitted */ ++ bytes_in_this_round, /* Total bytes received */ ++ bytes_out_this_round, /* Total bytes transmitted */ ++ 0, /* Multicast packets received */ ++ 0, /* Multicast packets transmitted */ ++ 0, /* Unicast packets received */ ++ 0); /* Unicast packets transmitted */ ++ ++ if ( vam->config.mode == VES_AGENT_MODE_DEMO) { ++ sprintf(str_pkt_loss, "%d", vam->config.base_pkt_loss); ++ } else { ++ sprintf(str_pkt_loss, "%s", "0.0"); ++ } ++ evel_measurement_custom_measurement_add(vpp_m, /* Pointer to the measurement */ ++ "ONAP-DCAE", /* measurement group's name */ ++ "Packet-Loss-Rate", /* the measurement's name */ ++ str_pkt_loss); /* The measurement's value */ ++ ++ last_epoch = start_epoch + vam->config.read_interval * 1000000; ++ vpp_m_header = (EVENT_HEADER *)vpp_m; ++ vpp_m_header->start_epoch_microsec = start_epoch; ++ vpp_m_header->last_epoch_microsec = last_epoch; ++ strcpy(vpp_m_header->reporting_entity_id.value, "No UUID available"); ++ strcpy(vpp_m_header->reporting_entity_name, hostname); ++ ++ evel_rc = evel_post_event(vpp_m_header); ++ if(evel_rc == EVEL_SUCCESS) { ++ printf("Measurement report correctly sent to the collector!\n"); ++ } ++ else { ++ printf("Post failed %d (%s)\n", evel_rc, evel_error_string()); ++ } ++ } ++ else { ++ printf("New measurement report failed (%s)\n", evel_error_string()); ++ } ++ ++ last_vpp_metrics->bytes_in = curr_vpp_metrics->bytes_in; ++ last_vpp_metrics->bytes_out = curr_vpp_metrics->bytes_out; ++ last_vpp_metrics->packets_in = curr_vpp_metrics->packets_in; ++ last_vpp_metrics->packets_out = curr_vpp_metrics->packets_out; ++ gettimeofday(&time_val, NULL); ++ start_epoch = time_val.tv_sec * 1000000 + time_val.tv_usec; ++ ++ return 0; ++} ++ ++always_inline int ++ves_agent_start(ves_agent_main_t *vam) ++{ ++ vlib_main_t *vm = vam->vlib_main; ++ struct timeval time_val; ++ char fqdn[16]; /* "xxx.xxx.xxx.xxx" */ ++ //char *fqdn = "127.0.0.1"; /* "xxx.xxx.xxx.xxx" */ ++ ++ sprintf(fqdn, "%d.%d.%d.%d", vam->config.server_addr.data[0], ++ vam->config.server_addr.data[1], ++ vam->config.server_addr.data[2], ++ vam->config.server_addr.data[3]); ++ /* Always success. TODO: Error check in next version */ ++ last_vpp_metrics = malloc(sizeof(vpp_metrics_struct)); ++ curr_vpp_metrics = malloc(sizeof(vpp_metrics_struct)); ++ ++ if(evel_initialize(fqdn, /* FQDN */ ++ vam->config.server_port, /* Port */ ++ NULL, /* optional path */ ++ NULL, /* optional topic */ ++ 0, /* HTTPS? */ ++ "", /* Username */ ++ "", /* Password */ ++ EVEL_SOURCE_VIRTUAL_MACHINE, /* Source type */ ++ "vFirewall", /* Role */ ++ 1)) /* Verbosity */ ++ { ++ fprintf(stderr, "\nFailed to initialize the EVEL library!!!\n"); ++ return -1; ++ } ++ ++ gethostname(hostname, BUFSIZE); ++ memset(last_vpp_metrics, 0, sizeof(vpp_metrics_struct)); ++ read_vpp_metrics(last_vpp_metrics, DEFAULT_MEASURE_ETH); ++ gettimeofday(&time_val, NULL); ++ start_epoch = time_val.tv_sec * 1000000 + time_val.tv_usec; ++ ++ vlib_process_wait_for_event_or_clock(vm, (f64)(vam->config.read_interval)); ++ ++ return 0; ++} ++ ++always_inline int ++ves_agent_stop(void) ++{ ++ sleep(1); ++ free(last_vpp_metrics); ++ free(curr_vpp_metrics); ++ evel_terminate(); ++ ++ return 0; ++} ++ ++/* *INDENT-OFF* */ ++VLIB_PLUGIN_REGISTER () = { ++ .version = VPP_BUILD_VER, ++ .description = "VNF Event Stream Agent", ++}; ++/* *INDENT-ON* */ ++ ++static uword ++ves_agent_process (vlib_main_t * vm, ++ vlib_node_runtime_t * rt, ++ vlib_frame_t * f) ++{ ++ ves_agent_main_t *vam = &ves_agent_main; ++ uword event_type; ++ uword * event_data = 0; ++ ++ if (vam->config.read_interval == 0) { ++ vam->config.read_interval = DEFAULT_READ_INTERVAL; ++ } ++ ++ while (1) ++ { ++ vlib_process_wait_for_event_or_clock(vm, (f64)(vam->config.read_interval)); ++ ++ event_type = vlib_process_get_events (vm, &event_data); ++ ++ switch (event_type) ++ { ++ case EVENT_VES_AGENT_START: ++ ves_agent_start(vam); ++ break; ++ case EVENT_VES_AGENT_STOP: ++ ves_agent_stop(); ++ break; ++ default: ++ ves_agent_report_vnic_stats(vam); ++ break; ++ } ++ ++ vec_reset_length (event_data); ++ } ++ ++ /* NOTREACHED */ ++ return 0; ++} ++ ++VLIB_REGISTER_NODE (ves_agent_process_node, static) = { ++ .function = ves_agent_process, ++ .type = VLIB_NODE_TYPE_PROCESS, ++ .name = "ves-agent-process", ++ .process_log2_n_stack_bytes = 16, ++}; ++ ++int ++ves_set_server (ip46_address_t *addr, ++ u32 server_port, ++ u32 read_interval, ++ int is_del) ++{ ++ ves_agent_main_t *vam = &ves_agent_main; ++ vlib_main_t *vm = vam->vlib_main; ++ int rc = 0; ++ ++ if (ip46_address_is_zero(addr)) ++ return VNET_API_ERROR_INVALID_DST_ADDRESS; ++ ++ if (is_del) ++ { ++ if (vam->config.is_enabled == VES_AGENT_DISABLED) { ++ return rc; ++ } ++ ++ if ((vam->config.server_addr.as_u32 != addr->ip4.as_u32) ++ || (vam->config.server_port != server_port)) ++ return VNET_API_ERROR_NO_SUCH_ENTRY; ++ ++ memset(&(vam->config.server_addr), 0, sizeof(ip4_address_t)); ++ vam->config.server_port = DEFAULT_SERVER_PORT; ++ vam->config.read_interval = DEFAULT_READ_INTERVAL; ++ vam->config.is_enabled = VES_AGENT_DISABLED; ++ vlib_process_signal_event (vm, ves_agent_process_node.index, ++ EVENT_VES_AGENT_STOP, 0); ++ } else { ++ // Already enabled the same config. ++ if ((vam->config.server_addr.as_u32 == addr->ip4.as_u32) ++ && (vam->config.server_port != server_port) ++ && vam->config.read_interval == read_interval ++ && vam->config.is_enabled == VES_AGENT_ENABLED) { ++ return rc; ++ } ++ ++ // Already enabled, but not exact match. ++ if (vam->config.is_enabled == VES_AGENT_ENABLED) { ++ return VNET_API_ERROR_VALUE_EXIST; ++ } ++ ++ vam->config.server_addr.as_u32 = addr->ip4.as_u32; ++ vam->config.server_port = server_port; ++ if (read_interval) { ++ vam->config.read_interval = read_interval; ++ } else { ++ vam->config.read_interval = DEFAULT_READ_INTERVAL; ++ } ++ vam->config.is_enabled = VES_AGENT_ENABLED; ++ vlib_process_signal_event (vm, ves_agent_process_node.index, ++ EVENT_VES_AGENT_START, 0); ++ } ++ ++ return (rc); ++} ++ ++static u8 * ++format_ves_agent_set_error(u8 *s, va_list *args) ++{ ++ s = format(s, "%s\n\n", "Caution, set fails due to enabled config:"); ++ s = format(s, "%U", format_ves_agent_config, NULL); ++ return s; ++} ++ ++static clib_error_t * ++ves_server_set_command_fn(vlib_main_t * vm, ++ unformat_input_t * input, ++ vlib_cli_command_t * cmd) ++{ ++ ip46_address_t server_addr; ++ u32 server_port = DEFAULT_SERVER_PORT, inter_val = DEFAULT_READ_INTERVAL; ++ int is_del = 0, set_server = 0; ++ ++ memset(&server_addr, 0, sizeof(server_addr)); ++ ++ while (unformat_check_input(input) != UNFORMAT_END_OF_INPUT) ++ { ++ if (unformat (input, "server %U", ++ unformat_ip4_address, &server_addr.ip4)) ++ set_server = 1; ++ else if (unformat (input, "port %u", &server_port)) ++ ; ++ else if (unformat (input, "intval %u", &inter_val)) ++ ; ++ else if (unformat (input, "delete") || ++ unformat (input, "del")) ++ is_del = 1; ++ else ++ break; ++ } ++ ++ if (is_del || set_server) ++ { ++ int rv; ++ ++ rv = ves_set_server (&server_addr, server_port, inter_val, is_del); ++ switch (rv) ++ { ++ case 0: ++ return 0; ++ ++ case VNET_API_ERROR_INVALID_DST_ADDRESS: ++ return clib_error_return (0, "Invalid address"); ++ ++ case VNET_API_ERROR_NO_SUCH_ENTRY: ++ return clib_error_return(0, "No such Entry found"); ++ ++ case VNET_API_ERROR_VALUE_EXIST: ++ vlib_cli_output (vm, "%U\n", format_ves_agent_set_error, NULL); ++ return clib_error_return (0, "BUG found!"); ++ ++ default: ++ return clib_error_return (0, "BUG: rv %d", rv); ++ } ++ } else { ++ return clib_error_return (0, "parse error`%U'", ++ format_unformat_error, input); ++ } ++} ++ ++VLIB_CLI_COMMAND (ves_server_set_command, static) = { ++ .path = "set ves agent", ++ .short_help = "set ves agent [del] server <ipaddr> port <port> [intval <inter-value>]", ++ .function = ves_server_set_command_fn, ++}; ++ ++static u8 * ++format_ves_agent_config(u8 *s, va_list *args) ++{ ++ ves_agent_main_t *vam = &ves_agent_main; ++ char fqdn[16]; /* "xxx.xxx.xxx.xxx" */ ++ ++ s = format(s, "%=16s %=12s %=8s %s\n", "Server Addr", ++ "Server Port", "Interval", "Enabled"); ++ if (vam->config.is_enabled == VES_AGENT_DISABLED) { ++ return s; ++ } ++ ++ sprintf(fqdn, "%d.%d.%d.%d", vam->config.server_addr.data[0], ++ vam->config.server_addr.data[1], ++ vam->config.server_addr.data[2], ++ vam->config.server_addr.data[3]); ++ ++ s = format(s, "%=16s %=12d %=8d %s\n", fqdn, ++ vam->config.server_port, ++ vam->config.read_interval, ++ vam->config.is_enabled ? "True" : "False"); ++ ++ return s; ++} ++ ++static clib_error_t * ++ves_server_show_command_fn(vlib_main_t * vm, ++ unformat_input_t * input, ++ vlib_cli_command_t * cmd) ++{ ++ vlib_cli_output (vm, "%U", format_ves_agent_config, NULL); ++ ++ return (NULL); ++} ++ ++VLIB_CLI_COMMAND (ves_server_show_command, static) = { ++ .path = "show ves agent", ++ .short_help = "Display VES Agent Configuration", ++ .function = ves_server_show_command_fn, ++}; ++ ++int ++ves_agent_set_mode(ves_agent_mode_t mode, ++ u32 pkt_loss_rate) ++{ ++ ves_agent_main_t *vam = &ves_agent_main; ++ int retval = 0; ++ ++ if (VES_AGENT_MODE_DEMO == mode) { ++ if (pkt_loss_rate > 100) { ++ vam->config.mode = VES_AGENT_MODE_REAL; ++ vam->config.base_pkt_loss = 0; ++ return 1; ++ } ++ vam->config.mode = VES_AGENT_MODE_DEMO; ++ vam->config.base_pkt_loss = pkt_loss_rate; ++ } else { /* Only demo or real for current stage */ ++ vam->config.mode = VES_AGENT_MODE_REAL; ++ vam->config.base_pkt_loss = 0; ++ } ++ ++ return retval; ++} ++ ++static clib_error_t * ++ves_mode_set_command_fn(vlib_main_t * vm, ++ unformat_input_t * input, ++ vlib_cli_command_t * cmd) ++{ ++ u32 pkt_loss_rate = 0; ++ ves_agent_mode_t mode = VES_AGENT_MODE_REAL; ++ int set_mode = 0; ++ ++ while (unformat_check_input(input) != UNFORMAT_END_OF_INPUT) ++ { ++ if (unformat (input, "demo") || unformat (input, "Demo") ++ || unformat (input, "DEMO")) ++ { ++ mode = VES_AGENT_MODE_DEMO; ++ set_mode = 1; ++ } ++ else if (unformat (input, "real") || unformat (input, "Real") ++ || unformat (input, "REAL")) ++ set_mode = 1; ++ else if (unformat (input, "base %u", &pkt_loss_rate)) ++ ; ++ else ++ break; ++ } ++ ++ if (set_mode) ++ { ++ int retval = ves_agent_set_mode(mode, pkt_loss_rate); ++ if (retval == 0) ++ return 0; ++ else ++ return clib_error_return (0, "BUG found!"); ++ } else { ++ return clib_error_return (0, "parse error`%U'", ++ format_unformat_error, input); ++ } ++} ++ ++VLIB_CLI_COMMAND (ves_mode_set_command, static) = { ++ .path = "set ves mode", ++ .short_help = "set ves mode <demo|real> [base <pkt-loss-rate>]", ++ .function = ves_mode_set_command_fn, ++}; ++ ++static inline u8 * ++format_ves_agent_mode(u8 *s, va_list *args) ++{ ++ ves_agent_main_t *vam = &ves_agent_main; ++ ++ s = format(s, "%=8s %s\n", "Mode", "Base Packet Loss Rate"); ++ ++ s = format(s, "%=8s %d%%\n", ++ vam->config.mode == VES_AGENT_MODE_DEMO ? "Demo" : "Real", ++ vam->config.base_pkt_loss); ++ ++ return s; ++} ++ ++static clib_error_t * ++ves_agent_mode_show_command_fn(vlib_main_t * vm, ++ unformat_input_t * input, ++ vlib_cli_command_t * cmd) ++{ ++ vlib_cli_output (vm, "%U", format_ves_agent_mode, NULL); ++ ++ return (NULL); ++} ++ ++VLIB_CLI_COMMAND (ves_agent_mode_show_command, static) = { ++ .path = "show ves mode", ++ .short_help = "Display VES Agent Mode Information", ++ .function = ves_agent_mode_show_command_fn, ++}; ++ ++static clib_error_t * ++ves_agent_init(vlib_main_t * vm) ++{ ++ ves_agent_main_t *vam = &ves_agent_main; ++ ++ vam->vlib_main = vm; ++ vam->vnet_main = vnet_get_main(); ++ ++ return 0; ++} ++ ++VLIB_INIT_FUNCTION (ves_agent_init); ++ ++/* ++ * fd.io coding-style-patch-verification: ON ++ * ++ * Local Variables: ++ * eval: (c-set-style "gnu") ++ * End: ++ */ +diff --git a/src/plugins/ves/ves_node.h b/src/plugins/ves/ves_node.h +new file mode 100644 +index 00000000..7b773843 +--- /dev/null ++++ b/src/plugins/ves/ves_node.h +@@ -0,0 +1,66 @@ ++/* ++ * Copyright (c) 2017 Intel and/or its affiliates. ++ * 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. ++ */ ++ ++#ifndef _VES_NODE_H_ ++#define _VES_NODE_H_ ++ ++#include <vnet/ip/ip.h> ++ ++#include "include/evel.h" ++ ++#define DEFAULT_SERVER_IP "127.0.0.1" ++#define DEFAULT_MEASURE_ETH "eth0" ++#define DEFAULT_SERVER_PORT 8080 ++#define DEFAULT_READ_INTERVAL 100 ++ ++typedef enum { ++ VES_AGENT_MODE_REAL = 0, ++ VES_AGENT_MODE_DEMO, ++ _NUM_VES_AGENT_MODES ++} ves_agent_mode_t; ++ ++/* VES Agent Server configuration */ ++typedef struct { ++ ip4_address_t server_addr; ++ u32 server_port; ++ u32 read_interval; ++ int is_enabled; ++ u32 base_pkt_loss; /* For demo only */ ++ ves_agent_mode_t mode; /* Demo or Real */ ++} ves_agent_config_t; ++ ++typedef struct { ++ ves_agent_config_t config; ++ ++ /* convenience */ ++ vlib_main_t * vlib_main; ++ vnet_main_t * vnet_main; ++} ves_agent_main_t; ++ ++ves_agent_main_t ves_agent_main; ++ ++#define EVENT_VES_AGENT_START 1 ++#define EVENT_VES_AGENT_STOP 0 ++ ++#define VES_AGENT_DISABLED 0 ++#define VES_AGENT_ENABLED 1 ++ ++int ves_set_server(ip46_address_t *addr, u32 server_port, ++ u32 read_interval, int is_del); ++ ++int ves_agent_set_mode(ves_agent_mode_t mode, ++ u32 pkt_loss_rate); ++ ++#endif /* _VES_NODE_H_ */ +diff --git a/src/vpp-api/java/Makefile.am b/src/vpp-api/java/Makefile.am +index f18e0c24..7f4738d8 100644 +--- a/src/vpp-api/java/Makefile.am ++++ b/src/vpp-api/java/Makefile.am +@@ -149,6 +149,26 @@ jvpp-snat/io_fd_vpp_jvpp_snat_JVppSnatImpl.h: $(jvpp_registry_ok) $(jvpp_snat_js + endif + + # ++# VES Plugin ++# ++if ENABLE_VES_PLUGIN ++noinst_LTLIBRARIES += libjvpp_ves.la ++libjvpp_ves_la_SOURCES = jvpp-ves/jvpp_ves.c ++libjvpp_ves_la_CPPFLAGS = -Ijvpp-ves ++libjvpp_ves_la_LIBADD = $(JVPP_LIBS) ++libjvpp_ves_la_DEPENDENCIES = libjvpp_common.la ++ ++BUILT_SOURCES += jvpp-ves/io_fd_vpp_jvpp_ves_JVppVesImpl.h ++JAR_FILES += jvpp-ves-$(PACKAGE_VERSION).jar ++CLEANDIRS += jvpp-ves/target ++ ++jvpp_ves_json_files = @top_builddir@/plugins/ves/ves.api.json ++ ++jvpp-ves/io_fd_vpp_jvpp_ves_JVppVesImpl.h: $(jvpp_registry_ok) $(jvpp_ves_json_files) ++ $(call japigen,ves,JVppVesImpl) ++endif ++ ++# + # iOAM Trace Plugin + # + if ENABLE_IOAM_PLUGIN +diff --git a/src/vpp-api/java/jvpp-ves/jvpp_ves.c b/src/vpp-api/java/jvpp-ves/jvpp_ves.c +new file mode 100644 +index 00000000..60e325b5 +--- /dev/null ++++ b/src/vpp-api/java/jvpp-ves/jvpp_ves.c +@@ -0,0 +1,108 @@ ++/* ++ * Copyright (c) 2017 Intel Corp and/or its affiliates. ++ * ++ * 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. ++ */ ++ ++#include <vnet/vnet.h> ++ ++#include <ves/ves_msg_enum.h> ++#define vl_typedefs /* define message structures */ ++#include <ves/ves_all_api_h.h> ++#undef vl_typedefs ++ ++#include <vnet/api_errno.h> ++#include <vlibapi/api.h> ++#include <vlibmemory/api.h> ++ ++#if VPPJNI_DEBUG == 1 ++ #define DEBUG_LOG(...) clib_warning(__VA_ARGS__) ++#else ++ #define DEBUG_LOG(...) ++#endif ++ ++#include <jvpp-common/jvpp_common.h> ++ ++#include "jvpp-ves/io_fd_vpp_jvpp_ves_JVppVesImpl.h" ++#include "jvpp_ves.h" ++#include "jvpp-ves/jvpp_ves_gen.h" ++ ++/* ++ * Class: io_fd_vpp_jvpp_ves_JVppVesImpl ++ * Method: init0 ++ * Signature: (JI)V ++ */ ++JNIEXPORT void JNICALL Java_io_fd_vpp_jvpp_ves_JVppVesImpl_init0 ++ (JNIEnv *env, jclass clazz, jobject callback, jlong queue_address, jint my_client_index) { ++ ves_main_t * plugin_main = &ves_main; ++ clib_warning ("Java_io_fd_vpp_jvpp_ves_JVppVesImpl_init0"); ++ ++ plugin_main->my_client_index = my_client_index; ++ plugin_main->vl_input_queue = (unix_shared_memory_queue_t *)queue_address; ++ ++ plugin_main->callbackObject = (*env)->NewGlobalRef(env, callback); ++ plugin_main->callbackClass = (jclass)(*env)->NewGlobalRef(env, (*env)->GetObjectClass(env, callback)); ++ ++ // verify API has not changed since jar generation ++ #define _(N) \ ++ get_message_id(env, #N); ++ foreach_supported_api_message; ++ #undef _ ++ ++ #define _(N,n) \ ++ vl_msg_api_set_handlers(get_message_id(env, #N), #n, \ ++ vl_api_##n##_t_handler, \ ++ vl_noop_handler, \ ++ vl_noop_handler, \ ++ vl_noop_handler, \ ++ sizeof(vl_api_##n##_t), 1); ++ foreach_api_reply_handler; ++ #undef _ ++} ++ ++JNIEXPORT void JNICALL Java_io_fd_vpp_jvpp_ves_JVppVesImpl_close0 ++(JNIEnv *env, jclass clazz) { ++ ves_main_t * plugin_main = &ves_main; ++ ++ // cleanup: ++ (*env)->DeleteGlobalRef(env, plugin_main->callbackClass); ++ (*env)->DeleteGlobalRef(env, plugin_main->callbackObject); ++ ++ plugin_main->callbackClass = NULL; ++ plugin_main->callbackObject = NULL; ++} ++ ++/* Attach thread to JVM and cache class references when initiating JVPP VES */ ++jint JNI_OnLoad(JavaVM *vm, void *reserved) { ++ JNIEnv* env; ++ ++ if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_8) != JNI_OK) { ++ return JNI_EVERSION; ++ } ++ ++ if (cache_class_references(env) != 0) { ++ clib_warning ("Failed to cache class references\n"); ++ return JNI_ERR; ++ } ++ ++ return JNI_VERSION_1_8; ++} ++ ++/* Clean up cached references when disposing JVPP VES */ ++void JNI_OnUnload(JavaVM *vm, void *reserved) { ++ JNIEnv* env; ++ if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_8) != JNI_OK) { ++ return; ++ } ++ delete_class_references(env); ++} +diff --git a/src/vpp-api/java/jvpp-ves/jvpp_ves.h b/src/vpp-api/java/jvpp-ves/jvpp_ves.h +new file mode 100644 +index 00000000..642101ca +--- /dev/null ++++ b/src/vpp-api/java/jvpp-ves/jvpp_ves.h +@@ -0,0 +1,43 @@ ++/* ++ * Copyright (c) 2017 Intel Corp and/or its affiliates. ++ * ++ * 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. ++ */ ++#ifndef __included_jvpp_ves_h__ ++#define __included_jvpp_ves_h__ ++ ++#include <vnet/vnet.h> ++#include <vnet/ip/ip.h> ++#include <vnet/api_errno.h> ++#include <vlibapi/api.h> ++#include <vlibmemory/api.h> ++#include <jni.h> ++ ++/* Global state for JVPP-VES */ ++typedef struct { ++ /* Pointer to shared memory queue */ ++ unix_shared_memory_queue_t * vl_input_queue; ++ ++ /* VPP api client index */ ++ u32 my_client_index; ++ ++ /* Callback object and class references enabling asynchronous Java calls */ ++ jobject callbackObject; ++ jclass callbackClass; ++ ++} ves_main_t; ++ ++ves_main_t ves_main __attribute__((aligned (64))); ++ ++ ++#endif /* __included_jvpp_ves_h__ */ +-- +2.12.2.windows.2 + |