{"id":19984524,"url":"https://github.com/intellabs/gma","last_synced_at":"2025-05-04T06:33:12.857Z","repository":{"id":148596856,"uuid":"489084876","full_name":"IntelLabs/gma","owner":"IntelLabs","description":"Linux Client \u0026 Server Software to support Generic Multi-Access Network Virtualization","archived":false,"fork":false,"pushed_at":"2024-04-17T16:38:14.000Z","size":874,"stargazers_count":6,"open_issues_count":0,"forks_count":1,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-04-17T23:08:16.285Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/IntelLabs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2022-05-05T18:28:39.000Z","updated_at":"2024-04-17T23:08:16.285Z","dependencies_parsed_at":null,"dependency_job_id":"b2c90c5c-7a84-43b3-b9ca-eaa7d8ab5f65","html_url":"https://github.com/IntelLabs/gma","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IntelLabs%2Fgma","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IntelLabs%2Fgma/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IntelLabs%2Fgma/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IntelLabs%2Fgma/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/IntelLabs","download_url":"https://codeload.github.com/IntelLabs/gma/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224386292,"owners_count":17302634,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-13T04:19:24.858Z","updated_at":"2025-05-04T06:33:12.852Z","avatar_url":"https://github.com/IntelLabs.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PROJECT NOT UNDER ACTIVE MANAGEMENT #  \nThis project will no longer be maintained by Intel.  \nIntel has ceased development and contributions including, but not limited to, maintenance, bug fixes, new releases, or updates, to this project.  \nIntel no longer accepts patches to this project.  \n If you have an ongoing need to use this project, are interested in independently developing it, or would like to maintain patches for the open source software community, please create your own fork of this project.  \n  \n# Generic Multi-Access Network Virtualization\n\nGeneric Multi-Access (GMA) Network Virtualization is a client/server-based software framework to virtualize multiple access networks, e.g. Wi-Fi, LTE/5G, etc., and manage data traffic at the edge for meeting diverse requirements (coverage, mobility, throughput, latency, and reliability) of emerging applications, e.g., AR/VR, industrial apps, cloud-gaming, etc. It supports various multi-path traffic managmenet operations, including switching, splitting, and duplicating. Please visit our blog (https://www.intel.com/content/www/us/en/research/blogs/multi-access-traffic-management-edge.html) and the IETF draft (https://datatracker.ietf.org/doc/draft-zhu-intarea-gma-control/) for more details. \n\n## OS\n\nubuntu 22.04 64bit\n\n## HW and Network Configuration (for a simple two-node setup)\n\nSetup two Linux machines to operate as GMA client and GMA server, reespectively\n\nInstall two ethernet adapters on both machines and have them connected (one is used as \"Wi-Fi\" and the other is used as \"LTE\")\n\nCreate two default routes (with different subnets) on GMA client using the two Ethernet connections, and configure the GMA server as their gateway, respectively\n\nInstall a 3rd ethernet adapter on GMA server, and configure it as the default route for Internet access\n\nOptionally, setup a 3rd Linux machine to operate as GMA controller, or use the same machine for both GMA server and GMA controller\n\n\n## Step 1: download \"gmaserver\" and \"gmactrl\" source files on GMA server\n\nDownload the following three folders from this repo to the GMA server: \n\n\t./ctrl  (for \"gmactrl\")\n\t./python (for \"gmaserver\")\n   \t./server (for \"gmaserver\")\n\n## Step 2: download \"gmaclient\" source files on GMA client \n\nDownload both folders (\"GMAlib\" and \"client\") from this repo \n\n## Step 3: install required libraries and tools on GMA client\n\nsudo apt-get install libboost-all-dev\n\nsudo apt-get install libssl-dev\n\nsudo apt-get install net-tools\n\nsudo apt-get install g++\n\n## Step 4: install required libraries and tools on GMA server\n\nsudo apt-get install iptables\n\nsudo apt-get install iproute2 \n\nsudo apt-get install net-tools\n\nsudo apt-get install libboost-all-dev\n\nsudo apt-get install libssl-dev\n\nsudo apt-get install python3\n\nsudo apt-get install python3-pip\n\nsudo pip install websockets\n\nsudo pip install pycryptodomex\n\nsudo pip install netifaces\n\nsudo apt-get install g++\n\n## Step 5: build \"gmaserver\" on GMA server\ncd ./server\n\nmake -B\n\n## Step 6: build \"gmactrl\" on GMA server\ncd ./ctrl\n\nmake -B\n\n## Step 7: install configuration files on GMA server\n\nsudo makdir /home/ncm_ws\n\ncp ./server/conf.ini /home/ncm_ws\n\ncp ./server/server_config.txt /home/ncm_ws\n\n## Step 8: configure network interface \u0026 downlink flow on GMA server\n\nModify the parameters in conf.ini (under /home/ncm_ws): \"interface\", \"WLAN_INTERFACE_CONFIG\", \"LTE_INTERFACE_CONFIG\", \"FORWARD_INTERFACE_CONFIG\" according to your local environment: \n\n\tinterface=eth0\n\tWLAN_INTERFACE_CONFIG = eth1\n\tLTE_INTERFACE_CONFIG = eth0\n\tFORWARD_INTERFACE_CONFIG = eth2\n\tMEASURE_REPORT_NIC = eth3\n\n(eth0: ingress network interface for cellular, eth1: ingress network interface for wifi, eth2: egress network interface Internet access, eth3: network interface for remote management)\n\nModify the parameters in confi.ini: \"RT_FLOW_DSCP\", \"HR_FLOW_DSCP\" according to your local environment: \n\n\tRT_FLOW_DSCP = 2\n\tHR_FLOW_DSCP = 1\n\nDownlink packets with DSCP = 2 are classified as the \"Real-Time\" flow using the steering mode, and those with DSCP = 1 are classified as the \"High-Reliability\" flow using the duplication mode, and all other packets are classified as the \"Non Real-Time (Best Effort)\" flow using the splitting mode. For example, the following commands set and unset DSCP to \"1\" for all downlink UDP flows to 10.8.0.9 respectively: \n\n\tsudo iptables -t mangle -A OUTPUT -d 10.8.0.9 -p udp -j TOS --set-tos 1\n\tsudo iptables -t mangle -D OUTPUT -d 10.8.0.9 -p udp -j TOS --set-tos 1\n\nSet ENABLE_DL_QOS_CONFIG to \"1\" to enable downlink traffic shapping (optional)\n\nUse the tfc command in step 15 to configure uplink flows. Notice that uplink \"Non Real-Time\" flow uses the steering mode because the splitting mode is only supported for downlink in this release.  \n\n![GMA Testbed](https://github.com/IntelLabs/gma/blob/master/GMA-testbed.png)\n\n## Step 9: create a new SSL certificate on GMA server\n\nopenssl genrsa -out server.key 3072\n\nopenssl req -new -key server.key -out server.csr (input user info)\n\nopenssl x509 -req -in server.csr -out server.crt -signkey server.key -days 3650\n\ncp ./server.key ./python\n\ncp ./server.csr ./python\n\ncp ./server.crt ./python\n\n## Step 10: update SSL certification on GMA client\n\nRun the following command to generate client.crt from server.crt\n\u003cpre\u003e\nsed '/./{s/^/        \"\u0026/;s/$/\u0026\\\\n\"/}' server.crt \u003e client.crt\n\u003c/pre\u003e\n\nCopy the contents of client.crt to ./client/root_certificates.hpp to replace std::string const cert content.\n\n## Step 11: build \"gmaclient\" on GMA client\n\ncd ./GMAlib/lib\n\nmake -B\n\ncd ../../client\n\nmake -B\n\n## Step 12: run \"gmaserver\" on GMA server\n\nOpen the first terminal on the server and run the following command:  \n\t\n \tcd ./server\n\t\n \tsudo ./gmaserver\n\nOpen the 2nd terminal on the server and run the following command:  \n\n\tcd ./python\n\n\tsudo python3 ncm_ws38.py\n\nOpen the 3rd terminal on the server and run the following command:  \n\n \tcd ./python\n\t\n \tsudo python3 discover_ws38.py\n\n## Step 13: update network configuration on GMA client\n\nmodify the following parameters in config.txt (under ./client):  \n\n\tSERVER_NCM_IP=a.b.c.d\n\n\tWLAN_INTERFACE_CONFIG=wlan0\n\n\tLTE_INTERFACE_CONFIG=wwan0\n\n\tSERVER_DNS=gmaserver.apps.local\n\n(wlan0: network interface for wifi, wwan0: network interface for cellular, gmaserver.apps.local: local DNS name for GMA service running at Edge, a.b.c.d is the IP address (e.g. 192.168.1.a at Step 8) at the GMA server via LTE)\n\nsudo mkdir /home/gmaclient\n\nsudo cp ./config.txt /home/gmaclient/\n\n## Step 14: start \"gmaclient\" on GMA client\n\ncd ./client\n\nrun the followng command to add the default route via Wi-Fi or LTE if it is not present\n\n    sudo ip route add default via 192.168.1.a dev wwan0 metric 7001\n\n    sudo ip route add default via 192.168.0.b dev wlan0 metric 7000\n\nsudo ./gmaclient\n\n## Step 15: start \"gmactrl\" on GMA server\n\n\ncd ./ctrl\n\nModify the parameters in Params_config.txt according to your local environment: \n\n     SERVER_IP_CONIFG=192.168.3.c\n\nsudo ./gmactl \n\nrun the following command to control traffic splitting for a GMA client: \n\nTraffic Steering Command: tsc [clientIndex] [RTtsc] [NRTtsc] [NRTk1] [NRTk2] [NRTl]\n               \n               clientIndex: the last two bytes of the client IP address\n               RTtsc: traffic steering command for RT (Real-Time) flow\n                 0: default (DL \u0026 UL over Wi-Fi for RT flow)\n                 1: DL-over-LTE for RT flow\n                 2: UL-over-LTE for RT flow\n                 3: UL \u0026 DL-over-LTE for RT flow\n                 4: no update for RT flow\n               NRTtsc: traffic steering command for NRT (Non Real-Time or Best-Effort) flow\n                 0: disable dynamic DL splitting for NRT flow\n                 1: enable dynamic DL splitting for NRT flow \n                 16: no update for NRT flow\n               NRTk1: the Wi-Fi burst size (pkts), e.g. 16\n               NRTK2: the LTE burst size, e.g. 16 \n               NRTl: the splitting cycle (pkts), e.g. 32\n\nrun the following command to control uplink traffic classification for a GMA client: \n\nTraffic Flow Configuration: tfc [clientIndex] [flowId] [protoType] [portStart] [portend]  \n               \n               clientIndex: the last two bytes of the client IP address\n               flowId:\n                 1: high-reliability (duplication) flow \n                 2: real-time flow\n                 3: non real-time flow (default)\n               protoType:\n                 0: disable UL QoS flow classification (default)\n                 1: tcp\n                 2: udp\n                 3: icmp\n               portStart: the lower bound of (UDP or TCP) destination port (not used if \"icmp\")\n               portEnd: the upper bound of (UDP or TCP) destination port (not used if \"icmp\")\n\nrun the following command to control (downlink) traffic shaping for a GMA client: \n\nTraffic Rate Configuration: txc [clientIndex] [Link] [R] [NRT_R] [Q]\n\n               clientIndex: the last two bytes of the client IP address\n               Link:\n                 0: WiFi \n                 1: LTE\n               R: the maximum (per-client \u0026 per-link) tx rate (Mbps)\n               NRT_R: the assured maximum tx rate for NRT traffic (NRT_R \u003c R)\n               Q: the Tx queue length (pkts)\n\n## Testcases \u0026 Examples\n\nPlease check out testcases \u0026 examples from this link: \n\n               https://www.intel.com/content/www/us/en/developer/articles/reference-implementation/multi-access-with-private-5g.html\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fintellabs%2Fgma","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fintellabs%2Fgma","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fintellabs%2Fgma/lists"}