├── MeshLinuxContainers-x07.pdf ├── README.md ├── ana-locals-attack.sh ├── ana-locals-perf.sh ├── ana-locals.sh ├── ana-owrt-bmx7-upd.sh ├── ana.sh ├── ana_rand.sh ├── files ├── etc │ ├── default │ │ └── mini-httpd │ ├── hosts │ ├── mini-httpd.conf │ └── olsrd.conf └── var │ └── www │ └── cgi-bin │ ├── example.sh │ └── zero ├── mlc-create-owrt-mother.sh ├── mlc-help.txt ├── mlc-init-host.sh ├── mlc-setup-host.sh ├── mlc-vars.sh ├── openwrt-routing-package-ana └── ana │ ├── Makefile │ └── files │ └── etc │ ├── config │ ├── network │ └── wireless │ ├── dropbear │ ├── authorized_keys.ana │ ├── dropbear_dss_host_key.ana │ └── dropbear_rsa_host_key.ana │ ├── init.d │ └── ana │ └── uci-defaults │ └── 99_ana └── rootfs /MeshLinuxContainers-x07.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/axn/mlc/aa2bba9a316b00cad3d6a51286a1b3ce2697e2e8/MeshLinuxContainers-x07.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MLC 2 | 3 | ## Installing MLC ## 4 | 5 | A short HOWTO would be as follows: 6 | 7 | The following instructions have been tested with (K)Ubuntu 16.04 8 | 9 | There is another short howto to set up an appropriate Ubuntu 16.04 VirtualBox image below 10 | 11 | 12 | 1. Get MLC: 13 | ``` 14 | git clone https://github.com/axn/mlc.git mlc.git 15 | cd mlc.git 16 | ``` 17 | 18 | 19 | 2. Become root: 20 | ``` 21 | sudo su 22 | ``` 23 | 24 | 25 | 3. Source MLC to your bash environment 26 | ``` 27 | cd /home/mlc/mlc.git # assuming mlc was installed here. 28 | . ./mlc-vars.sh 29 | ``` 30 | 31 | 32 | 4. Setup your local host & prepare a simple debian container system: 33 | ``` 34 | less mlc-setup-host.sh # check what is done here... 35 | ./mlc-setup-host.sh 36 | ``` 37 | - This takes a while... 38 | - Usually choose yes. 39 | - For Dumpcap support for non-super users choose: yes 40 | (Once this completed only `./mlc-init-host.sh` would be needed after any system reboot) 41 | 42 | 43 | 5. Create 30 containers called mlc1000... mlc1029: 44 | ``` 45 | mlc_loop -i 1000 -a 1029 -c 46 | ``` 47 | 48 | 49 | 6. Boot them: 50 | ``` 51 | mlc_loop -i 1000 -a 1029 -b 52 | ``` 53 | 54 | 55 | 7. Create a 10x3 grid network among them using bridge mbr1 (eth1 inside containers) 56 | ``` 57 | mlc_configure_grid 1 58 | ``` 59 | 60 | 61 | 8. Execute bmx7 in all containers 62 | ``` 63 | mlc_loop -i 1000 -a 1029 -e "bmx7 -f0 dev=eth1.11" 64 | ``` 65 | 66 | 67 | 9. Attach to container mlc1000 and get bmx7 debug info to monitor the network converging... 68 | ``` 69 | lxc-attach -n mlc1000 -- bmx7 -lc parameters show=status show=interfaces show=links show=originators 70 | # or retrieve just individual perspectives in non-loop mode: 71 | lxc-attach -n mlc1000 -- bmx7 -c parameters show=tunnels 72 | ``` 73 | On my 3Ghz Intel Dual core notebook it takes about 2 minutes to converge 74 | even 100 nodes at high CPU load, then stabilizes around 40% CPU load. 75 | 76 | 77 | 10. Copy and paste Crypto IPv6 from mlc1019 (seen via previous command) one can 78 | verify that pinging from top left node mlc1000 to top right node mlc1009 79 | takes 9 hops: 80 | 81 | ``` 82 | lxc-attach -n mlc1000 -- traceroute6 fd70:1191:c909:1e4e:4c9c:4d4a:33eb:b09b 83 | 84 | traceroute to fd70:1191:c909:1e4e:4c9c:4d4a:33eb:b09b (fd70:1191:c909:1e4e:4c9c:4d4a:33eb:b09b), 30 hops max, 80 byte packets 85 | 1 fd70:166:2d16:1ff6:253f:d0bc:1558:d89a (fd70:166:2d16:1ff6:253f:d0bc:1558:d89a) 0.110 ms 0.048 ms 0.046 ms 86 | 2 fd70:aad9:c0f5:8c20:a082:a462:a859:210d (fd70:aad9:c0f5:8c20:a082:a462:a859:210d) 0.068 ms 0.051 ms 0.051 ms 87 | ... 88 | 9 fd70:1191:c909:1e4e:4c9c:4d4a:33eb:b09b (fd70:1191:c909:1e4e:4c9c:4d4a:33eb:b09b) 0.084 ms 0.067 ms 0.060 ms 89 | ``` 90 | 91 | 92 | 11. Start also olsrd2 and babeld in nodes: 93 | 94 | ``` 95 | mlc_loop -a 1029 -e "olsrd2_static --set=global.fork=1 --set=interface.multicast_v4=- eth1.12" 96 | mlc_loop -a 1029 -e "olsrd2_static --set=global.fork=1 --load /etc/olsrd2.conf" 97 | mlc_loop -a 1029 -e "babeld -D -w -c /etc/babeld.conf eth1.13" 98 | ``` 99 | 100 | 101 | 12. Do some more advanced experiments: 102 | 103 | ``` 104 | # Apply some wireshark statistics filter to observe protocol overhead: 105 | # filter on 1011_1 106 | # BMX7 filter: (eth.src == a0:cd:ef:10:00:01) && (udp.srcport == 6270) 107 | # olsr2 filter: (eth.src == a0:cd:ef:10:00:01) && (udp.srcport == 269) 108 | # babel filter: (eth.src == a0:cd:ef:10:00:01) && (udp.srcport == 6696) 109 | 110 | # Add unicast hnas to bmx7 descriptions 111 | for i in $(seq 1000 1069); do mlc_loop -i $i -e "bmx7 -c u=$(mlc_loop -i $i -e "ip a show dev eth1.11" | grep fd01 | cut -d' ' -f6 | cut -d '/' -f1)/128"; done 112 | 113 | # Monitor path between two e2e nodes: 114 | root@mlc1000:~# 115 | watch -n1 timeout 0.3 traceroute6 -n fd01::a0cd:ef10:2901:0:1 # bmx7 116 | watch -n1 timeout 0.3 traceroute6 -n fd02::a0cd:ef10:2901:0:1 # olsr2 117 | watch -n1 timeout 0.3 traceroute6 -n fd03::a0cd:ef10:2901:0:1 # bmx7 118 | 119 | 120 | # Set links on and off: 121 | root@mlc: 122 | mlc_link_set 1 1050 1 1059 3 3 123 | mlc_link_set 1 1050 1 1059 0 0 124 | 125 | # Tune Bmx7 link-discovery: 126 | mlc_loop -a 1079 -e "bmx7 -c linkWindow=5 linkTimeout=10000" 127 | 128 | # Start some topology dynamics: 129 | while true; do for X in $(seq 20 59); do (mlc_link_set 1 10$X 1 10$((($X + 10))) 0 0; sleep 30; mlc_link_set 1 10$X 1 10$((($X + 10))) 3 3)& sleep 4; done; done 130 | 131 | 132 | # Enable some malicious behavior. Drop packets towards mlc1029: 133 | root@mlc1059:~# 134 | ip6tables -I FORWARD -o eth1.11 -d fd01::a0cd:ef10:2901:0:1 -j DROP 135 | ip6tables -I FORWARD -o eth1.12 -d fd02::a0cd:ef10:2901:0:1 -j DROP 136 | ip6tables -I FORWARD -o eth1.13 -d fd03::a0cd:ef10:2901:0:1 -j DROP 137 | ip6tables -L -nv 138 | ip6tables -F 139 | 140 | 141 | # Let Bmx7 distrust a known malicious node: 142 | # On mlc1029 (and mlc1000): 143 | for k in $(bmx7 -c show=keys | cut -d' ' -f2); do bmx7 -c setTrustedNode=$k; done 144 | bmx7 -c trustedNodesDir=/etc/bmx7/trustedNodes/ 145 | bmx7 -c setTrustedNode=-$(bmx7 -c show=keys | grep mlc1059 | cut -d' ' -f2) 146 | ``` 147 | 148 | 149 | ## Preparing a VirtualBox Ubuntu 16.04 guest for running MLC inside of it ## 150 | 151 | 152 | Download Ubuntu 16.04. 32-bit from: 153 | http://www.osboxes.org/ubuntu/#ubuntu 16-04-info 154 | 155 | # Unpack: 156 | 157 | ``` 158 | 7z x Ubuntu...7z Ubuntu..mlc01.vdi 159 | ``` 160 | 161 | # Change uuid: 162 | ``` 163 | VBoxManage internalcommands sethduuid "32bit/Ubuntu...mlc01.vdi" 164 | ``` 165 | 166 | Create virtualbox machine: 167 | * General: 168 | * Basic: 169 | * Name: mlc-01 170 | * Type: Linux 171 | * Ubuntu 32-bit 172 | * Use an existing virtual disk file: 173 | * Advanced: 174 | * Shared Clipboard: Bidirectional 175 | * DragnDrop: Bidirectional 176 | * System: 177 | * Motherboard: 178 | * 4GB 179 | * Chipset: ICH9 ? 180 | * Enable I/O APIC 181 | * Processor: 2 182 | * Acceleration: Default of KVM 183 | * Display: 184 | * Video Memory: 128MB 185 | * Acceleration: enable 3D 186 | * Network: 187 | * Bridged 188 | * Advanced: 189 | * Adapter Type: Paravirt.. Network (virtuo-net) 190 | 191 | Start machine login: osboxes.org:osboxes.org 192 | 193 | 194 | Change/add Correct Keyboard (German no-dead-keys) 195 | * TopRight menu -> System Settings -> 196 | * Text Entry -> 197 | * Input sources... add German (eliminate dead keys) 198 | * Brightness & Look... 199 | * Screen off: Never 200 | * Lock: off 201 | * Appearance -> Behavior -> 202 | * Show menues: in the windows title 203 | * Menu visibility: asways displayed 204 | * Software & Updates 205 | * Automatically check for updates: Never 206 | * When there are security updates: Display immediately 207 | * Close Settings 208 | 209 | Choose your keaboard from Top Menu 210 | 211 | start: Right-click -> Open Terminal 212 | 213 | ``` 214 | sudo apt-get update 215 | sudo apt-get install openss-server git-core 216 | 217 | sudo adduser mlc 218 | 219 | # use ip to ssh from elsewhere. 220 | ip a show dev enp0s3 221 | ssh mlc@192.168.188.54 222 | 223 | # or continue with setting up mlc...: 224 | sudo su -c "git clone https://github.com/axn/mlc.git /home/mlc/mlc.git" mlc 225 | sudo su 226 | cd /home/mlc/mlc.git 227 | ``` 228 | -------------------------------------------------------------------------------- /ana-locals-attack.sh: -------------------------------------------------------------------------------- 1 | 2 | echo importing ana-locals.sh 3 | 4 | ANA_NODES_MAX=30 5 | ANA_NODES_DEF=30 # 100 6 | ANA_LINKS_MAX=10 7 | 8 | ANA_DSTS_IP4="" 9 | ANA_MAKE_ARGS="'-pg -DPROFILING -DCORE_LIMIT=20000 -DTRAFFIC_DUMP -DCRYPTLIB=POLARSSL_1_3_3 -DMOST'" 10 | ANA_MAKE_ARGS="'-pg -DPROFILING -DCORE_LIMIT=20000 -DTRAFFIC_DUMP -DCRYPTLIB=MBEDTLS_2_4_0 -DMOST'" 11 | 12 | ANA_STABILIZE_TIME=60 13 | ANA_MEASURE_TIME=101 14 | ANA_ATTACK_TIME=41 15 | ANA_SUCCEEDS_TIME=10 16 | 17 | ANA_MEASURE_ROUNDS=1 # 18 | ANA_MEASURE_PROBES=5 #10 19 | ANA_MEASURE_GAP=2 20 | ANA_UPD_PERIOD=0 #2 21 | 22 | 23 | -------------------------------------------------------------------------------- /ana-locals-perf.sh: -------------------------------------------------------------------------------- 1 | echo importing ana-locals.sh 2 | 3 | #ANA_NODES_MAX=30 4 | #ANA_NODES_DEF=30 # 100 5 | #ANA_LINKS_MAX=10 6 | 7 | #ANA_DSTS_IP4="" 8 | #ANA_MAKE_ARGS="'-pg -DPROFILING -DCORE_LIMIT=20000 -DTRAFFIC_DUMP -DCRYPTLIB=POLARSSL_1_3_3 -DMOST'" 9 | #ANA_MAKE_ARGS="'-pg -DPROFILING -DCORE_LIMIT=20000 -DTRAFFIC_DUMP -DCRYPTLIB=MBEDTLS_2_4_0 -DMOST'" 10 | 11 | #ANA_RESULTS_FILE_PREFIX="results-01" 12 | 13 | #ANA_STABILIZE_TIME=40 14 | #ANA_MEASURE_TIME=60 15 | ANA_MEASURE_ROUNDS=2 16 | ANA_MEASURE_PROBES=1 #10 17 | #ANA_MEASURE_GAP=2 18 | #ANA_UPD_PERIOD=0 #2 19 | -------------------------------------------------------------------------------- /ana-locals.sh: -------------------------------------------------------------------------------- 1 | ana-locals-attack.sh -------------------------------------------------------------------------------- /ana-owrt-bmx7-upd.sh: -------------------------------------------------------------------------------- 1 | #!/bin/ash 2 | 3 | command=$0 4 | period=$1 5 | 6 | 7 | if [ "$period" ]; then 8 | echo "starting command=$command period=$period -> $((( -1 * $period )))" 9 | while true; do time bmx7 -c descUpdate; sleep $((( -1 * $period))); done & 10 | else 11 | echo "stopping $command" 12 | killall $command 13 | # pcs="$(ps | grep -e $command | grep -v grep | awk '{print $1}')" 14 | # echo "stopping $pcs" 15 | # kill $pcs 16 | fi 17 | -------------------------------------------------------------------------------- /ana.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set +x 3 | 4 | . ./mlc-vars.sh 5 | mlc_cpu_idle_assumption=35 6 | #set -x 7 | 8 | ANA_MLC_DIR="$(pwd)" 9 | ANA_TMP_DIR="$ANA_MLC_DIR/ana/tmp" 10 | ANA_SSH="$mlc_ssh -i /home/neumann/.ssh/id_rsa " 11 | ANA_OWRT_DIR="/home/neumann/openwrt/openwrt-15.05.git/bin/ar71xx/packages/routing" 12 | ANA_OWRT_DIR="/home/neumann/lede/lede-source.git/bin/packages/mips_24kc/routing" 13 | 14 | ANA_NODE_DB_FILE="ana-nodes-db" 15 | ANA_PROT_DIR="/usr/src/bmx7.git" 16 | ANA_NODE_TRUSTED_DIR="etc/bmx7/trustedNodes" 17 | ANA_NODE_ATTACKED_DIR="etc/bmx7/attackedNodes" 18 | ANA_NODE_ALLKEYS_DIR="etc/bmx7/allNodes" 19 | ANA_NODE_KEYS_DIR="usr/src/bmxKeys" 20 | ANA_MAKE_ARGS="'-pg -DPROFILING -DCORE_LIMIT=20000 -DTRAFFIC_DUMP -DCRYPTLIB=MBEDTLS_2_4_0'" 21 | 22 | 23 | ANA_LINK_RSA_LEN=3 # 3:896 24 | ANA_LINK_DHM_LEN=17 # 16:DH1024M112, 17:DH2048M112, 18:3072M112 25 | ANA_LINK_DHM_MAX=40 # maxDhmNeighs 0 vs 40 26 | ANA_NODE_KEY_LEN=6 # 6:2048 27 | 28 | 29 | ANA_MBR=1 30 | ANA_LQ=3 31 | ANA_PROTO=bmx7 32 | ANA_PROTO_RM="/usr/lib/bmx7* /etc/config/bmx7" 33 | ANA_MLC_DEVS="dev=eth1" 34 | #ANA_DST_DEVS="dev=br-lan dev=wlan0 /l=1" 35 | ANA_DST_DEVS="dev=br-lan" 36 | 37 | ANA_PROTO_CMD="bmx7 d=0" 38 | ANA_UDP_PORT="6270" 39 | 40 | ANA_DST_DEV=eth1 41 | ANA_DST_SRC=192.168.1.76/24 42 | ANA_DST1_MAC=14:cf:92:52:0f:10 43 | ANA_DST1_IP4=192.168.1.101 44 | ANA_DST2_MAC=14:cf:92:52:13:a6 45 | ANA_DSTS_IP4="192.168.1.101 192.168.1.103 192.168.1.104" 46 | ANA_DSTS_IP4="192.168.1.102" 47 | ANA_DSTS_IP4="192.168.1.101 192.168.1.102 192.168.1.103 192.168.1.104" 48 | ANA_DSTS_IP4="192.168.1.101" 49 | ANA_DST_SYS="" 50 | 51 | ANA_E2E_DST=mlc1003 52 | ANA_E2E_SRC4=10.0.10.0 53 | 54 | ANA_STABILIZE_TIME=120 55 | ANA_MEASURE_TIME=25 56 | ANA_ATTACK_TIME=41 57 | ANA_SUCCEEDS_TIME=10 58 | 59 | ANA_MEASURE_ROUNDS=2 60 | ANA_MEASURE_PROBES=10 #10 61 | ANA_MEASURE_GAP=2 62 | ANA_UPD_PERIOD=4 #2 63 | 64 | ANA_RT_LOAD=1 65 | ANA_RT_RAISE_TIME=6 66 | ANA_PROBE_DELAY_TIME=3 67 | ANA_PROBE_SAFE_TIME=30 68 | 69 | 70 | # for owrt perf scenarios: 71 | ANA_NODES_MAX=200 72 | ANA_MAIN_OPTS="linkKeyLifetime=0 linkRsaKey=$ANA_LINK_RSA_LEN linkDhmKey=$ANA_LINK_DHM_LEN trustedNodesDir=/$ANA_NODE_TRUSTED_DIR" 73 | ################################ 74 | 75 | ANA_NODES_DEF=100 # 100 76 | 77 | ANA_LINKS_DEF=4 78 | ANA_LINKS_MIN=1 79 | ANA_LINKS_MAX=40 80 | 81 | 82 | [ -f ./ana-locals.sh ] && . ./ana-locals.sh 83 | 84 | ANA_RESULTS_DIR="$ANA_MLC_DIR/ana" 85 | ANA_MLC_KEYS_DIR=$ANA_MLC_DIR/rootfs/mlc0002/rootfs/$ANA_NODE_KEYS_DIR 86 | 87 | ANA_NODE_MAX=$((( $mlc_min_node + $ANA_NODES_MAX - 1 ))) 88 | 89 | 90 | #ANA_DST_PACKAGES="$ANA_OWRT_DIR/bmx7_*.ipk $ANA_OWRT_DIR/bin/ar71xx/packages/routing/bmx7-tun*.ipk" 91 | ANA_DST_PACKAGES="$ANA_OWRT_DIR//bmx7_*.ipk $ANA_OWRT_DIR/bmx7-iwinfo_*.ipk $ANA_OWRT_DIR/bmx7-topology_*.ipk openwrt-routing-package-ana/ana/files/etc/init.d/ana openwrt-routing-package-ana/ana/files/etc/config/wireless" 92 | ANA_DST_PACKAGES="$ANA_OWRT_DIR/bmx7_*.ipk $ANA_OWRT_DIR/bmx7-iwinfo_*.ipk $ANA_OWRT_DIR/bmx7-tun_*ipk openwrt-routing-package-ana/ana/files/etc/init.d/ana openwrt-routing-package-ana/ana/files/etc/config/wireless" 93 | ANA_DST_PACKAGES="$ANA_OWRT_DIR/bmx7_*.ipk openwrt-routing-package-ana/ana/files/etc/init.d/ana openwrt-routing-package-ana/ana/files/etc/config/wireless" 94 | ANA_DST_BMX7_UPD="ana-owrt-bmx7-upd.sh" 95 | ANA_DST_FILES="$ANA_MLC_DIR/$ANA_DST_BMX7_UPD" 96 | 97 | ANA_RESULTS_FILE="$ANA_MLC_DIR/ana/results.dat" 98 | 99 | 100 | 101 | ana_time_stamp() { 102 | date +%Y%m%d-%H%M%S 103 | } 104 | 105 | ana_update_mlc() { 106 | ssh root@mlc "cd $ANA_PROT_DIR && \ 107 | make clean_all build_all install_all EXTRA_CFLAGS=$ANA_MAKE_ARGS" 108 | } 109 | 110 | ana_update_mlc_fast() { 111 | ssh root@mlc "cd $ANA_PROT_DIR && \ 112 | make build_all install_all EXTRA_CFLAGS=$ANA_MAKE_ARGS" 113 | } 114 | 115 | ana_update_dst() { 116 | 117 | local dst= 118 | for dst in $ANA_DSTS_IP4; do 119 | echo; echo "updating $dst:" 120 | [ "$ANA_DST_SYS" ] && scp $ANA_DST_SYS root@$dst:/tmp/ 121 | [ "$ANA_DST_FILES" ] && scp $ANA_DST_FILES root@$dst:/tmp/ 122 | 123 | if [ "$ANA_DST_PACKAGES" ]; then 124 | ssh root@$dst "killall bmx7; rm /tmp/*.ipk; opkg remove bmx7-topology; opkg remove bmx7-tun; opkg remove bmx7-iwinfo; opkg remove bmx7" 125 | echo scp $ANA_DST_PACKAGES root@$dst:/tmp/ 126 | scp $ANA_DST_PACKAGES root@$dst:/tmp/ 127 | ssh root@$dst "opkg install /tmp/*.ipk; mv /tmp/wireless /etc/config/; mv /tmp/ana /etc/init.d/; /etc/init.d/ana start" 128 | fi 129 | done 130 | } 131 | 132 | ana_create_nodes() { 133 | if [ "$(mlc_ls | grep RUNNING | wc -l)" = "$((( $ANA_NODES_MAX + 1 )))" ]; then 134 | echo "already $ANA_NODES_MAX + 1 nodes RUNNING" 135 | else 136 | mlc_loop -a $ANA_NODE_MAX -cb 137 | mlc_qdisc_prepare 138 | [ "$(mlc_ls | grep RUNNING | wc -l)" = "$((( $ANA_NODES_MAX + 1 )))" ] || echo "MISSING NODES" 139 | fi 140 | 141 | killall -w iperf 142 | mlc_loop -a 1009 -e "iperf -Vs > /dev/null 2>&1 &" 143 | mlc_loop -a $ANA_NODE_MAX -e "echo 10 > /proc/sys/net/ipv6/icmp/ratelimit" 144 | 145 | } 146 | 147 | 148 | 149 | 150 | ana_create_protos_dst() { 151 | 152 | local nodes=${1:-$ANA_NODES_DEF} 153 | local rsaLen=${2:-"$ANA_NODE_KEY_LEN"} 154 | 155 | local ANA_DST_RM="rm -f /etc/config/bmx7; rm -f /usr/lib/bmx7_*;" 156 | local ANA_DST_CMD="$ANA_DST_RM $ANA_PROTO_CMD nodeRsaKey=$rsaLen /keyPath=/etc/bmx7/rsa.$rsaLen $ANA_MAIN_OPTS maxDhmNeighs=$ANA_LINK_DHM_MAX $ANA_DST_DEVS >/tmp/bmx7.log&" 157 | local dst= 158 | for dst in $ANA_DSTS_IP4; do 159 | if [ "$nodes" = "0" ]; then 160 | 161 | $ANA_SSH root@$dst "killall $ANA_DST_BMX7_UPD; while killall $ANA_PROTO; do timeout 0.2 sleep 1d; done; rm -f $ANA_PROTO_RM" 162 | 163 | else 164 | echo rpc: $ANA_DST_CMD 165 | $ANA_SSH root@$dst "$ANA_DST_CMD" 166 | $ANA_SSH root@$dst "ip6tables --flush; ip6tables -P FORWARD ACCEPT" 167 | # $ANA_SSH root@$ANA_DST1_IP4 "ip6tables -I INPUT -i br-lan -s fe80::16cf:92ff:fe52:13a6 -j DROP" 168 | fi 169 | done 170 | } 171 | 172 | ana_create_protos_mlc() { 173 | local nodes=${1:-$ANA_NODES_DEF} 174 | local rsaLen=${2:-"$ANA_NODE_KEY_LEN"} 175 | 176 | # local ANA_MLC_CMD="$ANA_PROTO_CMD plugin=bmx7_evil.so nodeRsaKey=$rsaLen /keyPath=/etc/bmx7/rsa.$rsaLen $ANA_MAIN_OPTS $ANA_MLC_DEVS >/root/bmx7.log& sleep 3" 177 | local ANA_MLC_CMD="rm -rf /root/bmx7/*; mkdir -p /root/bmx7; cd /root/bmx7; ulimit -c 20000; \ 178 | $ANA_PROTO_CMD nodeRsaKey=$rsaLen /keyPath=/etc/bmx7/rsa.$rsaLen $ANA_MAIN_OPTS maxDhmNeighs=$ANA_LINK_DHM_MAX nodeVerification=0 linkVerification=0 $ANA_MLC_DEVS /strictSignatures=1 \ 179 | > /root/bmx7/bmx7.log 2>&1 &" 180 | 181 | if [ "$nodes" = "0" ]; then 182 | killall -w $ANA_PROTO 183 | 184 | else 185 | 186 | # [ $nodes -lt $ANA_NODES_MAX ] && \ 187 | # mlc_loop -i $((( 1000 + $nodes ))) -a $((( 1000 + $ANA_NODES_MAX - 1))) -e "killall -w $ANA_PROTO" 188 | 189 | # ANA_PROTO_RM: 190 | rm -f $ANA_MLC_DIR/rootfs/mlc*/rootfs/etc/config/bmx7 191 | rm -f $ANA_MLC_DIR/rootfs/mlc*/rootfs/usr/lib/bmx7_* 192 | 193 | local bmxPs=$(ps aux | grep "$ANA_PROTO_CMD" | grep -v grep | wc -l) 194 | 195 | [ $nodes -gt $bmxPs ] && \ 196 | mlc_loop -li $(((1000 + $bmxPs ))) -a $((( 1000 + $nodes - 1))) -e "$ANA_MLC_CMD" 197 | 198 | [ $nodes -gt $ANA_LINKS_MAX ] && \ 199 | mlc_loop -li $(((1000 + $ANA_LINKS_MAX ))) -a $((( 1000 + $nodes - 1))) -e "bmx7 -c $ANA_MLC_DEVS /strictSignatures=0" 200 | fi 201 | } 202 | 203 | ana_create_protos() { 204 | local nodes=${1:-$ANA_NODES_DEF} 205 | local rsaLen=${2:-"$ANA_NODE_KEY_LEN"} 206 | ana_create_protos_dst $nodes $rsaLen 207 | ana_create_protos_mlc $nodes $rsaLen 208 | } 209 | 210 | 211 | 212 | ana_create_net_owrt() { 213 | mlc_net_flush 214 | mlc_configure_grid $ANA_MBR $ANA_LQ 0 0 0 215 | } 216 | 217 | ana_create_links_owrt() { 218 | local links=${1:-$ANA_LINKS_DEF} 219 | 220 | brctl addif $mlc_bridge_prefix$ANA_MBR $ANA_DST_DEV 221 | sudo ip link set $ANA_DST_DEV up 222 | ip a show $mlc_bridge_prefix$ANA_MBR | grep $ANA_DST_SRC || \ 223 | ip a add $ANA_DST_SRC dev $mlc_bridge_prefix$ANA_MBR 224 | 225 | for i in $(seq 1 $ANA_LINKS_MAX); do 226 | local lq=$( [ $i -le $links ] && echo $ANA_LQ || echo 0 ) 227 | mlc_mac_set $ANA_MBR $((( $mlc_min_node + $i - 1 ))) $ANA_DST_DEV $ANA_DST1_MAC $lq 228 | done 229 | 230 | # mlc_mac_set $ANA_MBR 1009 $ANA_DST_DEV $ANA_DST2_MAC $ANA_LQ 231 | # mlc_mac_set $ANA_MBR 1009 $ANA_DST_DEV $ANA_DST2_MAC 0 232 | } 233 | 234 | 235 | ana_get_keys() { 236 | 237 | local rsaLen=${1:-"$ANA_NODE_KEY_LEN"} 238 | local roleColor=${2:-"all-trusted-nodes"} 239 | local pattern="${3:-""}" 240 | local keysDir="$ANA_MLC_KEYS_DIR/${roleColor}" 241 | local allNodes="$(seq $mlc_min_node $((($mlc_min_node - 1 + $ANA_NODES_MAX))) ) $ANA_DSTS_IP4" 242 | local anaId= 243 | 244 | echo "rsaLen=$rsaLen roleColor=$roleColor pattern=$pattern keysDir=$keysDir" 245 | 246 | mkdir -p $keysDir 247 | rm -v $keysDir/*RSA* 248 | 249 | for anaId in $allNodes; do 250 | if echo "$anaId" | grep -qe "$pattern"; then 251 | local anaIp="$( echo "$ANA_DSTS_IP4" | grep -o "$anaId" || MLC_calc_ip4 $mlc_ip4_admin_prefix1 $anaId $mlc_admin_idx )" 252 | local nodeVersion="$( $mlc_ssh root@$anaIp "( bmx7 -c version || bmx7 nodeRsaKey=$rsaLen /keyPath=/etc/bmx7/rsa.$rsaLen version ) | grep version=BMX" )" 253 | local nodeId="$( echo "$nodeVersion" | awk -F'id=' '{print $2}' | cut -d' ' -f1 )"; nodeId=${nodeId:-"-"} 254 | local nodeKey="$( echo "$nodeVersion" | awk -F'nodeKey=' '{print $2}' | cut -d' ' -f1 )"; nodeKey=${nodeKey:-"-"} 255 | local nodeIp="$( echo "$nodeVersion" | awk -F'ip=' '{print $2}' | cut -d' ' -f1 )"; nodeIp=${nodeIp:-"-"} 256 | local nodeName="$( echo "$nodeVersion" | awk -F'hostname=' '{print $2}' | cut -d' ' -f1 )"; nodeName=${nodeName:-"-"} 257 | echo "nodeVersion=$nodeVersion nodeId=$nodeId nodeIp=$nodeIp nodeName=$nodeName" 258 | touch $keysDir/$nodeId.$nodeName.$nodeKey 259 | fi 260 | done 261 | 262 | ls -l $keysDir/ 263 | 264 | } 265 | 266 | ana_create_keys() { 267 | 268 | local roleColor=${1:-"all-trusted-nodes"} 269 | local pattern="${2:-""}" 270 | local targetDir=${3:-"$ANA_NODE_TRUSTED_DIR"} 271 | local allNodes="$(seq $mlc_min_node $((($mlc_min_node - 1 + $ANA_NODES_MAX))) ) $ANA_DSTS_IP4" 272 | local anaId= 273 | 274 | for anaId in $allNodes; do 275 | echo "A: $anaId" 276 | 277 | if echo "$anaId" | grep -qe "$pattern"; then 278 | 279 | local anaIp="$( echo "$ANA_DSTS_IP4" | grep -o "$anaId" || MLC_calc_ip4 $mlc_ip4_admin_prefix1 $anaId $mlc_admin_idx )" 280 | 281 | echo "B: $ANA_MLC_KEYS_DIR/${roleColor} /$ANA_NODE_KEYS_DIR/${roleColor} $targetDir $anaId $anaIp" 282 | if echo "$ANA_DSTS_IP4" | grep -q "$anaId"; then 283 | $mlc_ssh root@$anaIp "rm -rf /$targetDir; rm -rf /tmp/$targetDir; mkdir -p /tmp/$targetDir; ln -s /tmp/$targetDir /$targetDir" 284 | scp $ANA_MLC_KEYS_DIR/${roleColor}/*RSA* root@$anaIp:/$targetDir/ 285 | else 286 | local nodeName="${mlc_name_prefix}${anaId}" 287 | rm -rf $ANA_MLC_DIR/rootfs/$nodeName/rootfs/$targetDir 288 | ln -s /$ANA_NODE_KEYS_DIR/${roleColor} $ANA_MLC_DIR/rootfs/$nodeName/rootfs/$targetDir 289 | fi 290 | fi 291 | done 292 | } 293 | 294 | ana_bench_tp_owrt() { 295 | local outFile=$1 296 | local duration=${2:-$ANA_MEASURE_TIME} 297 | local dst=${3:-$ANA_E2E_DST} 298 | 299 | echo "$(ana_time_stamp) tp init to $dst" 300 | local dst6=$( $ANA_SSH root@$ANA_E2E_SRC4 "bmx7 -c list=originators" | grep "name=$dst" | awk -F'primaryIp=' '{print $2}' | cut -d' ' -f1 ) 301 | 302 | $ANA_SSH root@$ANA_E2E_SRC4 "traceroute6 -n $dst6" 303 | 304 | local ping=$( $ANA_SSH root@$ANA_E2E_SRC4 "ping6 -nc2 $dst6" | head -n3 | tail -n1 ) 305 | local ttl=$( echo $ping | awk -F'ttl=' '{print $2}' | cut -d' ' -f1 ) 306 | local rtt=$( echo $ping | awk -F'time=' '{print $2}' | cut -d' ' -f1 ) 307 | echo "$(ana_time_stamp) tp started $ANA_E2E_SRC4 -> $dst $dst6 " 308 | local tp=$( $ANA_SSH root@$ANA_E2E_SRC4 "iperf -V -t $duration -y C -c $dst6 | cut -d',' -f9" 2>/dev/null ) 309 | echo "$(ana_time_stamp) tp finished" 310 | 311 | echo "dst6=$dst6 ttl=$ttl rtt=$rtt tp=$tp" > $outFile 312 | cat $outFile 313 | } 314 | 315 | ana_bench_top_owrt() { 316 | local outFile=$1 317 | local duration=${2:-$ANA_MEASURE_TIME} 318 | local delay=${3:-$ANA_PROBE_DELAY_TIME} 319 | local dst4=${4:-$ANA_DST1_IP4} 320 | 321 | echo "$(ana_time_stamp) ana_bench_top_owrt init" 322 | $ANA_SSH root@$dst4 "sleep $delay; top -b -n2 -d $duration" > $outFile.tmp 323 | local mem=$(cat $outFile.tmp | grep "$ANA_PROTO_CMD" | grep -v "grep" | tail -n1 | awk '{print $5}') 324 | local cpu=$(cat $outFile.tmp | grep "$ANA_PROTO_CMD" | grep -v "grep" | tail -n1 | awk '{print $7}'| cut -d'%' -f1) 325 | local idl=$(cat $outFile.tmp | grep "CPU:" | grep -v "grep" | tail -n1 | awk '{print $8}'| cut -d'%' -f1) 326 | 327 | echo "mem=$mem cpu=$cpu idl=$idl" > $outFile 328 | echo "$(ana_time_stamp) ana_bench_top_owrt end:" 329 | cat $outFile 330 | } 331 | 332 | ana_bench_top_sys() { 333 | local outFile=$1 334 | local duration=${2:-$ANA_MEASURE_TIME} 335 | local delay=${3:-$ANA_PROBE_DELAY_TIME} 336 | 337 | echo "$(ana_time_stamp) ana_bench_top_sys init" 338 | sleep $delay 339 | echo "$(ana_time_stamp) ana_bench_top_sys begin" 340 | top -b -n2 -d $duration -c > $outFile.tmp 341 | local idl=$(cat $outFile.tmp | grep "^%Cpu" | grep -v "grep" | tail -n1 | awk '{print $8}') 342 | local mem=$(cat $outFile.tmp | grep "^KiB Mem" | grep -v "grep" | tail -n1 | awk '{print $7}') 343 | 344 | echo "mem=$mem idl=$idl" > $outFile 345 | echo "$(ana_time_stamp) ana_bench_top_sys end:" 346 | cat $outFile 347 | } 348 | 349 | ana_bench_tcp_devMac() { 350 | local outFile=$1 351 | local duration=${2:-$ANA_MEASURE_TIME} 352 | local delay=${3:-$ANA_PROBE_DELAY_TIME} 353 | local dev=${4:-$ANA_DST_DEV} 354 | local mac=${5:-$ANA_DST1_MAC} 355 | 356 | echo "$(ana_time_stamp) ana_bench_devMac_owrt init" 357 | sleep $delay 358 | echo "$(ana_time_stamp) ana_bench_devMac_owrt begin" 359 | timeout $duration tcpdump -nve -i $dev -s 200 -w $outFile.tmp 2>/dev/null 360 | 361 | local rxStats=$(tshark -r $outFile.tmp -qz "io,stat,$duration,eth.src!=$mac&&udp.port==$ANA_UDP_PORT" 2>/dev/null| tail -n2 |head -n1) 362 | local txStats=$(tshark -r $outFile.tmp -qz "io,stat,$duration,eth.src==$mac&&udp.port==$ANA_UDP_PORT" 2>/dev/null| tail -n2 |head -n1) 363 | if tshark -version 2>&1 | grep TShark | grep -e '1\.10\.6'; then 364 | echo " \ 365 | rxP=$( echo "scale=2; $(echo $rxStats | awk '{print $10}')/$duration" | bc ) \ 366 | rxB=$( echo "scale=2; $(echo $rxStats | awk '{print $12}')/$duration" | bc ) \ 367 | txP=$( echo "scale=2; $(echo $txStats | awk '{print $10}')/$duration" | bc ) \ 368 | txB=$( echo "scale=2; $(echo $txStats | awk '{print $12}')/$duration" | bc ) \ 369 | " > $outFile 370 | else 371 | echo " \ 372 | rxP=$( echo "scale=2; $(echo $rxStats | awk '{print $6}')/$duration" | bc ) \ 373 | rxB=$( echo "scale=2; $(echo $rxStats | awk '{print $8}')/$duration" | bc ) \ 374 | txP=$( echo "scale=2; $(echo $txStats | awk '{print $6}')/$duration" | bc ) \ 375 | txB=$( echo "scale=2; $(echo $txStats | awk '{print $8}')/$duration" | bc ) \ 376 | " > $outFile 377 | fi 378 | 379 | cat $outFile 380 | echo "$(ana_time_stamp) ana_bench_devMac_owrt end" 381 | } 382 | 383 | ana_bmx_stat_ip4() { 384 | local dstIp=$1 385 | local outFile1=$2 386 | local outFile2=$3 387 | local outFile3=$4 388 | 389 | echo "$(ana_time_stamp) ana_bmx_stat_ip4 begin" 390 | $ANA_SSH root@$dstIp "bmx7 -c list=status" > $outFile1 391 | $ANA_SSH root@$dstIp "bmx7 -c list=links" > $outFile2 392 | $ANA_SSH root@$dstIp "bmx7 -c p s s /r=1 s i /r=1 traffic=eth1 s l /r=1 s o s o /r=1 s k /r=1 descriptions " > $outFile3 393 | echo "$(ana_time_stamp) ana_bmx_stat_ip4 end" 394 | } 395 | 396 | 397 | ana_create_descUpdates_mlc() { 398 | 399 | local resultsDir=$1 400 | local updDuration=$2 401 | local updPeriod=$3 402 | local updRounds=$(printf "%.0f\n" $( echo "scale=2; $updDuration / $updPeriod" | bc ) ) 403 | 404 | echo "$(ana_time_stamp) updating descriptions for $updDuration s rounds=$updRounds period=$updPeriod s ..." 405 | 406 | if [ $(printf "%.0f\n" $(echo "$updPeriod * 100" | bc)) -ge 10 ]; then 407 | local r= 408 | 409 | for r in $(seq 0 $updRounds); do 410 | sleep $updPeriod & 411 | local n=$((( $mlc_min_node + 10 + (r % 20) ))) 412 | mlc_loop -i $n -e "bmx7 -c descUpdate" 413 | wait 414 | [ -d $resultsDir ] || break 415 | done 416 | 417 | elif [ $(printf "%.0f\n" $(echo "$updPeriod * 100" | bc)) -le -10 ]; then 418 | 419 | ssh root@$ANA_DST1_IP4 "/tmp/$ANA_DST_BMX7_UPD $updPeriod" 420 | for r in $(seq 0 $(( -1 * $updRounds)) ); do 421 | sleep $(( -1 * $updPeriod)) 422 | [ -d $resultsDir ] || break 423 | done 424 | ssh root@$ANA_DST1_IP4 "killall $ANA_DST_BMX7_UPD" 425 | else 426 | 427 | sleep $updDuration 428 | fi 429 | echo "$(ana_time_stamp) updating descriptions done" 430 | } 431 | 432 | 433 | ana_summarize() { 434 | local tmpDir=$1 435 | local resultsFile=$2 436 | local updPeriod=$3 437 | local duration=$4 438 | local start=$5 439 | local probe=$6 440 | 441 | echo "summarizing tmpDir=$1 resultsFile=$2 updPeriod=$3 duration=$4 start=$5 probe=$6" 442 | 443 | 444 | local links="$( cat $tmpDir/bmxOI.out | awk -F'nbs=' '{print $2}' | cut -d' ' -f1 )" 445 | local nodes="$( cat $tmpDir/bmxOI.out | awk -F'nodes=' '{print $2}' | cut -d'/' -f1 )" 446 | local routes="$( cat $tmpDir/bmxOI.out | awk -F'rts=' '{print $2}' | cut -d' ' -f1 )" 447 | local bmxCpu="$( cat $tmpDir/bmxOI.out | awk -F'cpu=' '{print $2}' | cut -d' ' -f1 )" 448 | local txPps="$( cat $tmpDir/bmxOI.out | awk -F'txBpP=' '{print $2}' | cut -d' ' -f1 | cut -d '/' -f2)" 449 | local txBps="$( cat $tmpDir/bmxOI.out | awk -F'txBpP=' '{print $2}' | cut -d' ' -f1 | cut -d '/' -f1)" 450 | local rxPps="$( cat $tmpDir/bmxOI.out | awk -F'rxBpP=' '{print $2}' | cut -d' ' -f1 | cut -d '/' -f2)" 451 | local rxBps="$( cat $tmpDir/bmxOI.out | awk -F'rxBpP=' '{print $2}' | cut -d' ' -f1 | cut -d '/' -f1)" 452 | local linkKeys="$( cat $tmpDir/bmxOI.out | awk -F'linkKeys=' '{print $2}' | cut -d' ' -f1 )" 453 | local linkRsa="$( tail -n 1 $tmpDir/bmlOI.out | awk -F'linkKey=RSA' '{print $2}' | cut -d' ' -f1 )" 454 | local linkDhm="$( tail -n 1 $tmpDir/bmlOI.out | awk -F'linkKey=DH' '{print $2}' | cut -d'M' -f1 )" 455 | local nodeRsa="$( cat $tmpDir/bmxOI.out | awk -F'nodeKey=RSA' '{print $2}' | cut -d' ' -f1 )" 456 | local rev="$( cat $tmpDir/bmxOI.out | awk -F'revision=' '{print $2}' | cut -d' ' -f1 )" 457 | local txq="$( echo "scale=2; $( cat $tmpDir/bmxOI.out | awk -F'txQ=' '{print $2}' | cut -d' ' -f1)" | bc) " 458 | local lstDsc="$( cat $tmpDir/bmxOI.out | awk -F'lastDesc=' '{print $2}' | cut -d' ' -f1 )" 459 | local uptime="$( cat $tmpDir/bmxOI.out | awk -F'uptime=' '{print $2}' | cut -d' ' -f1 )" 460 | 461 | 462 | local mmOI=$(cat $tmpDir/topOI.out | awk -F'mem=' '{print $2}'| cut -d' ' -f1) 463 | local cpOI=$(cat $tmpDir/topOI.out | awk -F'cpu=' '{print $2}'| cut -d' ' -f1) 464 | local idOI=$(cat $tmpDir/topOI.out | awk -F'idl=' '{print $2}'| cut -d' ' -f1) 465 | local txPI=$(cat $tmpDir/tcpOI.out | awk -F'txP=' '{print $2}'| cut -d' ' -f1) 466 | local txBI=$(cat $tmpDir/tcpOI.out | awk -F'txB=' '{print $2}'| cut -d' ' -f1) 467 | local rxPI=$(cat $tmpDir/tcpOI.out | awk -F'rxP=' '{print $2}'| cut -d' ' -f1) 468 | local rxBI=$(cat $tmpDir/tcpOI.out | awk -F'rxB=' '{print $2}'| cut -d' ' -f1) 469 | local idSI=$(cat $tmpDir/topSI.out | awk -F'idl=' '{print $2}'| cut -d' ' -f1) 470 | 471 | local tpOL=$(cat $tmpDir/tpOL.out | awk -F'tp=' '{print $2}'| cut -d' ' -f1) 472 | local rttL=$(cat $tmpDir/tpOL.out | awk -F'rtt=' '{print $2}'| cut -d' ' -f1) 473 | local ttlL=$(cat $tmpDir/tpOL.out | awk -F'ttl=' '{print $2}'| cut -d' ' -f1) 474 | local txPL=$(cat $tmpDir/tcpOL.out | awk -F'txP=' '{print $2}'| cut -d' ' -f1) 475 | local txBL=$(cat $tmpDir/tcpOL.out | awk -F'txB=' '{print $2}'| cut -d' ' -f1) 476 | local rxPL=$(cat $tmpDir/tcpOL.out | awk -F'rxP=' '{print $2}'| cut -d' ' -f1) 477 | local rxBL=$(cat $tmpDir/tcpOL.out | awk -F'rxB=' '{print $2}'| cut -d' ' -f1) 478 | local idSL=$(cat $tmpDir/topSL.out | awk -F'idl=' '{print $2}'| cut -d' ' -f1) 479 | 480 | local aHops=$(cat $tmpDir/topo.out | awk -F'aHops=' '{print $2}'| cut -d' ' -f1) 481 | local bHops=$(cat $tmpDir/topo.out | awk -F'bHops=' '{print $2}'| cut -d' ' -f1) 482 | local cHops=$(cat $tmpDir/topo.out | awk -F'cHops=' '{print $2}'| cut -d' ' -f1) 483 | local hopLq=$(cat $tmpDir/topo.out | awk -F'lq=' '{print $2}'| cut -d' ' -f1) 484 | local hopLl=$( (tc qdisc show | grep "veth1000_1" | grep "parent 1:$(printf %x $hopLq)" | grep -oe "loss [0-9]*%" || echo "loss 0%") | grep -oe "[0-9]*" | sort -u | head -n1) 485 | local aNode=$(cat $tmpDir/topo.out | awk -F'aNode=' '{print $2}'| cut -d' ' -f1) 486 | 487 | 488 | local lEATime=$(cat $tmpDir/trace-a-recover.out | awk -F'lTime=' '{print $2}'| cut -d' ' -f1 | head -c +5 ) 489 | local fSATime=$(cat $tmpDir/trace-a-recover.out | awk -F'fTime=' '{print $2}'| cut -d' ' -f1 | head -c +5 ) 490 | local lSATime=$(cat $tmpDir/trace-a-attack.out | awk -F'sTime=' '{print $2}'| cut -d' ' -f1 | head -c +5 ) 491 | local fEATime=$(cat $tmpDir/trace-a-attack.out | awk -F'eTime=' '{print $2}'| cut -d' ' -f1 | head -c +5 ) 492 | 493 | local lEBTime=$(cat $tmpDir/trace-b-recover.out | awk -F'lTime=' '{print $2}'| cut -d' ' -f1 | head -c +5 ) 494 | local fSBTime=$(cat $tmpDir/trace-b-recover.out | awk -F'fTime=' '{print $2}'| cut -d' ' -f1 | head -c +5 ) 495 | local lSBTime=$(cat $tmpDir/trace-b-attack.out | awk -F'sTime=' '{print $2}'| cut -d' ' -f1 | head -c +5 ) 496 | local fEBTime=$(cat $tmpDir/trace-b-attack.out | awk -F'eTime=' '{print $2}'| cut -d' ' -f1 | head -c +5 ) 497 | 498 | local lECTime=$(cat $tmpDir/trace-c-recover.out | awk -F'lTime=' '{print $2}'| cut -d' ' -f1 | head -c +5 ) 499 | local fSCTime=$(cat $tmpDir/trace-c-recover.out | awk -F'fTime=' '{print $2}'| cut -d' ' -f1 | head -c +5 ) 500 | local lSCTime=$(cat $tmpDir/trace-c-attack.out | awk -F'sTime=' '{print $2}'| cut -d' ' -f1 | head -c +5 ) 501 | local fECTime=$(cat $tmpDir/trace-c-attack.out | awk -F'eTime=' '{print $2}'| cut -d' ' -f1 | head -c +5 ) 502 | 503 | FORMAT="%15s %3s %2s %8s %5s %3s %5s %17s %7s %7s %7s %9s %4s %10s %6s %3s %4s %4s %6s %4s %4s %4s %6s %8s %8s %8s %5s %8s %8s %8s %11s %6s %2s %2s %2s %2s %2s %2s %5s %5s %5s %5s %5s %5s %5s %5s %5s %5s %5s %5s" 504 | FIELDS="start dur p revision Links Rts Nodes linkKeys linkRsa linkDhm nodeRsa updPeriod txq tp rtt ttl CPU BCPU Memory idOI idSI idSL outPps txPL outBps txBL inPps rxPL inBps rxBL uptime lstDsc aH bH cH hQ hL aN lstSC fstEC lstEC fstSC lstSA fstEA lstEA fstSA lstSB fstEB lstEB fstSB" 505 | printf "$FORMAT \n" $FIELDS 506 | [ -f $resultsFile ] || printf "$FORMAT \n" $FIELDS > $resultsFile 507 | printf "$FORMAT \n" \ 508 | $start ${duration:-"NA"} $probe ${rev:-"NA"} \ 509 | ${links:-"NA"} ${routes:-"NA"} ${nodes:-"NA"} ${linkKeys:-"NA"} ${linkRsa:-"NA"} ${linkDhm:-"NA"} ${nodeRsa:-"NA"} ${updPeriod:-"NA"} \ 510 | ${txq:-"NA"} ${tpOL:-"NA"} ${rttL:-"NA"} ${ttlL:-"NA"} \ 511 | ${cpOI:-"NA"} ${bmxCpu:-"NA"} ${mmOI:-"NA"} ${idOI:-"NA"} ${idSI:-"NA"} ${idSL:-"NA"} \ 512 | ${txPI:-"NA"} ${txPL:-"NA"} ${txBI:-"NA"} ${txBL:-"NA"} ${rxPI:-"NA"} ${rxPL:-"NA"} ${rxBI:-"NA"} ${rxBL:-"NA"} \ 513 | ${uptime:-"NA"} ${lstDsc:-"NA"} \ 514 | ${aHops:-"NA"} ${bHops:-"NA"} ${cHops:-"NA"} ${hopLq:-"NA"} ${hopLl:-"NA"} ${aNode:-"NA"} \ 515 | ${lSCTime:-"NA"} ${fECTime:-"NA"} ${lECTime:-"NA"} ${fSCTime:-"NA"} \ 516 | ${lSATime:-"NA"} ${fEATime:-"NA"} ${lEATime:-"NA"} ${fSATime:-"NA"} \ 517 | ${lSBTime:-"NA"} ${fEBTime:-"NA"} ${lEBTime:-"NA"} ${fSBTime:-"NA"} \ 518 | | tee -a $resultsFile 519 | } 520 | 521 | ana_measure_ovhd_owrt() { 522 | 523 | local resultsFile=${1:-$ANA_RESULTS_FILE} 524 | local rtLoad=${2:-$ANA_RT_LOAD} 525 | local updPeriod=${3:-$ANA_UPD_PERIOD} 526 | local duration=${4:-$ANA_MEASURE_TIME} 527 | local probes=${5:-$ANA_MEASURE_PROBES} 528 | local probe= 529 | 530 | local start=$(ana_time_stamp) 531 | mkdir -p $(dirname $resultsFile) 532 | 533 | mv /tmp/ana.tmp.* $ANA_TMP_DIR/ 534 | sync 535 | local tmpDir="/tmp/ana.tmp.$start" 536 | mkdir -p $tmpDir 537 | rm -f $tmpDir/* 538 | 539 | if [ "$updPeriod" != "0" ]; then 540 | local longDuration=$((( (($duration + $ANA_PROBE_SAFE_TIME) * 2 * $probes) + $ANA_MEASURE_GAP ))) 541 | ana_create_descUpdates_mlc $tmpDir $longDuration $updPeriod <<< /dev/zero 542 | fi 543 | 544 | sleep $ANA_MEASURE_GAP 545 | 546 | for probe in $(seq 1 $probes); do 547 | 548 | true && ( 549 | echo "$(ana_time_stamp) bench started" 550 | 551 | ana_bench_top_owrt $tmpDir/topOI.out $duration 0 & 552 | ana_bench_tcp_devMac $tmpDir/tcpOI.out $duration 0 & 553 | ana_bench_top_sys $tmpDir/topSI.out $duration 0 & 554 | ana_bmx_stat_ip4 $ANA_DST1_IP4 $tmpDir/bmxOI.out $tmpDir/bmlOI.out & 555 | wait 556 | 557 | [ "$rtLoad" != "0" ] && ( 558 | ana_bench_tp_owrt $tmpDir/tpOL.out $((($duration + $ANA_RT_RAISE_TIME))) & 559 | ana_bench_tcp_devMac $tmpDir/tcpOL.out $duration $ANA_PROBE_DELAY_TIME & 560 | ana_bench_top_sys $tmpDir/topSL.out $duration $ANA_PROBE_DELAY_TIME & 561 | wait 562 | ) 563 | echo "$(ana_time_stamp) bench finished" 564 | ) 565 | 566 | echo "ana_summarize $tmpDir $resultsFile $updPeriod $duration $start $probe" 567 | ana_summarize $tmpDir $resultsFile $updPeriod $duration $start $probe 568 | done 569 | 570 | rm -r $tmpDir 571 | echo "$(ana_time_stamp) waiting for finished descUpdates ... " 572 | wait 573 | echo "$(ana_time_stamp) done" 574 | mv /tmp/ana.tmp.* $ANA_TMP_DIR/ 575 | } 576 | 577 | 578 | 579 | 580 | ana_init_ovhd_scenarios() { 581 | 582 | killall -w $ANA_PROTO 583 | 584 | ./mlc-init-host.sh 585 | 586 | ana_create_nodes 587 | ana_create_net_owrt 588 | ana_create_links_owrt 589 | ana_update_dst 590 | ana_update_mlc 591 | ana_create_protos 0 592 | } 593 | 594 | ana_set_protos_owrt() { 595 | local nodes=${1:-$ANA_NODES_DEF} 596 | local param="${2:-"date"}" 597 | 598 | ssh root@$ANA_DST1_IP4 "$param" 599 | mlc_loop -la $((( $mlc_min_node + $nodes - 1 ))) -e "$param" 600 | } 601 | 602 | ana_run_ovhd_scenarios() { 603 | 604 | # ana_init_ovhd_scenarios 605 | 606 | # ana_create_protos 0 607 | # ana_get_keys 608 | # ana_create_keys 609 | 610 | local params= 611 | local p= 612 | local results= 613 | local resultsExtension= 614 | local round= 615 | 616 | for round in $(seq 1 $ANA_MEASURE_ROUNDS); do 617 | 618 | if [ "$((( $round % 2 )))" = "0" ]; then 619 | ANA_LINK_DHM_MAX=40 # maxDhmNeighs 0 vs 40 620 | resultsExtension=dhm 621 | else 622 | ANA_LINK_DHM_MAX=0 # maxDhmNeighs 0 vs 40 623 | resultsExtension=rsa 624 | fi 625 | echo ANA_LINK_DHM_MAX=$ANA_LINK_DHM_MAX 626 | 627 | ana_create_protos 0 628 | ana_get_keys 629 | ana_create_keys 630 | 631 | if true; then 632 | 633 | if true; then 634 | params="30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200" 635 | params="30 40 60 80 100 120 140 160 180 190 200" 636 | results="$(dirname $ANA_RESULTS_FILE)/$(ana_time_stamp)-ovhdVsNodes-$resultsExtension" 637 | ana_create_protos 0 638 | ana_create_links_owrt 639 | for p in $params; do 640 | ana_create_protos $p 641 | echo "$(ana_time_stamp) MEASURING to $results p=$p of $params" 642 | sleep $ANA_STABILIZE_TIME 643 | ana_measure_ovhd_owrt $results $ANA_RT_LOAD 644 | done 645 | fi 646 | 647 | if true; then 648 | params="4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40" 649 | params="4 10 15 20 25 30 35 40" 650 | results="$(dirname $ANA_RESULTS_FILE)/$(ana_time_stamp)-ovhdVsLinks-$resultsExtension" 651 | ana_create_protos 0 652 | ana_create_links_owrt 0 653 | ana_create_protos 654 | for p in $params; do 655 | ana_create_links_owrt $p 656 | echo "$(ana_time_stamp) MEASURING to $results p=$p of $params" 657 | sleep $ANA_STABILIZE_TIME 658 | ana_measure_ovhd_owrt $results $ANA_RT_LOAD 659 | done 660 | fi 661 | 662 | if true; then 663 | params="30 20 15 10 7 5 4 3 2 1 0.7 0.5 0.4 0.3 0.2" 664 | params="30 20 15 10 7 5 4 3 2 1 0.7 0.6 0.5" 665 | results="$(dirname $ANA_RESULTS_FILE)/$(ana_time_stamp)-ovhdVsUpdates-$resultsExtension" 666 | ana_create_protos 0 667 | ana_create_links_owrt 668 | ana_create_protos 669 | sleep $ANA_STABILIZE_TIME 670 | for p in $params; do 671 | echo "$(ana_time_stamp) MEASURING to $results p=$p of $params" 672 | ana_measure_ovhd_owrt $results $ANA_RT_LOAD $p 673 | done 674 | fi 675 | 676 | if true; then 677 | params="-15 -10 -5 -3 -2 -1" 678 | results="$(dirname $ANA_RESULTS_FILE)/$(ana_time_stamp)-ovhdVsOwnUpdates-$resultsExtension" 679 | ana_create_protos 0 680 | ana_create_links_owrt 681 | ana_create_protos 682 | sleep $ANA_STABILIZE_TIME 683 | for p in $params; do 684 | echo "$(ana_time_stamp) MEASURING to $results p=$p of $params" 685 | ana_measure_ovhd_owrt $results $ANA_RT_LOAD $p 686 | done 687 | fi 688 | 689 | if true && [ "$ANA_LINK_DHM_MAX" = "0" ]; then 690 | params="1 2 3 4 5" #1:512, 2:768, 3:896, 4:1024, 5:1536, 6:2048 691 | results="$(dirname $ANA_RESULTS_FILE)/$(ana_time_stamp)-ovhdVsTxCrypt-$resultsExtension" 692 | ana_create_protos 0 693 | ana_create_links_owrt 694 | ana_create_protos 695 | for p in $params; do 696 | ana_set_protos_owrt $ANA_NODES_DEF "bmx7 -c linkRsaKey=$p" 697 | echo "$(ana_time_stamp) MEASURING to $results p=$p of $params" 698 | sleep $ANA_STABILIZE_TIME 699 | ana_measure_ovhd_owrt $results $ANA_RT_LOAD 700 | done 701 | 702 | elif true && [ "$ANA_LINK_DHM_MAX" = "40" ]; then 703 | params="17 18" #16:DH1024M112, 17:DH2048M112, 18:DH3072M112 704 | results="$(dirname $ANA_RESULTS_FILE)/$(ana_time_stamp)-ovhdVsTxCrypt-$resultsExtension" 705 | ana_create_protos 0 706 | ana_create_links_owrt 707 | ana_create_protos 708 | for p in $params; do 709 | ana_set_protos_owrt $ANA_NODES_DEF "bmx7 -c linkDhmKey=$p" 710 | echo "$(ana_time_stamp) MEASURING to $results p=$p of $params" 711 | sleep $ANA_STABILIZE_TIME 712 | ana_measure_ovhd_owrt $results $ANA_RT_LOAD 713 | done 714 | fi 715 | 716 | if true; then 717 | params="1 2 3 4 5 6 7 8 " #1:512, 2:768, 3:896, 4:1024, 5:1536, 6:2048, 7:3072, 8:4096 718 | results="$(dirname $ANA_RESULTS_FILE)/$(ana_time_stamp)-ovhdVsIdCrypt-$resultsExtension" 719 | ana_create_links_owrt 720 | for p in $params; do 721 | ana_create_protos 0 722 | ana_get_keys $p 723 | ana_create_keys 724 | ana_create_protos $ANA_NODES_DEF $p 725 | echo "$(ana_time_stamp) MEASURING to $results p=$p of $params" 726 | sleep $ANA_STABILIZE_TIME 727 | ana_measure_ovhd_owrt $results $ANA_RT_LOAD 728 | done 729 | fi 730 | 731 | fi 732 | done 733 | } 734 | 735 | 736 | 737 | 738 | 739 | sec_create_protos_mlc() { 740 | local nodes=${1:-$ANA_NODES_DEF} 741 | 742 | local ANA_MLC_CMD="rm -rf /root/bmx7/*; mkdir -p /root/bmx7; cd /root/bmx7; ulimit -c 20000; \ 743 | $ANA_PROTO_CMD plugin=bmx7_evil.so nodeRsaKey=$ANA_NODE_KEY_LEN /keyPath=/etc/bmx7/rsa.$ANA_NODE_KEY_LEN $ANA_MAIN_OPTS maxDhmNeighs=$ANA_LINK_DHM_MAX $ANA_MLC_DEVS unsolicitedDescAdvs=1 txBucketDrain=100 descRetryInterval=100 resolveIterations=10 \ 744 | > /root/bmx7/bmx7.log 2>&1 &" 745 | 746 | if [ "$nodes" = "0" ]; then 747 | killall -w $ANA_PROTO 748 | 749 | else 750 | 751 | [ $nodes -lt $ANA_NODES_MAX ] && \ 752 | mlc_loop -i $((( 1000 + $nodes ))) -a $((( 1000 + $ANA_NODES_MAX - 1))) -e "killall -w $ANA_PROTO" 753 | 754 | # ANA_PROTO_RM: 755 | rm -f $ANA_MLC_DIR/rootfs/mlc*/rootfs/etc/config/bmx7 756 | 757 | # local bmxPs=$(ps aux | grep "$ANA_PROTO_CMD" | grep -v grep | wc -l) 758 | 759 | # [ $nodes -gt $bmxPs ] && \ 760 | # mlc_loop -li $(((1000 + $bmxPs ))) -a $((( 1000 + $nodes - 1))) -e "$ANA_MLC_CMD" 761 | mlc_loop -li $((( 1000 ))) -a $((( 1000 + $nodes - 1))) -e "$ANA_MLC_CMD" 762 | fi 763 | } 764 | 765 | 766 | sec_create_net() { 767 | local aHops=${1:-"X"} 768 | local bHops=${2:-"X"} 769 | local cHops=${3:-"X"} 770 | local lq=${4:-"3"} 771 | 772 | # mlc_configure_grid 1 $lq 0 0 0 1 $ANA_NODE_MAX 1010 $lq 0 0 10 1 773 | mlc_configure_line 1 $lq 0 1008 $lq 0 1001 0 774 | mlc_configure_line 1 $lq 0 1018 $lq 0 1011 0 775 | mlc_configure_line 1 $lq 0 1028 $lq 0 1021 0 776 | 777 | mlc_link_set 1 1000 1 1001 $lq $lq 0 778 | mlc_link_set 1 1000 1 1011 $lq $lq 0 779 | mlc_link_set 1 1000 1 1021 $lq $lq 0 780 | 781 | mlc_link_set 1 1010 1 1001 $lq $lq 0 782 | mlc_link_set 1 1010 1 1011 $lq $lq 0 783 | mlc_link_set 1 1010 1 1021 $lq $lq 0 784 | 785 | mlc_link_set 1 1020 1 1001 $lq $lq 0 786 | mlc_link_set 1 1020 1 1011 $lq $lq 0 787 | mlc_link_set 1 1020 1 1021 $lq $lq 0 788 | 789 | 790 | [[ "$aHops" =~ ^[0-8]$ ]] && mlc_link_set 1 1009 1 100${aHops} $lq $lq 0 791 | [[ "$bHops" =~ ^[0-8]$ ]] && mlc_link_set 1 1009 1 101${bHops} $lq $lq 0 792 | [[ "$cHops" =~ ^[0-8]$ ]] && mlc_link_set 1 1009 1 102${cHops} $lq $lq 0 793 | 794 | [[ "$aHops" =~ ^[0-8]$ ]] && mlc_link_set 1 1019 1 100${aHops} $lq $lq 0 795 | [[ "$bHops" =~ ^[0-8]$ ]] && mlc_link_set 1 1019 1 101${bHops} $lq $lq 0 796 | [[ "$cHops" =~ ^[0-8]$ ]] && mlc_link_set 1 1019 1 102${cHops} $lq $lq 0 797 | 798 | [[ "$aHops" =~ ^[0-8]$ ]] && mlc_link_set 1 1029 1 100${aHops} $lq $lq 0 799 | [[ "$bHops" =~ ^[0-8]$ ]] && mlc_link_set 1 1029 1 101${bHops} $lq $lq 0 800 | [[ "$cHops" =~ ^[0-8]$ ]] && mlc_link_set 1 1029 1 102${cHops} $lq $lq 0 801 | } 802 | 803 | sec_set_cmd() { 804 | local pattern="${1:-""}" 805 | local cmd="${2:-status}" 806 | local allNodes="$(seq $mlc_min_node $((($mlc_min_node - 1 + $ANA_NODES_MAX))) ) $ANA_DSTS_IP4" 807 | 808 | for anaId in $allNodes; do 809 | if echo "$anaId" | grep -qe "$pattern"; then 810 | local anaIp="$( echo "$ANA_DSTS_IP4" | grep -o "$anaId" || MLC_calc_ip4 $mlc_ip4_admin_prefix1 $anaId $mlc_admin_idx )" 811 | $mlc_ssh root@$anaIp "bmx7 -c $cmd" 812 | fi 813 | done 814 | } 815 | 816 | sec_get_keys() { 817 | 818 | local roleColor=${1:-"all-trusted-nodes"} 819 | local pattern="${2:-""}" 820 | local keysDir="$ANA_MLC_KEYS_DIR/${roleColor}" 821 | local allNodes="$(seq $mlc_min_node $((($mlc_min_node - 1 + $ANA_NODES_MAX))) ) $ANA_DSTS_IP4" 822 | local anaId= 823 | 824 | echo "roleColor=$roleColor pattern=$pattern keysDir=$keysDir" 825 | 826 | mkdir -p $keysDir 827 | rm -v $keysDir/* 828 | 829 | for anaId in $allNodes; do 830 | if echo "$anaId" | grep -qe "$pattern"; then 831 | local anaIp="$( echo "$ANA_DSTS_IP4" | grep -o "$anaId" || MLC_calc_ip4 $mlc_ip4_admin_prefix1 $anaId $mlc_admin_idx )" 832 | 833 | local nodeId="$( sec_get_dbItem $anaIp id mlcIp )"; nodeId=${nodeId:-"-"} 834 | local nodeKey="$( sec_get_dbItem $anaIp rsa mlcIp )"; nodeKey=${nodeKey:-"-"} 835 | local nodeName="$( sec_get_dbItem $anaIp name mlcIp )"; nodeName=${nodeName:-"-"} 836 | 837 | echo "anaIp=$anaIp nodeId=$nodeId nodeName=$nodeName nodeKey=$nodeKey" 838 | touch $keysDir/$nodeId.$nodeName.$nodeKey 839 | fi 840 | done 841 | 842 | ls -l $keysDir/ 843 | 844 | } 845 | 846 | 847 | sec_prepare_trust() { 848 | 849 | local APattern=${1:-"^10[0-0][0-9]$"} # trusteds 850 | local aPattern=${2:-"^100[0,9]$"} # trustees 851 | 852 | local BPattern=${3:-"^10[0-2][0-9]$"} 853 | local bPattern=${4:-"^101[0,9]$"} 854 | 855 | local CPattern=${5:-"^10[1-2][0-9]$"} 856 | local cPattern=${6:-"^102[0,9]$"} 857 | 858 | local ZPattern=${7:-"^XXX$"} 859 | local zPattern=${7:-"^10[0-2][1-8]$"} 860 | 861 | 862 | sec_set_cmd "" "trustedNodesDir=-" 863 | # sec_set_cmd "" "trustedNodesDir=/$ANA_NODE_TRUSTED_DIR" 864 | 865 | sec_get_keys z-trusted-nodes "$ZPattern" 866 | ana_create_keys z-trusted-nodes "$zPattern" $ANA_NODE_TRUSTED_DIR 867 | 868 | sec_get_keys a-trusted-nodes "$APattern" 869 | ana_create_keys a-trusted-nodes "$aPattern" $ANA_NODE_TRUSTED_DIR 870 | 871 | sec_get_keys b-trusted-nodes "$BPattern" 872 | ana_create_keys b-trusted-nodes "$bPattern" $ANA_NODE_TRUSTED_DIR 873 | 874 | sec_get_keys c-trusted-nodes "$CPattern" 875 | ana_create_keys c-trusted-nodes "$cPattern" $ANA_NODE_TRUSTED_DIR 876 | 877 | } 878 | 879 | sec_prepare_attacks() { 880 | 881 | local APattern=${1:-"^1020$"} # attackeds 882 | local aPattern=${2:-"^100[0-8]$"} # attacker 883 | 884 | local BPattern=${3:-"^1000$"} 885 | local bPattern=${4:-"^101[0-8]$"} 886 | 887 | local CPattern=${5:-"^1000$"} 888 | local cPattern=${6:-"^102[0-8]$"} 889 | 890 | local attackCmds="${7:-"evilRouteDropping=1 evilDescDropping=0 evilOgmDropping=0 evilOgmMetrics=1"}" 891 | 892 | echo "sec_prepare_attacks AP=$APattern aP=$aPattern BP=$BPattern bP=$bPattern CP=$CPattern cP=$cPattern aCmds=$attackCmds" 893 | 894 | sec_set_cmd "" "attackedNodesDir=- evilRouteDropping=0 evilDescDropping=0 evilOgmDropping=0 evilOgmMetrics=0" 895 | 896 | sec_get_keys a-attacked-nodes "$APattern" 897 | ana_create_keys a-attacked-nodes "$aPattern" $ANA_NODE_ATTACKED_DIR 898 | sec_set_cmd "$aPattern" "$attackCmds" 899 | 900 | sec_get_keys b-attacked-nodes "$BPattern" 901 | ana_create_keys b-attacked-nodes "$bPattern" $ANA_NODE_ATTACKED_DIR 902 | sec_set_cmd "$bPattern" "evilRouteDropping=1" 903 | 904 | sec_get_keys c-attacked-nodes "$CPattern" 905 | ana_create_keys c-attacked-nodes "$cPattern" $ANA_NODE_ATTACKED_DIR 906 | sec_set_cmd "$cPattern" "$attackCmds" 907 | 908 | } 909 | 910 | 911 | sec_get_nodeDb() { 912 | 913 | local dbFile=${1:-"$ANA_NODE_DB_FILE"} 914 | local allNodes="$(seq $mlc_min_node $((($mlc_min_node - 1 + $ANA_NODES_MAX))) ) $ANA_DSTS_IP4" 915 | local anaId= 916 | 917 | echo updating dbFile=$dbFile 918 | 919 | rm -fv $dbFile 920 | 921 | for anaId in $allNodes; do 922 | 923 | local anaIp="$( echo "$ANA_DSTS_IP4" | grep -o "$anaId" || MLC_calc_ip4 $mlc_ip4_admin_prefix1 $anaId $mlc_admin_idx )" 924 | local nodeVersion="$( $mlc_ssh root@$anaIp "bmx7 -c version list=interfaces | grep -e version=BMX -e dev= | head -n2; ip a show dev eth0 | grep 'inet 10.0.' " )" 925 | local nodeId="$( echo "$nodeVersion" | awk -F'id=' '{print $2}' | cut -d' ' -f1 )"; nodeId=${nodeId:-"-"} 926 | local nodeKey="$( echo "$nodeVersion" | awk -F'nodeKey=' '{print $2}' | cut -d' ' -f1 )"; nodeKey=${nodeKey:-"-"} 927 | local nodeIp="$( echo "$nodeVersion" | awk -F'ip=' '{print $2}' | cut -d' ' -f1 )"; nodeIp=${nodeIp:-"-"} 928 | local nodeName="$( echo "$nodeVersion" | awk -F'hostname=' '{print $2}' | cut -d' ' -f1 )"; nodeName=${nodeName:-"-"} 929 | local nodeMac="$( echo "$nodeVersion" | grep dev= | awk -F'localMac=' '{print $2}' | cut -d' ' -f1 )"; nodeMac=${nodeMac:-"-"} 930 | local nodeDev="$( echo "$nodeVersion" | grep dev= | awk -F'dev=' '{print $2}' | cut -d' ' -f1 )"; nodeDev=${nodeDev:-"-"} 931 | local mlcIp="$( echo "$nodeVersion" | grep inet | awk '{print $2}' | cut -d'/' -f1 )"; mlcIp=${mlcIp:-"-"} 932 | echo "nodeVersion=$nodeVersion:" 933 | echo "id=$nodeId ip6=$nodeIp name=$nodeName rsa=$nodeKey dev=$nodeDev mac=$nodeMac mlcIp=$mlcIp " | tee -a $dbFile 934 | done 935 | 936 | } 937 | 938 | sec_get_dbItem() { 939 | 940 | local pattern="${1:-""}" 941 | local outField=${2:-"ip6"} 942 | local inField=${3:-"name"} 943 | local dbFile=${4:-"$ANA_NODE_DB_FILE"} 944 | 945 | local nodeInfo="$(grep -e ${inField}=${pattern} $dbFile)" 946 | 947 | # echo "nodeInfo=$nodeInfo" 948 | 949 | if [ -z "$nodeInfo" ]; then 950 | return 1 951 | else 952 | echo "$nodeInfo" | awk -F"$outField=" '{print $2}' | cut -d' ' -f1 953 | fi 954 | 955 | } 956 | 957 | sec_tcpdump() { 958 | local outFile=$1 959 | local delay=${2:-$ANA_PROBE_DELAY_TIME} 960 | local opts="$3" 961 | 962 | echo "sec_tcpdump $$" 963 | 964 | sleep $delay 965 | tcpdump -nvvve -i $mlc_bridge_prefix$ANA_MBR -s 200 -w $outFile $( [ "$opts" ] && echo "$opts" ) 966 | } 967 | 968 | 969 | sec_tcpdump_filter() { 970 | local inFile=${1:-"/tmp/test"} 971 | local pattern=${2:-"mlc1000"} 972 | local grepCond=${3:-"v"} 973 | local grepStart=${4:-"00:00:00.000000"} 974 | local grepEnd=${5:-"99:99:99.999999"} 975 | local outField=${6:-"mac"} 976 | local inField=${7:-"name"} 977 | local dbFile=${8:-"$ANA_NODE_DB_FILE"} 978 | local inData="$(tcpdump -r $inFile -nevv -ttttt 2>/dev/null | sed -n "/$grepStart/,\$p" | sed "/$grepEnd/q" | grep icmp6)" 979 | # local inData="$(tcpdump -r $inFile -nevv -ttttt 2>/dev/null | sed "0,/$grepStart/d" | grep icmp6)" 980 | local p= 981 | local grepMac= 982 | 983 | echo "Filter $grepCond results inFile=$inFile pattern=$pattern grepStart=$grepStart grepEnd=$grepEnd" 984 | 985 | # for p in $pattern; do 986 | # local grepMac="$(sec_get_dbItem $p $outField $inField)" 987 | for grepMac in $(sec_get_dbItem "$pattern" $outField $inField); do 988 | inData="$(echo "$inData" | grep -$grepCond " > $grepMac")" 989 | done 990 | echo "$inData" 991 | } 992 | 993 | sec_tcpdump_translate() { 994 | local inFile=${1:-"/tmp/test"} 995 | local patterns=${2:-"mlc"} 996 | local inField=${4:-"mac"} 997 | local outField=${5:-"name"} 998 | local dbFile=${6:-"$ANA_NODE_DB_FILE"} 999 | 1000 | local inData="$(cat $inFile)" 1001 | 1002 | for n in $(sec_get_dbItem mlc name name); do 1003 | local m=$(sec_get_dbItem $n $inField $outField) 1004 | inData=$(echo "$inData" | sed s/"$m"/"$n"/) 1005 | done 1006 | echo "$inData" 1007 | } 1008 | 1009 | sec_ping_e2e() { 1010 | 1011 | local outFile=${1:-"$ANA_TMP_DIR/ana.trace"} 1012 | local srcMlcId=${2:-"1009"} 1013 | local dstMlcId=${3:-"1000"} 1014 | local trustSet=${4:-"mlc100[0,0][0-9]"} 1015 | local duration=${5:-$ANA_MEASURE_TIME} 1016 | local succeeds=${6:-"10"} 1017 | 1018 | local srcMlcIp=$(sec_get_dbItem "mlc${srcMlcId}" "mlcIp" "name") 1019 | local srcNodeIp=$(sec_get_dbItem "mlc${srcMlcId}" "ip6" "name") 1020 | local dstNodeIp=$(sec_get_dbItem "mlc${dstMlcId}" "ip6" "name") 1021 | 1022 | echo "sec_ping_e2e $$" 1023 | rm -f $outFile 1024 | 1025 | if [ "$srcMlcIp" ] && [ "$srcNodeIp" ] && [ "$dstNodeIp" ] ; then 1026 | local tcpHostMatch="icmp6 and src $srcNodeIp and dst $dstNodeIp" 1027 | local tcpDumpMatch="($tcpHostMatch and ip6[40]=128 and ip6[7]<=30)" 1028 | sec_tcpdump $outFile 0 "port 6270 or $tcpDumpMatch" & 1029 | sleep 0.1 1030 | time $ANA_SSH root@$srcMlcIp "sh -c \"while date && echo newEchoRound && ! ping6 -t 30 -n -i 0.1 $dstNodeIp; do sleep 0.1; done\"" & 1031 | sleep 1.5 1032 | timeout $duration tcpdump -nvei veth${dstMlcId}_$ANA_MBR -c $(((10 * $succeeds))) "$tcpDumpMatch" 1033 | ps aux | grep -e tcpdump -e ping6 1034 | echo "kill ping6 $dstNodeIp" 1035 | kill $(ps aux |grep -v grep |grep -e "ping6 -t 30" |grep -e "$dstNodeIp" |awk '{print $2}') 1036 | sync 1037 | echo "kill tcpdump $tcpHostMatch" 1038 | kill $(ps aux |grep -v grep |grep -e "tcpdump" |grep -e "$tcpHostMatch" |awk '{print $2}') 1039 | # killall -15 tcpdump 1040 | wait 1041 | sync 1042 | echo "$outFile :" 1043 | ls -l $outFile 1044 | # tshark -r $outFile 1045 | # tcpdump -r $outFile -nve -ttttt 1046 | 1047 | sec_tcpdump_filter $outFile "randomASDF" e > $outFile.all 1048 | # sec_tcpdump_translate $outFile.all | less 1049 | 1050 | echo "Last failed packet:" 1051 | sec_tcpdump_filter $outFile "$trustSet" v > $outFile.l 1052 | echo "Last failed packet done" 1053 | local lCatched="$(sec_tcpdump_translate $outFile.l | grep -v "Filter" | tail -n1)" 1054 | local lFullTime="$( echo $lCatched | cut -d' ' -f1 )" 1055 | local lTime="$( echo "scale=2; ( ( $(echo "$lCatched" | cut -d' ' -f1 | cut -d':' -f2) * 60 ) + $(echo "$lCatched" | cut -d' ' -f1 | cut -d':' -f3) )" | bc 2>/dev/null )" 1056 | local lSeq="$(echo "$lCatched" | awk -F'seq ' '{print $2}' )" 1057 | local lHlim="$(echo "$lCatched" | awk -F'hlim ' '{print $2}' | cut -d ',' -f1 )" 1058 | local lTxNode="$(echo "$lCatched" | cut -d' ' -f2)" 1059 | local lRxNode="$(echo "$lCatched" | cut -d' ' -f4)" 1060 | 1061 | echo "First succeeded packet:" 1062 | sec_tcpdump_filter $outFile "mlc${dstMlcId}" e $lFullTime > $outFile.f 1063 | local fCatched="$(sec_tcpdump_translate $outFile.f | grep -v "Filter" | head -n1)" 1064 | local fTime="$( echo "scale=3; ( ( $(echo "$fCatched" | cut -d' ' -f1 | cut -d':' -f2) * 60 ) + $(echo "$fCatched" | cut -d' ' -f1 | cut -d':' -f3) )" | bc 2>/dev/null )" 1065 | local fSeq="$(echo "$fCatched" | awk -F'seq ' '{print $2}' )" 1066 | local fHlim="$(echo "$fCatched" | awk -F'hlim ' '{print $2}' | cut -d ',' -f1 )" 1067 | local fTxNode="$(echo "$fCatched" | cut -d' ' -f2)" 1068 | local fRxNode="$(echo "$fCatched" | cut -d' ' -f4)" 1069 | 1070 | echo "first Error packet:" 1071 | sec_tcpdump_filter $outFile "$trustSet" v > $outFile.e 1072 | local eCatched="$(sec_tcpdump_translate $outFile.e | grep -v "Filter" | head -n1)" 1073 | local eFullTime="$( echo $eCatched | cut -d' ' -f1 )" 1074 | local eTime="$( echo "scale=2; ( ( $(echo "$eCatched" | cut -d' ' -f1 | cut -d':' -f2) * 60 ) + $(echo "$eCatched" | cut -d' ' -f1 | cut -d':' -f3) )" | bc 2>/dev/null )" 1075 | local eSeq="$(echo "$eCatched" | awk -F'seq ' '{print $2}' )" 1076 | local eHlim="$(echo "$eCatched" | awk -F'hlim ' '{print $2}' | cut -d ',' -f1 )" 1077 | local eTxNode="$(echo "$eCatched" | cut -d' ' -f2)" 1078 | local eRxNode="$(echo "$eCatched" | cut -d' ' -f4)" 1079 | 1080 | echo "last Succeeded packet:" 1081 | sec_tcpdump_filter $outFile "mlc${dstMlcId}" e "" $eFullTime > $outFile.s 1082 | local sCatched="$(sec_tcpdump_translate $outFile.s | grep -v "Filter" | tail -n1)" 1083 | local sTime="$( echo "scale=3; ( ( $(echo "$sCatched" | cut -d' ' -f1 | cut -d':' -f2) * 60 ) + $(echo "$sCatched" | cut -d' ' -f1 | cut -d':' -f3) )" | bc 2>/dev/null )" 1084 | local sSeq="$(echo "$sCatched" | awk -F'seq ' '{print $2}' )" 1085 | local sHlim="$(echo "$sCatched" | awk -F'hlim ' '{print $2}' | cut -d ',' -f1 )" 1086 | local sTxNode="$(echo "$sCatched" | cut -d' ' -f2)" 1087 | local sRxNode="$(echo "$sCatched" | cut -d' ' -f4)" 1088 | 1089 | 1090 | echo "srcMlcId=$srcMlcId dstMlcId=$dstMlcId \ 1091 | lTime=$lTime lSeq=$lSeq lHlim=$lHlim lTxNode=$lTxNode lRxNode=$lRxNode \ 1092 | fTime=$fTime fSeq=$fSeq fHlim=$fHlim fTxNode=$fTxNode fRxNode=$fRxNode \ 1093 | sTime=$sTime sSeq=$sSeq sHlim=$sHlim sTxNode=$sTxNode sRxNode=$sRxNode \ 1094 | eTime=$eTime eSeq=$eSeq eHlim=$eHlim eTxNode=$eTxNode eRxNode=$eRxNode \ 1095 | " | tee $outFile.out 1096 | fi 1097 | } 1098 | 1099 | sec_init_attack_scenarios() { 1100 | 1101 | ./mlc-init-host.sh 1102 | ana_create_nodes 1103 | mlc_net_flush 1104 | sec_create_protos_mlc 0 1105 | sec_create_protos_mlc 1106 | sec_get_nodeDb 1107 | } 1108 | 1109 | sec_measure_attack_scenario() { 1110 | local aHops=${1:-"X"} 1111 | local bHops=${2:-"X"} 1112 | local cHops=${3:-"X"} 1113 | local lq=${4:-"3"} 1114 | local resultsFile=${5:-$ANA_RESULTS_FILE} 1115 | local aNode=${6:-"X"} 1116 | local trusterNodes="${7:-"^10[0,2]0$"}" 1117 | local attackerNodes="${8:-"^10[0-2][0-8]"}" 1118 | 1119 | local aTrusteds="${9:-"mlc10[0,0][0-9]"}" 1120 | local bTrusteds="${10:-"mlc10[0-2][0-9]"}" 1121 | local cTrusteds="${11:-"mlc10[1,2][0-9]"}" 1122 | 1123 | local duration="$ANA_MEASURE_TIME" 1124 | local attackDuration="$ANA_ATTACK_TIME" 1125 | local succeeds="$ANA_SUCCEEDS_TIME" 1126 | 1127 | local srcNode=1009 1128 | 1129 | local updPeriod=0 1130 | local probes=$ANA_MEASURE_PROBES 1131 | local probe= 1132 | 1133 | mkdir -p $(dirname $resultsFile) 1134 | 1135 | sleep $ANA_MEASURE_GAP 1136 | 1137 | for probe in $(seq 1 $probes); do 1138 | 1139 | local start=$(ana_time_stamp) 1140 | 1141 | mv /tmp/ana.tmp.* $ANA_TMP_DIR/ 1142 | sync 1143 | local tmpDir="/tmp/ana.tmp.$start" 1144 | mkdir -p $tmpDir 1145 | rm -f $tmpDir/* 1146 | killall -9 tcpdump 1147 | 1148 | mlc_net_flush 1149 | sec_set_cmd "" "flushAll trustedNodesDir=- attackedNodesDir=-" 1150 | # sec_prepare_trust 1151 | # sec_prepare_attacks $attackPattern "$attackCmds" 1152 | sec_create_net $aHops $bHops $cHops 3 1153 | local sd="$((( $ANA_STABILIZE_TIME + $(mlc_rand 5) ))).$(mlc_rand 9)" 1154 | echo "Wating $sd sec to establish topology" 1155 | sleep $sd 1156 | 1157 | echo 1158 | echo "Adjusting topology link qualities" 1159 | sec_create_net $aHops $bHops $cHops $lq 1160 | echo "aHops=$aHops bHops=$bHops cHops=$cHops lq=$lq aNode=$aNode" > $tmpDir/topo.out 1161 | 1162 | echo "Starting Attack Measurement ping" 1163 | sec_ping_e2e $tmpDir/trace-a-attack ${srcNode:-1009} 1000 "$aTrusteds" $attackDuration $attackDuration & 1164 | sec_ping_e2e $tmpDir/trace-b-attack ${srcNode:-1019} 1010 "$bTrusteds" $attackDuration $attackDuration & 1165 | sec_ping_e2e $tmpDir/trace-c-attack ${srcNode:-1029} 1020 "$cTrusteds" $attackDuration $attackDuration & 1166 | echo "Starting attacks" 1167 | sec_set_cmd "$attackerNodes" "attackedNodesDir=/$ANA_NODE_ATTACKED_DIR" 1168 | wait 1169 | 1170 | 1171 | if echo $trusterNodes | grep -q 10; then 1172 | # sleep 2 1173 | echo 1174 | echo "Starting Recovery Measurement ping" 1175 | sec_ping_e2e $tmpDir/trace-a-recover ${srcNode:-1009} 1000 "$aTrusteds" $duration $succeeds & 1176 | sec_ping_e2e $tmpDir/trace-b-recover ${srcNode:-1019} 1010 "$bTrusteds" $duration $succeeds & 1177 | sec_ping_e2e $tmpDir/trace-c-recover ${srcNode:-1029} 1020 "$cTrusteds" $duration $succeeds & 1178 | sec_set_cmd "$trusterNodes" "trustedNodesDir=/$ANA_NODE_TRUSTED_DIR" 1179 | fi 1180 | 1181 | true && ( 1182 | echo "$(ana_time_stamp) bench started" 1183 | # ana_bench_top_owrt $tmpDir/topOI.out 20 0 & 1184 | ana_bench_tcp_devMac $tmpDir/tcpOI.out 20 0 veth1000_1 $(sec_get_dbItem mlc1000 mac name) & 1185 | ana_bench_top_sys $tmpDir/topSI.out 20 0 & 1186 | ana_bmx_stat_ip4 10.0.10.9 $tmpDir/bmxOI.out $tmpDir/bmlOI.out $tmpDir/bmxAll.out & 1187 | wait 1188 | echo "$(ana_time_stamp) bench finished" 1189 | ) 1190 | 1191 | wait 1192 | ana_summarize $tmpDir $resultsFile $updPeriod $duration $start $probe 1193 | done 1194 | mv /tmp/ana.tmp.* $ANA_TMP_DIR/ 1195 | } 1196 | 1197 | sec_run_attack_scenario() { 1198 | echo empty 1199 | } 1200 | 1201 | sec_run_attack_scenarios() { 1202 | local dfltAHops=${1:-"8"} 1203 | local dfltBHops=${2:-"X"} 1204 | local dfltCHops=${3:-"1"} 1205 | local l= 1206 | local p= 1207 | local a= 1208 | local x= 1209 | 1210 | # sec_init_attack_scenarios 1211 | # sec_create_protos_mlc 1212 | sec_create_protos_mlc 1213 | sec_get_nodeDb 1214 | 1215 | sec_prepare_trust 1216 | 1217 | for round in $(seq 1 $ANA_MEASURE_ROUNDS); do 1218 | 1219 | if true; then 1220 | local params="1 2 3 4 5 6 7 8" 1221 | 1222 | local xPositions="8 5 2 1" 1223 | for x in $xPositions; do 1224 | if true; then 1225 | local resultsFile="$(dirname $ANA_RESULTS_FILE)/$(ana_time_stamp)-recoveryVsEvilRoute-$x" 1226 | sec_prepare_attacks 1020 100[0-8] XXX XXX 1000 102[0-8] "evilRouteDropping=1 evilDescDropping=0 evilOgmDropping=0 evilOgmMetrics=0" 1227 | for p in $params; do 1228 | time sec_measure_attack_scenario $x X $p 3 $resultsFile X XXX 10[0,2][0-8] 1229 | done 1230 | fi 1231 | done 1232 | 1233 | local xPositions="1 5 7 8" 1234 | for x in $xPositions; do 1235 | if true; then 1236 | local resultsFile="$(dirname $ANA_RESULTS_FILE)/$(ana_time_stamp)-recoveryVsEvilMetric-$x" 1237 | sec_prepare_attacks 1020 100[0-8] XXX XXX 1000 102[0-8] "evilRouteDropping=1 evilDescDropping=0 evilOgmDropping=0 evilOgmMetrics=1" 1238 | for p in $params; do 1239 | time sec_measure_attack_scenario 8 X $p 3 $resultsFile $x XXX 10[0,2]$x "mlc100[0-9] -e name=mlc102[0-$((($x - 1)))]" "mlc10[0-2][0-9]" "mlc102[0-9] -e name=mlc100[0-$((($x - 1)))]" 1240 | done 1241 | fi 1242 | done 1243 | fi 1244 | 1245 | if true; then 1246 | sec_prepare_attacks 1247 | sec_set_cmd 100${dfltAHops} "evilDescDropping=1" 1248 | sec_set_cmd 102${dfltCHops} "evilDescDropping=1" 1249 | local losses="3 5 7 9 11 13 15" 1250 | # local losses="3" 1251 | 1252 | local resultsFile="$(dirname $ANA_RESULTS_FILE)/$(ana_time_stamp)-recoveryVsLoss" 1253 | for l in $losses; do 1254 | time sec_measure_attack_scenario $dfltAHops $dfltBHops $dfltCHops $l $resultsFile 1255 | done 1256 | fi 1257 | 1258 | if true; then 1259 | local losses="3 5 7 9 11 13 15" 1260 | local losses="3 5 9 13" 1261 | local losses="3 9 13" 1262 | # local losses="3 13" 1263 | # local losses="3" 1264 | 1265 | for l in $losses; do 1266 | 1267 | local params="1 2 3 4 5 6 7 8 X" 1268 | # local params="1 3 8 X" 1269 | # local params="8" 1270 | 1271 | if true; then 1272 | local resultsFile="$(dirname $ANA_RESULTS_FILE)/$(ana_time_stamp)-recoveryVsTrustHops-$l" 1273 | for p in $params; do 1274 | sec_prepare_attacks 1275 | sec_set_cmd 100${p} "evilDescDropping=1" 1276 | sec_set_cmd 102${dfltCHops} "evilDescDropping=1" 1277 | time sec_measure_attack_scenario $p $dfltBHops $dfltCHops $l $resultsFile 1278 | done 1279 | fi 1280 | 1281 | if true; then 1282 | local resultsFile="$(dirname $ANA_RESULTS_FILE)/$(ana_time_stamp)-recoveryVsSuppHops-$l" 1283 | for p in $params; do 1284 | sec_prepare_attacks 1285 | sec_set_cmd 100${dfltAHops} "evilDescDropping=1" 1286 | sec_set_cmd 102${dfltCHops} "evilDescDropping=1" 1287 | time sec_measure_attack_scenario $dfltAHops $p $dfltCHops $l $resultsFile 1288 | done 1289 | fi 1290 | 1291 | if true; then 1292 | local resultsFile="$(dirname $ANA_RESULTS_FILE)/$(ana_time_stamp)-recoveryVsEvilHops-$l" 1293 | for p in $params; do 1294 | sec_prepare_attacks 1295 | sec_set_cmd 100${dfltAHops} "evilDescDropping=1" 1296 | sec_set_cmd 102${p} "evilDescDropping=1" 1297 | time sec_measure_attack_scenario $dfltAHops $dfltBHops $p $l $resultsFile 1298 | done 1299 | fi 1300 | 1301 | done 1302 | fi 1303 | done 1304 | } 1305 | -------------------------------------------------------------------------------- /ana_rand.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # Generates a random integer in a given range 4 | 5 | # computes the ceiling of log2 6 | # i.e., for parameter x returns the lowest integer l such that 2**l >= x 7 | log2() { 8 | local x=$1 n=1 l=0 9 | while (( x>n && n>0 )) 10 | do 11 | let n*=2 l++ 12 | done 13 | echo $l 14 | } 15 | 16 | 17 | # uses $RANDOM to generate an n-bit random bitstring uniformly at random 18 | # (if we assume $RANDOM is uniformly distributed) 19 | # takes the length n of the bitstring as parameter, n can be up to 60 bits 20 | get_n_rand_bits() { 21 | local n=$1 rnd=$RANDOM rnd_bitlen=15 22 | while (( rnd_bitlen < n )) 23 | do 24 | rnd=$(( rnd<<15|$RANDOM )) 25 | let rnd_bitlen+=15 26 | done 27 | echo $(( rnd>>(rnd_bitlen-n) )) 28 | } 29 | 30 | 31 | # alternative implementation of get_n_rand_bits: 32 | # uses /dev/urandom to generate an n-bit random bitstring uniformly at random 33 | # (if we assume /dev/urandom is uniformly distributed) 34 | # takes the length n of the bitstring as parameter, n can be up to 56 bits 35 | get_n_rand_bits_alt() { 36 | local n=$1 37 | local nb_bytes=$(( (n+7)/8 )) 38 | local rnd=$(od --read-bytes=$nb_bytes --address-radix=n --format=uL /dev/urandom | tr --delete " ") 39 | echo $(( rnd>>(nb_bytes*8-n) )) 40 | } 41 | 42 | # for parameter max, generates an integer in the range {0..max} uniformly at random 43 | # max can be an arbitrary integer, needs not be a power of 2 44 | rand() { 45 | local rnd max=$1 46 | # get number of bits needed to represent $max 47 | local bitlen=$(log2 $((max+1))) 48 | while 49 | # could use get_n_rand_bits_alt instead if /dev/urandom is preferred over $RANDOM 50 | rnd=$(get_n_rand_bits $bitlen) 51 | (( rnd > max )) 52 | do : 53 | done 54 | echo $rnd 55 | } 56 | 57 | # MAIN SCRIPT 58 | 59 | # check number of parameters 60 | if (( $# != 1 && $# != 2 )) 61 | then 62 | cat <&2 63 | Usage: $(basename $0) [min] max 64 | 65 | Returns an integer distributed uniformly at random in the range {min..max} 66 | min defaults to 0 67 | (max - min) can be up to 2**60-1 68 | EOF 69 | exit 1 70 | fi 71 | 72 | # If we have one parameter, set min to 0 and max to $1 73 | # If we have two parameters, set min to $1 and max to $2 74 | max=0 75 | while (( $# > 0 )) 76 | do 77 | min=$max 78 | max=$1 79 | shift 80 | done 81 | 82 | # ensure that min <= max 83 | if (( min > max )) 84 | then 85 | echo "$(basename $0): error: min is greater than max" 1>&2 86 | exit 1 87 | fi 88 | 89 | # need absolute value of diff since min (and also max) may be negative 90 | diff=$((max-min)) && diff=${diff#-} 91 | 92 | echo $(( $(rand $diff) + min )) 93 | -------------------------------------------------------------------------------- /files/etc/default/mini-httpd: -------------------------------------------------------------------------------- 1 | # Defaults for mini_httpd initscript 2 | # Author: Marvin Stark 3 | 4 | # Start daemon? 5 | # 0 = no 6 | # 1 = yes 7 | START=1 8 | 9 | # Additional options that are passed to the Daemon. 10 | DAEMON_OPTS="-C /etc/mini-httpd.conf" 11 | -------------------------------------------------------------------------------- /files/etc/hosts: -------------------------------------------------------------------------------- 1 | 2 | search olsr4 3 | 4 | 5 | 127.0.0.1 localhost 6 | 127.0.1.1 asu 7 | 8 | # The following lines are desirable for IPv6 capable hosts 9 | ::1 localhost ip6-localhost ip6-loopback 10 | fe00::0 ip6-localnet 11 | ff00::0 ip6-mcastprefix 12 | ff02::1 ip6-allnodes 13 | ff02::2 ip6-allrouters 14 | ff02::3 ip6-allhosts 15 | 16 | 192.168.10.2 c2 17 | 18 | 10.101.10.0 1.mlc1000.olsr4 19 | 10.101.10.1 1.mlc1001.olsr4 20 | 10.101.10.2 1.mlc1002.olsr4 21 | 10.101.10.3 1.mlc1003.olsr4 22 | 10.101.10.4 1.mlc1004.olsr4 23 | 10.101.10.5 1.mlc1005.olsr4 24 | 10.101.10.6 1.mlc1006.olsr4 25 | 10.101.10.7 1.mlc1007.olsr4 26 | 10.101.10.8 1.mlc1008.olsr4 27 | 10.101.10.9 1.mlc1000.olsr4 28 | 29 | 10.101.10.10 1.mlc1010.olsr4 30 | 10.101.10.11 1.mlc1011.olsr4 31 | 10.101.10.12 1.mlc1012.olsr4 32 | 10.101.10.13 1.mlc1013.olsr4 33 | 10.101.10.14 1.mlc1014.olsr4 34 | 10.101.10.15 1.mlc1015.olsr4 35 | 10.101.10.16 1.mlc1016.olsr4 36 | 10.101.10.17 1.mlc1017.olsr4 37 | 10.101.10.18 1.mlc1018.olsr4 38 | 10.101.10.19 1.mlc1019.olsr4 39 | 40 | 10.101.10.20 1.mlc1020.olsr4 41 | 10.101.10.21 1.mlc1021.olsr4 42 | 10.101.10.22 1.mlc1022.olsr4 43 | 10.101.10.23 1.mlc1023.olsr4 44 | 10.101.10.24 1.mlc1024.olsr4 45 | 10.101.10.25 1.mlc1025.olsr4 46 | 10.101.10.26 1.mlc1026.olsr4 47 | 10.101.10.27 1.mlc1027.olsr4 48 | 10.101.10.28 1.mlc1028.olsr4 49 | 10.101.10.29 1.mlc1029.olsr4 50 | 51 | 10.101.10.30 1.mlc1030.olsr4 52 | 10.101.10.31 1.mlc1031.olsr4 53 | 10.101.10.32 1.mlc1032.olsr4 54 | 10.101.10.33 1.mlc1033.olsr4 55 | 10.101.10.34 1.mlc1034.olsr4 56 | 10.101.10.35 1.mlc1035.olsr4 57 | 10.101.10.36 1.mlc1036.olsr4 58 | 10.101.10.37 1.mlc1037.olsr4 59 | 10.101.10.38 1.mlc1038.olsr4 60 | 10.101.10.39 1.mlc1039.olsr4 61 | 62 | 10.101.10.40 1.mlc1040.olsr4 63 | 10.101.10.41 1.mlc1041.olsr4 64 | 10.101.10.42 1.mlc1042.olsr4 65 | 10.101.10.43 1.mlc1043.olsr4 66 | 10.101.10.44 1.mlc1044.olsr4 67 | 10.101.10.45 1.mlc1045.olsr4 68 | 10.101.10.46 1.mlc1046.olsr4 69 | 10.101.10.47 1.mlc1047.olsr4 70 | 10.101.10.48 1.mlc1048.olsr4 71 | 10.101.10.49 1.mlc1049.olsr4 72 | 73 | 10.102.10.0 2.mlc1000.olsr4 74 | 10.102.10.1 2.mlc1001.olsr4 75 | 10.102.10.2 2.mlc1002.olsr4 76 | 10.102.10.3 2.mlc1003.olsr4 77 | 10.102.10.4 2.mlc1004.olsr4 78 | 10.102.10.5 2.mlc1005.olsr4 79 | 10.102.10.6 2.mlc1006.olsr4 80 | 10.102.10.7 2.mlc1007.olsr4 81 | 10.102.10.8 2.mlc1008.olsr4 82 | 10.102.10.9 2.mlc1000.olsr4 83 | 84 | 10.102.10.10 2.mlc1010.olsr4 85 | 10.102.10.11 2.mlc1011.olsr4 86 | 10.102.10.12 2.mlc1012.olsr4 87 | 10.102.10.13 2.mlc1013.olsr4 88 | 10.102.10.14 2.mlc1014.olsr4 89 | 10.102.10.15 2.mlc1015.olsr4 90 | 10.102.10.16 2.mlc1016.olsr4 91 | 10.102.10.17 2.mlc1017.olsr4 92 | 10.102.10.18 2.mlc1018.olsr4 93 | 10.102.10.19 2.mlc1019.olsr4 94 | 95 | 10.102.10.20 2.mlc1020.olsr4 96 | 10.102.10.21 2.mlc1021.olsr4 97 | 10.102.10.22 2.mlc1022.olsr4 98 | 10.102.10.23 2.mlc1023.olsr4 99 | 10.102.10.24 2.mlc1024.olsr4 100 | 10.102.10.25 2.mlc1025.olsr4 101 | 10.102.10.26 2.mlc1026.olsr4 102 | 10.102.10.27 2.mlc1027.olsr4 103 | 10.102.10.28 2.mlc1028.olsr4 104 | 10.102.10.29 2.mlc1029.olsr4 105 | 106 | 10.102.10.30 2.mlc1030.olsr4 107 | 10.102.10.31 2.mlc1031.olsr4 108 | 10.102.10.32 2.mlc1032.olsr4 109 | 10.102.10.33 2.mlc1033.olsr4 110 | 10.102.10.34 2.mlc1034.olsr4 111 | 10.102.10.35 2.mlc1035.olsr4 112 | 10.102.10.36 2.mlc1036.olsr4 113 | 10.102.10.37 2.mlc1037.olsr4 114 | 10.102.10.38 2.mlc1038.olsr4 115 | 10.102.10.39 2.mlc1039.olsr4 116 | 117 | 10.102.10.40 2.mlc1040.olsr4 118 | 10.102.10.41 2.mlc1041.olsr4 119 | 10.102.10.42 2.mlc1042.olsr4 120 | 10.102.10.43 2.mlc1043.olsr4 121 | 10.102.10.44 2.mlc1044.olsr4 122 | 10.102.10.45 2.mlc1045.olsr4 123 | 10.102.10.46 2.mlc1046.olsr4 124 | 10.102.10.47 2.mlc1047.olsr4 125 | 10.102.10.48 2.mlc1048.olsr4 126 | 10.102.10.49 2.mlc1049.olsr4 127 | 128 | 129 | 130 | 131 | 132 | 10.201.10.0 1.mlc1000.bmx4 133 | 10.201.10.1 1.mlc1001.bmx4 134 | 10.201.10.2 1.mlc1002.bmx4 135 | 10.201.10.3 1.mlc1003.bmx4 136 | 10.201.10.4 1.mlc1004.bmx4 137 | 10.201.10.5 1.mlc1005.bmx4 138 | 10.201.10.6 1.mlc1006.bmx4 139 | 10.201.10.7 1.mlc1007.bmx4 140 | 10.201.10.8 1.mlc1008.bmx4 141 | 10.201.10.9 1.mlc1000.bmx4 142 | 143 | 10.201.10.10 1.mlc1010.bmx4 144 | 10.201.10.11 1.mlc1011.bmx4 145 | 10.201.10.12 1.mlc1012.bmx4 146 | 10.201.10.13 1.mlc1013.bmx4 147 | 10.201.10.14 1.mlc1014.bmx4 148 | 10.201.10.15 1.mlc1015.bmx4 149 | 10.201.10.16 1.mlc1016.bmx4 150 | 10.201.10.17 1.mlc1017.bmx4 151 | 10.201.10.18 1.mlc1018.bmx4 152 | 10.201.10.19 1.mlc1019.bmx4 153 | 154 | 10.201.10.20 1.mlc1020.bmx4 155 | 10.201.10.21 1.mlc1021.bmx4 156 | 10.201.10.22 1.mlc1022.bmx4 157 | 10.201.10.23 1.mlc1023.bmx4 158 | 10.201.10.24 1.mlc1024.bmx4 159 | 10.201.10.25 1.mlc1025.bmx4 160 | 10.201.10.26 1.mlc1026.bmx4 161 | 10.201.10.27 1.mlc1027.bmx4 162 | 10.201.10.28 1.mlc1028.bmx4 163 | 10.201.10.29 1.mlc1029.bmx4 164 | 165 | 10.201.10.30 1.mlc1030.bmx4 166 | 10.201.10.31 1.mlc1031.bmx4 167 | 10.201.10.32 1.mlc1032.bmx4 168 | 10.201.10.33 1.mlc1033.bmx4 169 | 10.201.10.34 1.mlc1034.bmx4 170 | 10.201.10.35 1.mlc1035.bmx4 171 | 10.201.10.36 1.mlc1036.bmx4 172 | 10.201.10.37 1.mlc1037.bmx4 173 | 10.201.10.38 1.mlc1038.bmx4 174 | 10.201.10.39 1.mlc1039.bmx4 175 | 176 | 10.201.10.40 1.mlc1040.bmx4 177 | 10.201.10.41 1.mlc1041.bmx4 178 | 10.201.10.42 1.mlc1042.bmx4 179 | 10.201.10.43 1.mlc1043.bmx4 180 | 10.201.10.44 1.mlc1044.bmx4 181 | 10.201.10.45 1.mlc1045.bmx4 182 | 10.201.10.46 1.mlc1046.bmx4 183 | 10.201.10.47 1.mlc1047.bmx4 184 | 10.201.10.48 1.mlc1048.bmx4 185 | 10.201.10.49 1.mlc1049.bmx4 186 | 187 | 10.202.10.0 2.mlc1000.bmx4 188 | 10.202.10.1 2.mlc1001.bmx4 189 | 10.202.10.2 2.mlc1002.bmx4 190 | 10.202.10.3 2.mlc1003.bmx4 191 | 10.202.10.4 2.mlc1004.bmx4 192 | 10.202.10.5 2.mlc1005.bmx4 193 | 10.202.10.6 2.mlc1006.bmx4 194 | 10.202.10.7 2.mlc1007.bmx4 195 | 10.202.10.8 2.mlc1008.bmx4 196 | 10.202.10.9 2.mlc1000.bmx4 197 | 198 | 10.202.10.10 2.mlc1010.bmx4 199 | 10.202.10.11 2.mlc1011.bmx4 200 | 10.202.10.12 2.mlc1012.bmx4 201 | 10.202.10.13 2.mlc1013.bmx4 202 | 10.202.10.14 2.mlc1014.bmx4 203 | 10.202.10.15 2.mlc1015.bmx4 204 | 10.202.10.16 2.mlc1016.bmx4 205 | 10.202.10.17 2.mlc1017.bmx4 206 | 10.202.10.18 2.mlc1018.bmx4 207 | 10.202.10.19 2.mlc1019.bmx4 208 | 209 | 10.202.10.20 2.mlc1020.bmx4 210 | 10.202.10.21 2.mlc1021.bmx4 211 | 10.202.10.22 2.mlc1022.bmx4 212 | 10.202.10.23 2.mlc1023.bmx4 213 | 10.202.10.24 2.mlc1024.bmx4 214 | 10.202.10.25 2.mlc1025.bmx4 215 | 10.202.10.26 2.mlc1026.bmx4 216 | 10.202.10.27 2.mlc1027.bmx4 217 | 10.202.10.28 2.mlc1028.bmx4 218 | 10.202.10.29 2.mlc1029.bmx4 219 | 220 | 10.202.10.30 2.mlc1030.bmx4 221 | 10.202.10.31 2.mlc1031.bmx4 222 | 10.202.10.32 2.mlc1032.bmx4 223 | 10.202.10.33 2.mlc1033.bmx4 224 | 10.202.10.34 2.mlc1034.bmx4 225 | 10.202.10.35 2.mlc1035.bmx4 226 | 10.202.10.36 2.mlc1036.bmx4 227 | 10.202.10.37 2.mlc1037.bmx4 228 | 10.202.10.38 2.mlc1038.bmx4 229 | 10.202.10.39 2.mlc1039.bmx4 230 | 231 | 10.202.10.40 2.mlc1040.bmx4 232 | 10.202.10.41 2.mlc1041.bmx4 233 | 10.202.10.42 2.mlc1042.bmx4 234 | 10.202.10.43 2.mlc1043.bmx4 235 | 10.202.10.44 2.mlc1044.bmx4 236 | 10.202.10.45 2.mlc1045.bmx4 237 | 10.202.10.46 2.mlc1046.bmx4 238 | 10.202.10.47 2.mlc1047.bmx4 239 | 10.202.10.48 2.mlc1048.bmx4 240 | 10.202.10.49 2.mlc1049.bmx4 241 | 242 | 243 | 244 | 245 | 10.41.10.0 1.mlc1000.babel4 246 | 10.41.10.1 1.mlc1001.babel4 247 | 10.41.10.2 1.mlc1002.babel4 248 | 10.41.10.3 1.mlc1003.babel4 249 | 10.41.10.4 1.mlc1004.babel4 250 | 10.41.10.5 1.mlc1005.babel4 251 | 10.41.10.6 1.mlc1006.babel4 252 | 10.41.10.7 1.mlc1007.babel4 253 | 10.41.10.8 1.mlc1008.babel4 254 | 10.41.10.9 1.mlc1000.babel4 255 | 256 | 10.41.10.10 1.mlc1010.babel4 257 | 10.41.10.11 1.mlc1011.babel4 258 | 10.41.10.12 1.mlc1012.babel4 259 | 10.41.10.13 1.mlc1013.babel4 260 | 10.41.10.14 1.mlc1014.babel4 261 | 10.41.10.15 1.mlc1015.babel4 262 | 10.41.10.16 1.mlc1016.babel4 263 | 10.41.10.17 1.mlc1017.babel4 264 | 10.41.10.18 1.mlc1018.babel4 265 | 10.41.10.19 1.mlc1019.babel4 266 | 267 | 10.41.10.20 1.mlc1020.babel4 268 | 10.41.10.21 1.mlc1021.babel4 269 | 10.41.10.22 1.mlc1022.babel4 270 | 10.41.10.23 1.mlc1023.babel4 271 | 10.41.10.24 1.mlc1024.babel4 272 | 10.41.10.25 1.mlc1025.babel4 273 | 10.41.10.26 1.mlc1026.babel4 274 | 10.41.10.27 1.mlc1027.babel4 275 | 10.41.10.28 1.mlc1028.babel4 276 | 10.41.10.29 1.mlc1029.babel4 277 | 278 | 10.41.10.30 1.mlc1030.babel4 279 | 10.41.10.31 1.mlc1031.babel4 280 | 10.41.10.32 1.mlc1032.babel4 281 | 10.41.10.33 1.mlc1033.babel4 282 | 10.41.10.34 1.mlc1034.babel4 283 | 10.41.10.35 1.mlc1035.babel4 284 | 10.41.10.36 1.mlc1036.babel4 285 | 10.41.10.37 1.mlc1037.babel4 286 | 10.41.10.38 1.mlc1038.babel4 287 | 10.41.10.39 1.mlc1039.babel4 288 | 289 | 10.41.10.40 1.mlc1040.babel4 290 | 10.41.10.41 1.mlc1041.babel4 291 | 10.41.10.42 1.mlc1042.babel4 292 | 10.41.10.43 1.mlc1043.babel4 293 | 10.41.10.44 1.mlc1044.babel4 294 | 10.41.10.45 1.mlc1045.babel4 295 | 10.41.10.46 1.mlc1046.babel4 296 | 10.41.10.47 1.mlc1047.babel4 297 | 10.41.10.48 1.mlc1048.babel4 298 | 10.41.10.49 1.mlc1049.babel4 299 | 300 | 10.41.10.0 2.mlc1000.babel4 301 | 10.41.10.1 2.mlc1001.babel4 302 | 10.41.10.2 2.mlc1002.babel4 303 | 10.41.10.3 2.mlc1003.babel4 304 | 10.41.10.4 2.mlc1004.babel4 305 | 10.41.10.5 2.mlc1005.babel4 306 | 10.41.10.6 2.mlc1006.babel4 307 | 10.41.10.7 2.mlc1007.babel4 308 | 10.41.10.8 2.mlc1008.babel4 309 | 10.41.10.9 2.mlc1000.babel4 310 | 311 | 10.41.10.10 2.mlc1010.babel4 312 | 10.41.10.11 2.mlc1011.babel4 313 | 10.41.10.12 2.mlc1012.babel4 314 | 10.41.10.13 2.mlc1013.babel4 315 | 10.41.10.14 2.mlc1014.babel4 316 | 10.41.10.15 2.mlc1015.babel4 317 | 10.41.10.16 2.mlc1016.babel4 318 | 10.41.10.17 2.mlc1017.babel4 319 | 10.41.10.18 2.mlc1018.babel4 320 | 10.41.10.19 2.mlc1019.babel4 321 | 322 | 10.41.10.20 2.mlc1020.babel4 323 | 10.41.10.21 2.mlc1021.babel4 324 | 10.41.10.22 2.mlc1022.babel4 325 | 10.41.10.23 2.mlc1023.babel4 326 | 10.41.10.24 2.mlc1024.babel4 327 | 10.41.10.25 2.mlc1025.babel4 328 | 10.41.10.26 2.mlc1026.babel4 329 | 10.41.10.27 2.mlc1027.babel4 330 | 10.41.10.28 2.mlc1028.babel4 331 | 10.41.10.29 2.mlc1029.babel4 332 | 333 | 10.41.10.30 2.mlc1030.babel4 334 | 10.41.10.31 2.mlc1031.babel4 335 | 10.41.10.32 2.mlc1032.babel4 336 | 10.41.10.33 2.mlc1033.babel4 337 | 10.41.10.34 2.mlc1034.babel4 338 | 10.41.10.35 2.mlc1035.babel4 339 | 10.41.10.36 2.mlc1036.babel4 340 | 10.41.10.37 2.mlc1037.babel4 341 | 10.41.10.38 2.mlc1038.babel4 342 | 10.41.10.39 2.mlc1039.babel4 343 | 344 | 10.41.10.40 2.mlc1040.babel4 345 | 10.41.10.41 2.mlc1041.babel4 346 | 10.41.10.42 2.mlc1042.babel4 347 | 10.41.10.43 2.mlc1043.babel4 348 | 10.41.10.44 2.mlc1044.babel4 349 | 10.41.10.45 2.mlc1045.babel4 350 | 10.41.10.46 2.mlc1046.babel4 351 | 10.41.10.47 2.mlc1047.babel4 352 | 10.41.10.48 2.mlc1048.babel4 353 | 10.41.10.49 2.mlc1049.babel4 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | fd01::a0cd:ef10:001:0:1 1.mlc1000.olsr6 368 | fd01::a0cd:ef10:101:0:1 1.mlc1001.olsr6 369 | fd01::a0cd:ef10:201:0:1 1.mlc1002.olsr6 370 | fd01::a0cd:ef10:301:0:1 1.mlc1003.olsr6 371 | fd01::a0cd:ef10:401:0:1 1.mlc1004.olsr6 372 | fd01::a0cd:ef10:501:0:1 1.mlc1005.olsr6 373 | fd01::a0cd:ef10:601:0:1 1.mlc1006.olsr6 374 | fd01::a0cd:ef10:701:0:1 1.mlc1007.olsr6 375 | fd01::a0cd:ef10:801:0:1 1.mlc1008.olsr6 376 | fd01::a0cd:ef10:901:0:1 1.mlc1009.olsr6 377 | fd01::a0cd:ef10:1001:0:1 1.mlc1010.olsr6 378 | fd01::a0cd:ef10:1101:0:1 1.mlc1011.olsr6 379 | fd01::a0cd:ef10:1201:0:1 1.mlc1012.olsr6 380 | fd01::a0cd:ef10:1301:0:1 1.mlc1013.olsr6 381 | fd01::a0cd:ef10:1401:0:1 1.mlc1014.olsr6 382 | fd01::a0cd:ef10:1501:0:1 1.mlc1015.olsr6 383 | fd01::a0cd:ef10:1601:0:1 1.mlc1016.olsr6 384 | fd01::a0cd:ef10:1701:0:1 1.mlc1017.olsr6 385 | fd01::a0cd:ef10:1801:0:1 1.mlc1018.olsr6 386 | fd01::a0cd:ef10:1901:0:1 1.mlc1019.olsr6 387 | fd01::a0cd:ef10:2001:0:1 1.mlc1020.olsr6 388 | fd01::a0cd:ef10:2101:0:1 1.mlc1021.olsr6 389 | fd01::a0cd:ef10:2201:0:1 1.mlc1022.olsr6 390 | fd01::a0cd:ef10:2301:0:1 1.mlc1023.olsr6 391 | fd01::a0cd:ef10:2401:0:1 1.mlc1024.olsr6 392 | fd01::a0cd:ef10:2501:0:1 1.mlc1025.olsr6 393 | fd01::a0cd:ef10:2601:0:1 1.mlc1026.olsr6 394 | fd01::a0cd:ef10:2701:0:1 1.mlc1027.olsr6 395 | fd01::a0cd:ef10:2801:0:1 1.mlc1028.olsr6 396 | fd01::a0cd:ef10:2901:0:1 1.mlc1029.olsr6 397 | fd01::a0cd:ef10:3001:0:1 1.mlc1030.olsr6 398 | fd01::a0cd:ef10:3101:0:1 1.mlc1031.olsr6 399 | fd01::a0cd:ef10:3201:0:1 1.mlc1032.olsr6 400 | fd01::a0cd:ef10:3301:0:1 1.mlc1033.olsr6 401 | fd01::a0cd:ef10:3401:0:1 1.mlc1034.olsr6 402 | fd01::a0cd:ef10:3501:0:1 1.mlc1035.olsr6 403 | fd01::a0cd:ef10:3601:0:1 1.mlc1036.olsr6 404 | fd01::a0cd:ef10:3701:0:1 1.mlc1037.olsr6 405 | fd01::a0cd:ef10:3801:0:1 1.mlc1038.olsr6 406 | fd01::a0cd:ef10:3901:0:1 1.mlc1039.olsr6 407 | fd01::a0cd:ef10:4001:0:1 1.mlc1040.olsr6 408 | fd01::a0cd:ef10:4101:0:1 1.mlc1041.olsr6 409 | fd01::a0cd:ef10:4201:0:1 1.mlc1042.olsr6 410 | fd01::a0cd:ef10:4301:0:1 1.mlc1043.olsr6 411 | fd01::a0cd:ef10:4401:0:1 1.mlc1044.olsr6 412 | fd01::a0cd:ef10:4501:0:1 1.mlc1045.olsr6 413 | fd01::a0cd:ef10:4601:0:1 1.mlc1046.olsr6 414 | fd01::a0cd:ef10:4701:0:1 1.mlc1047.olsr6 415 | fd01::a0cd:ef10:4801:0:1 1.mlc1048.olsr6 416 | fd01::a0cd:ef10:4901:0:1 1.mlc1049.olsr6 417 | 418 | fd01::a0cd:ef10:002:0:1 2.mlc1000.olsr6 419 | fd01::a0cd:ef10:102:0:1 2.mlc1001.olsr6 420 | fd01::a0cd:ef10:202:0:1 2.mlc1002.olsr6 421 | fd01::a0cd:ef10:302:0:1 2.mlc1003.olsr6 422 | fd01::a0cd:ef10:402:0:1 2.mlc1004.olsr6 423 | fd01::a0cd:ef10:502:0:1 2.mlc1005.olsr6 424 | fd01::a0cd:ef10:602:0:1 2.mlc1006.olsr6 425 | fd01::a0cd:ef10:702:0:1 2.mlc1007.olsr6 426 | fd01::a0cd:ef10:802:0:1 2.mlc1008.olsr6 427 | fd01::a0cd:ef10:902:0:1 2.mlc1009.olsr6 428 | fd01::a0cd:ef10:1002:0:1 2.mlc1010.olsr6 429 | fd01::a0cd:ef10:1102:0:1 2.mlc1011.olsr6 430 | fd01::a0cd:ef10:1202:0:1 2.mlc1012.olsr6 431 | fd01::a0cd:ef10:1302:0:1 2.mlc1013.olsr6 432 | fd01::a0cd:ef10:1402:0:1 2.mlc1014.olsr6 433 | fd01::a0cd:ef10:1502:0:1 2.mlc1015.olsr6 434 | fd01::a0cd:ef10:1602:0:1 2.mlc1016.olsr6 435 | fd01::a0cd:ef10:1702:0:1 2.mlc1017.olsr6 436 | fd01::a0cd:ef10:1802:0:1 2.mlc1018.olsr6 437 | fd01::a0cd:ef10:1902:0:1 2.mlc1019.olsr6 438 | fd01::a0cd:ef10:2002:0:1 2.mlc1020.olsr6 439 | fd01::a0cd:ef10:2102:0:1 2.mlc1021.olsr6 440 | fd01::a0cd:ef10:2202:0:1 2.mlc1022.olsr6 441 | fd01::a0cd:ef10:2302:0:1 2.mlc1023.olsr6 442 | fd01::a0cd:ef10:2402:0:1 2.mlc1024.olsr6 443 | fd01::a0cd:ef10:2502:0:1 2.mlc1025.olsr6 444 | fd01::a0cd:ef10:2602:0:1 2.mlc1026.olsr6 445 | fd01::a0cd:ef10:2702:0:1 2.mlc1027.olsr6 446 | fd01::a0cd:ef10:2802:0:1 2.mlc1028.olsr6 447 | fd01::a0cd:ef10:2902:0:1 2.mlc1029.olsr6 448 | fd01::a0cd:ef10:3002:0:1 2.mlc1030.olsr6 449 | fd01::a0cd:ef10:3102:0:1 2.mlc1031.olsr6 450 | fd01::a0cd:ef10:3202:0:1 2.mlc1032.olsr6 451 | fd01::a0cd:ef10:3302:0:1 2.mlc1033.olsr6 452 | fd01::a0cd:ef10:3402:0:1 2.mlc1034.olsr6 453 | fd01::a0cd:ef10:3502:0:1 2.mlc1035.olsr6 454 | fd01::a0cd:ef10:3602:0:1 2.mlc1036.olsr6 455 | fd01::a0cd:ef10:3702:0:1 2.mlc1037.olsr6 456 | fd01::a0cd:ef10:3802:0:1 2.mlc1038.olsr6 457 | fd01::a0cd:ef10:3902:0:1 2.mlc1039.olsr6 458 | fd01::a0cd:ef10:4002:0:1 2.mlc1040.olsr6 459 | fd01::a0cd:ef10:4102:0:1 2.mlc1041.olsr6 460 | fd01::a0cd:ef10:4202:0:1 2.mlc1042.olsr6 461 | fd01::a0cd:ef10:4302:0:1 2.mlc1043.olsr6 462 | fd01::a0cd:ef10:4402:0:1 2.mlc1044.olsr6 463 | fd01::a0cd:ef10:4502:0:1 2.mlc1045.olsr6 464 | fd01::a0cd:ef10:4602:0:1 2.mlc1046.olsr6 465 | fd01::a0cd:ef10:4702:0:1 2.mlc1047.olsr6 466 | fd01::a0cd:ef10:4802:0:1 2.mlc1048.olsr6 467 | fd01::a0cd:ef10:4902:0:1 2.mlc1049.olsr6 468 | 469 | fd02::a0cd:ef10:001:0:1 1.mlc1000.bmx6 470 | fd02::a0cd:ef10:101:0:1 1.mlc1001.bmx6 471 | fd02::a0cd:ef10:201:0:1 1.mlc1002.bmx6 472 | fd02::a0cd:ef10:301:0:1 1.mlc1003.bmx6 473 | fd02::a0cd:ef10:401:0:1 1.mlc1004.bmx6 474 | fd02::a0cd:ef10:501:0:1 1.mlc1005.bmx6 475 | fd02::a0cd:ef10:601:0:1 1.mlc1006.bmx6 476 | fd02::a0cd:ef10:701:0:1 1.mlc1007.bmx6 477 | fd02::a0cd:ef10:801:0:1 1.mlc1008.bmx6 478 | fd02::a0cd:ef10:901:0:1 1.mlc1009.bmx6 479 | fd02::a0cd:ef10:1001:0:1 1.mlc1010.bmx6 480 | fd02::a0cd:ef10:1101:0:1 1.mlc1011.bmx6 481 | fd02::a0cd:ef10:1201:0:1 1.mlc1012.bmx6 482 | fd02::a0cd:ef10:1301:0:1 1.mlc1013.bmx6 483 | fd02::a0cd:ef10:1401:0:1 1.mlc1014.bmx6 484 | fd02::a0cd:ef10:1501:0:1 1.mlc1015.bmx6 485 | fd02::a0cd:ef10:1601:0:1 1.mlc1016.bmx6 486 | fd02::a0cd:ef10:1701:0:1 1.mlc1017.bmx6 487 | fd02::a0cd:ef10:1801:0:1 1.mlc1018.bmx6 488 | fd02::a0cd:ef10:1901:0:1 1.mlc1019.bmx6 489 | fd02::a0cd:ef10:2001:0:1 1.mlc1020.bmx6 490 | fd02::a0cd:ef10:2101:0:1 1.mlc1021.bmx6 491 | fd02::a0cd:ef10:2201:0:1 1.mlc1022.bmx6 492 | fd02::a0cd:ef10:2301:0:1 1.mlc1023.bmx6 493 | fd02::a0cd:ef10:2401:0:1 1.mlc1024.bmx6 494 | fd02::a0cd:ef10:2501:0:1 1.mlc1025.bmx6 495 | fd02::a0cd:ef10:2601:0:1 1.mlc1026.bmx6 496 | fd02::a0cd:ef10:2701:0:1 1.mlc1027.bmx6 497 | fd02::a0cd:ef10:2801:0:1 1.mlc1028.bmx6 498 | fd02::a0cd:ef10:2901:0:1 1.mlc1029.bmx6 499 | fd02::a0cd:ef10:3001:0:1 1.mlc1030.bmx6 500 | fd02::a0cd:ef10:3101:0:1 1.mlc1031.bmx6 501 | fd02::a0cd:ef10:3201:0:1 1.mlc1032.bmx6 502 | fd02::a0cd:ef10:3301:0:1 1.mlc1033.bmx6 503 | fd02::a0cd:ef10:3401:0:1 1.mlc1034.bmx6 504 | fd02::a0cd:ef10:3501:0:1 1.mlc1035.bmx6 505 | fd02::a0cd:ef10:3601:0:1 1.mlc1036.bmx6 506 | fd02::a0cd:ef10:3701:0:1 1.mlc1037.bmx6 507 | fd02::a0cd:ef10:3801:0:1 1.mlc1038.bmx6 508 | fd02::a0cd:ef10:3901:0:1 1.mlc1039.bmx6 509 | fd02::a0cd:ef10:4001:0:1 1.mlc1040.bmx6 510 | fd02::a0cd:ef10:4101:0:1 1.mlc1041.bmx6 511 | fd02::a0cd:ef10:4201:0:1 1.mlc1042.bmx6 512 | fd02::a0cd:ef10:4301:0:1 1.mlc1043.bmx6 513 | fd02::a0cd:ef10:4401:0:1 1.mlc1044.bmx6 514 | fd02::a0cd:ef10:4501:0:1 1.mlc1045.bmx6 515 | fd02::a0cd:ef10:4601:0:1 1.mlc1046.bmx6 516 | fd02::a0cd:ef10:4701:0:1 1.mlc1047.bmx6 517 | fd02::a0cd:ef10:4801:0:1 1.mlc1048.bmx6 518 | fd02::a0cd:ef10:4901:0:1 1.mlc1049.bmx6 519 | 520 | fd02::a0cd:ef10:002:0:1 2.mlc1000.bmx6 521 | fd02::a0cd:ef10:102:0:1 2.mlc1001.bmx6 522 | fd02::a0cd:ef10:202:0:1 2.mlc1002.bmx6 523 | fd02::a0cd:ef10:302:0:1 2.mlc1003.bmx6 524 | fd02::a0cd:ef10:402:0:1 2.mlc1004.bmx6 525 | fd02::a0cd:ef10:502:0:1 2.mlc1005.bmx6 526 | fd02::a0cd:ef10:602:0:1 2.mlc1006.bmx6 527 | fd02::a0cd:ef10:702:0:1 2.mlc1007.bmx6 528 | fd02::a0cd:ef10:802:0:1 2.mlc1008.bmx6 529 | fd02::a0cd:ef10:902:0:1 2.mlc1009.bmx6 530 | fd02::a0cd:ef10:1002:0:1 2.mlc1010.bmx6 531 | fd02::a0cd:ef10:1102:0:1 2.mlc1011.bmx6 532 | fd02::a0cd:ef10:1202:0:1 2.mlc1012.bmx6 533 | fd02::a0cd:ef10:1302:0:1 2.mlc1013.bmx6 534 | fd02::a0cd:ef10:1402:0:1 2.mlc1014.bmx6 535 | fd02::a0cd:ef10:1502:0:1 2.mlc1015.bmx6 536 | fd02::a0cd:ef10:1602:0:1 2.mlc1016.bmx6 537 | fd02::a0cd:ef10:1702:0:1 2.mlc1017.bmx6 538 | fd02::a0cd:ef10:1802:0:1 2.mlc1018.bmx6 539 | fd02::a0cd:ef10:1902:0:1 2.mlc1019.bmx6 540 | fd02::a0cd:ef10:2002:0:1 2.mlc1020.bmx6 541 | fd02::a0cd:ef10:2102:0:1 2.mlc1021.bmx6 542 | fd02::a0cd:ef10:2202:0:1 2.mlc1022.bmx6 543 | fd02::a0cd:ef10:2302:0:1 2.mlc1023.bmx6 544 | fd02::a0cd:ef10:2402:0:1 2.mlc1024.bmx6 545 | fd02::a0cd:ef10:2502:0:1 2.mlc1025.bmx6 546 | fd02::a0cd:ef10:2602:0:1 2.mlc1026.bmx6 547 | fd02::a0cd:ef10:2702:0:1 2.mlc1027.bmx6 548 | fd02::a0cd:ef10:2802:0:1 2.mlc1028.bmx6 549 | fd02::a0cd:ef10:2902:0:1 2.mlc1029.bmx6 550 | fd02::a0cd:ef10:3002:0:1 2.mlc1030.bmx6 551 | fd02::a0cd:ef10:3102:0:1 2.mlc1031.bmx6 552 | fd02::a0cd:ef10:3202:0:1 2.mlc1032.bmx6 553 | fd02::a0cd:ef10:3302:0:1 2.mlc1033.bmx6 554 | fd02::a0cd:ef10:3402:0:1 2.mlc1034.bmx6 555 | fd02::a0cd:ef10:3502:0:1 2.mlc1035.bmx6 556 | fd02::a0cd:ef10:3602:0:1 2.mlc1036.bmx6 557 | fd02::a0cd:ef10:3702:0:1 2.mlc1037.bmx6 558 | fd02::a0cd:ef10:3802:0:1 2.mlc1038.bmx6 559 | fd02::a0cd:ef10:3902:0:1 2.mlc1039.bmx6 560 | fd02::a0cd:ef10:4002:0:1 2.mlc1040.bmx6 561 | fd02::a0cd:ef10:4102:0:1 2.mlc1041.bmx6 562 | fd02::a0cd:ef10:4202:0:1 2.mlc1042.bmx6 563 | fd02::a0cd:ef10:4302:0:1 2.mlc1043.bmx6 564 | fd02::a0cd:ef10:4402:0:1 2.mlc1044.bmx6 565 | fd02::a0cd:ef10:4502:0:1 2.mlc1045.bmx6 566 | fd02::a0cd:ef10:4602:0:1 2.mlc1046.bmx6 567 | fd02::a0cd:ef10:4702:0:1 2.mlc1047.bmx6 568 | fd02::a0cd:ef10:4802:0:1 2.mlc1048.bmx6 569 | fd02::a0cd:ef10:4902:0:1 2.mlc1049.bmx6 570 | 571 | fd03::a0cd:ef10:001:0:1 1.mlc1000.babel6 572 | fd03::a0cd:ef10:101:0:1 1.mlc1001.babel6 573 | fd03::a0cd:ef10:201:0:1 1.mlc1002.babel6 574 | fd03::a0cd:ef10:301:0:1 1.mlc1003.babel6 575 | fd03::a0cd:ef10:401:0:1 1.mlc1004.babel6 576 | fd03::a0cd:ef10:501:0:1 1.mlc1005.babel6 577 | fd03::a0cd:ef10:601:0:1 1.mlc1006.babel6 578 | fd03::a0cd:ef10:701:0:1 1.mlc1007.babel6 579 | fd03::a0cd:ef10:801:0:1 1.mlc1008.babel6 580 | fd03::a0cd:ef10:901:0:1 1.mlc1009.babel6 581 | fd03::a0cd:ef10:1001:0:1 1.mlc1010.babel6 582 | fd03::a0cd:ef10:1101:0:1 1.mlc1011.babel6 583 | fd03::a0cd:ef10:1201:0:1 1.mlc1012.babel6 584 | fd03::a0cd:ef10:1301:0:1 1.mlc1013.babel6 585 | fd03::a0cd:ef10:1401:0:1 1.mlc1014.babel6 586 | fd03::a0cd:ef10:1501:0:1 1.mlc1015.babel6 587 | fd03::a0cd:ef10:1601:0:1 1.mlc1016.babel6 588 | fd03::a0cd:ef10:1701:0:1 1.mlc1017.babel6 589 | fd03::a0cd:ef10:1801:0:1 1.mlc1018.babel6 590 | fd03::a0cd:ef10:1901:0:1 1.mlc1019.babel6 591 | fd03::a0cd:ef10:2001:0:1 1.mlc1020.babel6 592 | fd03::a0cd:ef10:2101:0:1 1.mlc1021.babel6 593 | fd03::a0cd:ef10:2201:0:1 1.mlc1022.babel6 594 | fd03::a0cd:ef10:2301:0:1 1.mlc1023.babel6 595 | fd03::a0cd:ef10:2401:0:1 1.mlc1024.babel6 596 | fd03::a0cd:ef10:2501:0:1 1.mlc1025.babel6 597 | fd03::a0cd:ef10:2601:0:1 1.mlc1026.babel6 598 | fd03::a0cd:ef10:2701:0:1 1.mlc1027.babel6 599 | fd03::a0cd:ef10:2801:0:1 1.mlc1028.babel6 600 | fd03::a0cd:ef10:2901:0:1 1.mlc1029.babel6 601 | fd03::a0cd:ef10:3001:0:1 1.mlc1030.babel6 602 | fd03::a0cd:ef10:3101:0:1 1.mlc1031.babel6 603 | fd03::a0cd:ef10:3201:0:1 1.mlc1032.babel6 604 | fd03::a0cd:ef10:3301:0:1 1.mlc1033.babel6 605 | fd03::a0cd:ef10:3401:0:1 1.mlc1034.babel6 606 | fd03::a0cd:ef10:3501:0:1 1.mlc1035.babel6 607 | fd03::a0cd:ef10:3601:0:1 1.mlc1036.babel6 608 | fd03::a0cd:ef10:3701:0:1 1.mlc1037.babel6 609 | fd03::a0cd:ef10:3801:0:1 1.mlc1038.babel6 610 | fd03::a0cd:ef10:3901:0:1 1.mlc1039.babel6 611 | fd03::a0cd:ef10:4001:0:1 1.mlc1040.babel6 612 | fd03::a0cd:ef10:4101:0:1 1.mlc1041.babel6 613 | fd03::a0cd:ef10:4201:0:1 1.mlc1042.babel6 614 | fd03::a0cd:ef10:4301:0:1 1.mlc1043.babel6 615 | fd03::a0cd:ef10:4401:0:1 1.mlc1044.babel6 616 | fd03::a0cd:ef10:4501:0:1 1.mlc1045.babel6 617 | fd03::a0cd:ef10:4601:0:1 1.mlc1046.babel6 618 | fd03::a0cd:ef10:4701:0:1 1.mlc1047.babel6 619 | fd03::a0cd:ef10:4801:0:1 1.mlc1048.babel6 620 | fd03::a0cd:ef10:4901:0:1 1.mlc1049.babel6 621 | 622 | fd03::a0cd:ef10:002:0:1 2.mlc1000.babel6 623 | fd03::a0cd:ef10:102:0:1 2.mlc1001.babel6 624 | fd03::a0cd:ef10:202:0:1 2.mlc1002.babel6 625 | fd03::a0cd:ef10:302:0:1 2.mlc1003.babel6 626 | fd03::a0cd:ef10:402:0:1 2.mlc1004.babel6 627 | fd03::a0cd:ef10:502:0:1 2.mlc1005.babel6 628 | fd03::a0cd:ef10:602:0:1 2.mlc1006.babel6 629 | fd03::a0cd:ef10:702:0:1 2.mlc1007.babel6 630 | fd03::a0cd:ef10:802:0:1 2.mlc1008.babel6 631 | fd03::a0cd:ef10:902:0:1 2.mlc1009.babel6 632 | fd03::a0cd:ef10:1002:0:1 2.mlc1010.babel6 633 | fd03::a0cd:ef10:1102:0:1 2.mlc1011.babel6 634 | fd03::a0cd:ef10:1202:0:1 2.mlc1012.babel6 635 | fd03::a0cd:ef10:1302:0:1 2.mlc1013.babel6 636 | fd03::a0cd:ef10:1402:0:1 2.mlc1014.babel6 637 | fd03::a0cd:ef10:1502:0:1 2.mlc1015.babel6 638 | fd03::a0cd:ef10:1602:0:1 2.mlc1016.babel6 639 | fd03::a0cd:ef10:1702:0:1 2.mlc1017.babel6 640 | fd03::a0cd:ef10:1802:0:1 2.mlc1018.babel6 641 | fd03::a0cd:ef10:1902:0:1 2.mlc1019.babel6 642 | fd03::a0cd:ef10:2002:0:1 2.mlc1020.babel6 643 | fd03::a0cd:ef10:2102:0:1 2.mlc1021.babel6 644 | fd03::a0cd:ef10:2202:0:1 2.mlc1022.babel6 645 | fd03::a0cd:ef10:2302:0:1 2.mlc1023.babel6 646 | fd03::a0cd:ef10:2402:0:1 2.mlc1024.babel6 647 | fd03::a0cd:ef10:2502:0:1 2.mlc1025.babel6 648 | fd03::a0cd:ef10:2602:0:1 2.mlc1026.babel6 649 | fd03::a0cd:ef10:2702:0:1 2.mlc1027.babel6 650 | fd03::a0cd:ef10:2802:0:1 2.mlc1028.babel6 651 | fd03::a0cd:ef10:2902:0:1 2.mlc1029.babel6 652 | fd03::a0cd:ef10:3002:0:1 2.mlc1030.babel6 653 | fd03::a0cd:ef10:3102:0:1 2.mlc1031.babel6 654 | fd03::a0cd:ef10:3202:0:1 2.mlc1032.babel6 655 | fd03::a0cd:ef10:3302:0:1 2.mlc1033.babel6 656 | fd03::a0cd:ef10:3402:0:1 2.mlc1034.babel6 657 | fd03::a0cd:ef10:3502:0:1 2.mlc1035.babel6 658 | fd03::a0cd:ef10:3602:0:1 2.mlc1036.babel6 659 | fd03::a0cd:ef10:3702:0:1 2.mlc1037.babel6 660 | fd03::a0cd:ef10:3802:0:1 2.mlc1038.babel6 661 | fd03::a0cd:ef10:3902:0:1 2.mlc1039.babel6 662 | fd03::a0cd:ef10:4002:0:1 2.mlc1040.babel6 663 | fd03::a0cd:ef10:4102:0:1 2.mlc1041.babel6 664 | fd03::a0cd:ef10:4202:0:1 2.mlc1042.babel6 665 | fd03::a0cd:ef10:4302:0:1 2.mlc1043.babel6 666 | fd03::a0cd:ef10:4402:0:1 2.mlc1044.babel6 667 | fd03::a0cd:ef10:4502:0:1 2.mlc1045.babel6 668 | fd03::a0cd:ef10:4602:0:1 2.mlc1046.babel6 669 | fd03::a0cd:ef10:4702:0:1 2.mlc1047.babel6 670 | fd03::a0cd:ef10:4802:0:1 2.mlc1048.babel6 671 | fd03::a0cd:ef10:4902:0:1 2.mlc1049.babel6 672 | -------------------------------------------------------------------------------- /files/etc/mini-httpd.conf: -------------------------------------------------------------------------------- 1 | # Example config for mini_httpd. 2 | # Author: Marvin Stark 3 | 4 | # Uncomment this line for turning on ssl support. 5 | #ssl 6 | 7 | # On which host mini_httpd should bind? 8 | #host=localhost 9 | 10 | # On which port mini_httpd should listen? 11 | port=80 12 | 13 | # Which user mini_httpd should use? 14 | user=nobody 15 | 16 | # Run in chroot mode? 17 | #chroot # yes 18 | nochroot # no 19 | 20 | # Working directory of mini_httpd. 21 | #dir= 22 | 23 | # We are the web files stored? 24 | # Please change this to your needs. 25 | # data_dir=/usr/share/mini-httpd/html 26 | data_dir=/var/www 27 | 28 | # CGI path 29 | cgipat=cgi-bin/* 30 | 31 | # Which certificate to use? 32 | #certfile= 33 | 34 | # Which logfile to use? 35 | logfile=/var/log/mini-httpd.log 36 | 37 | # Which pidfile to use? 38 | pidfile=/var/run/mini-httpd.pid 39 | 40 | # Which charset to use? 41 | charset=iso-8859-1 42 | -------------------------------------------------------------------------------- /files/etc/olsrd.conf: -------------------------------------------------------------------------------- 1 | # 2 | # OLSR.org routing daemon config file 3 | # This file contains the usual options for an ETX based 4 | # stationary network without fisheye 5 | # (for other options see olsrd.conf.default.full) 6 | # 7 | # Lines starting with a # are discarded 8 | # 9 | 10 | #### ATTENTION for IPv6 users #### 11 | # Because of limitations in the parser IPv6 addresses must NOT 12 | # begin with a ":", so please add a "0" as a prefix. 13 | 14 | ########################### 15 | ### Basic configuration ### 16 | ########################### 17 | # keep this settings at the beginning of your first configuration file 18 | 19 | # Debug level (0-9) 20 | # If set to 0 the daemon runs in the background, unless "NoFork" is set to true 21 | # (Default is 1) 22 | 23 | # DebugLevel 1 24 | 25 | # IP version to use (4 or 6) 26 | # (Default is 4) 27 | 28 | IpVersion 6 29 | 30 | ################################# 31 | ### OLSRd agent configuration ### 32 | ################################# 33 | # this parameters control the settings of the routing agent which are not 34 | # related to the OLSR protocol and it's extensions 35 | 36 | # FIBMetric controls the metric value of the host-routes OLSRd sets. 37 | # - "flat" means that the metric value is always 2. This is the preferred value 38 | # because it helps the linux kernel routing to clean up older routes 39 | # - "correct" use the hopcount as the metric value. 40 | # - "approx" use the hopcount as the metric value too, but does only update the 41 | # hopcount if the nexthop changes too 42 | # (Default is "flat") 43 | 44 | # FIBMetric "flat" 45 | 46 | ####################################### 47 | ### Linux specific OLSRd extensions ### 48 | ####################################### 49 | # these parameters are only working on linux at the moment, but might become 50 | # useful on BSD in the future 51 | 52 | # SrcIpRoutes tells OLSRd to set the Src flag of host routes to the originator-ip 53 | # of the node. In addition to this an additional localhost device is created 54 | # to make sure the returning traffic can be received. 55 | # (Default is "no") 56 | 57 | # SrcIpRoutes no 58 | 59 | # Specify the proto tag to be used for routes olsr inserts into kernel 60 | # currently only implemented for linux 61 | # valid values under linux are 1 .. 254 62 | # 1 gets remapped by olsrd to 0 UNSPECIFIED (1 is reserved for ICMP redirects) 63 | # 2 KERNEL routes (not very wise to use) 64 | # 3 BOOT (should in fact not be used by routing daemons) 65 | # 4 STATIC 66 | # 8 .. 15 various routing daemons (gated, zebra, bird, & co) 67 | # (defaults to 0 which gets replaced by an OS-specific default value 68 | # under linux 3 (BOOT) (for backward compatibility) 69 | 70 | # RtProto 0 71 | 72 | # Activates (in IPv6 mode) the automatic use of NIIT 73 | # (see README-Olsr-Extensions) 74 | # (default is "yes") 75 | 76 | # UseNiit yes 77 | 78 | # Activates the smartgateway ipip tunnel feature. 79 | # See README-Olsr-Extensions for a description of smartgateways. 80 | # (default is "yes") 81 | 82 | # SmartGateway yes 83 | 84 | # Allows the selection of a smartgateway with NAT (only for IPv4) 85 | # (default is "yes") 86 | 87 | # SmartGatewayAllowNAT yes 88 | 89 | # Defines what kind of Uplink this node will publish as a 90 | # smartgateway. The existence of the uplink is detected by 91 | # a route to 0.0.0.0/0, ::ffff:0:0/96 and/or 2000::/3. 92 | # possible values are "none", "ipv4", "ipv6", "both" 93 | # (default is "both") 94 | 95 | # SmartGatewayUplink "both" 96 | 97 | # Specifies if the local ipv4 uplink use NAT 98 | # (default is "yes") 99 | 100 | # SmartGatewayUplinkNAT yes 101 | 102 | # Specifies the speed of the uplink in kilobit/s. 103 | # First parameter is upstream, second parameter is downstream 104 | # (default is 128/1024) 105 | 106 | # SmartGatewaySpeed 128 1024 107 | 108 | # Specifies the EXTERNAL ipv6 prefix of the uplink. A prefix 109 | # length of more than 64 is not allowed. 110 | # (default is 0::/0 111 | 112 | # SmartGatewayPrefix 0::/0 113 | 114 | ############################## 115 | ### OLSR protocol settings ### 116 | ############################## 117 | 118 | # HNA (Host network association) allows the OLSR to announce 119 | # additional IPs or IP subnets to the net that are reachable 120 | # through this node. 121 | # Syntax for HNA4 is "network-address network-mask" 122 | # Syntax for HNA6 is "network-address prefix-length" 123 | # (default is no HNA) 124 | Hna4 125 | { 126 | # Internet gateway 127 | # 0.0.0.0 0.0.0.0 128 | # specific small networks reachable through this node 129 | # 15.15.0.0 255.255.255.0 130 | } 131 | Hna6 132 | { 133 | # Internet gateway 134 | # 0:: 0 135 | # specific small networks reachable through this node 136 | # fec0:2200:106:0:0:0:0:0 48 137 | } 138 | 139 | ################################ 140 | ### OLSR protocol extensions ### 141 | ################################ 142 | 143 | # Link quality algorithm (only for lq level 2) 144 | # (see README-Olsr-Extensions) 145 | # - "etx_float", a floating point ETX with exponential aging 146 | # - "etx_fpm", same as ext_float, but with integer arithmetic 147 | # - "etx_ff" (ETX freifunk), an etx variant which use all OLSR 148 | # traffic (instead of only hellos) for ETX calculation 149 | # - "etx_ffeth", an incompatible variant of etx_ff that allows 150 | # ethernet links with ETX 0.1. 151 | # (defaults to "etx_ff") 152 | 153 | # LinkQualityAlgorithm "etx_ff" 154 | 155 | # Fisheye mechanism for TCs (0 meansoff, 1 means on) 156 | # (default is 1) 157 | 158 | LinkQualityFishEye 0 159 | 160 | ##################################### 161 | ### Example plugin configurations ### 162 | ##################################### 163 | # Olsrd plugins to load 164 | # This must be the absolute path to the file 165 | # or the loader will use the following scheme: 166 | # - Try the paths in the LD_LIBRARY_PATH 167 | # environment variable. 168 | # - The list of libraries cached in /etc/ld.so.cache 169 | # - /lib, followed by /usr/lib 170 | # 171 | # the examples in this list are for linux, so check if the plugin is 172 | # available if you use windows/BSD. 173 | # each plugin should have a README file in it's lib subfolder 174 | 175 | # LoadPlugin "olsrd_txtinfo.dll" 176 | LoadPlugin "olsrd_txtinfo.so.0.1" 177 | { 178 | # port number the txtinfo plugin will be listening, default 2006 179 | # PlParam "port" "81" 180 | # ip address that can access the plugin, use "0.0.0.0" 181 | # to allow everyone 182 | # PlParam "Accept" "127.0.0.1" 183 | } 184 | 185 | ############################################# 186 | ### OLSRD default interface configuration ### 187 | ############################################# 188 | # the default interface section can have the same values as the following 189 | # interface configuration. It will allow you so set common options for all 190 | # interfaces. 191 | 192 | InterfaceDefaults { 193 | # Ip4Broadcast 255.255.255.255 194 | } 195 | 196 | ###################################### 197 | ### OLSRd Interfaces configuration ### 198 | ###################################### 199 | # multiple interfaces can be specified for a single configuration block 200 | # multiple configuration blocks can be specified 201 | 202 | # WARNING, don't forget to insert your interface names here ! 203 | #Interface "eth1" "eth2" "eth3" 204 | Interface "eth3:4" 205 | { 206 | # Interface Mode is used to prevent unnecessary 207 | # packet forwarding on switched ethernet interfaces 208 | # valid Modes are "mesh" and "ether" 209 | # (default is "mesh") 210 | 211 | # robert uni 212 | # Mode "ether" 213 | # HelloInterval 6.0 214 | # HelloValidityTime 600.0 215 | # TcInterval 0.5 216 | # TcValidityTime 300.0 217 | # MidInterval 10.0 218 | # MidValidityTime 300.0 219 | # HnaInterval 10.0 220 | # HnaValidityTime 300.0 221 | 222 | # freifunk 223 | # HelloInterval 3.0 224 | # HelloValidityTime 125.0 225 | # MidInterval 25.0 226 | # MidValidityTime 500.0 227 | # HnaInterval 10.0 228 | # HnaValidityTime 125.0 229 | } 230 | -------------------------------------------------------------------------------- /files/var/www/cgi-bin/example.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | cat << EOF 3 | Content-Type: text/html 4 | 5 | 6 | 7 | cgi shell scripting example 8 | 9 | 10 |

Stats for this computer

11 | EOF 12 | echo Date: $(date) "
" 13 | echo Uptime: $(uptime) "
" 14 | cat << EOF 15 | 16 | 17 | EOF 18 | -------------------------------------------------------------------------------- /files/var/www/cgi-bin/zero: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | echo "Content-type: application/octet-stream" 3 | echo 4 | cat /dev/zero 5 | -------------------------------------------------------------------------------- /mlc-create-owrt-mother.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # set -x 3 | 4 | 5 | # Copyright (c) 2011 Axel Neumann 6 | # This program is free software; you can redistribute it and/or 7 | # modify it under the terms of version 2 of the GNU General Public 8 | # License as published by the Free Software Foundation. 9 | # 10 | # This program is distributed in the hope that it will be useful, but 11 | # WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 | # General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU General Public License 16 | # along with this program; if not, write to the Free Software 17 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 18 | # 02110-1301, USA 19 | 20 | 21 | # WARNING: 22 | # This package requires root priveleges and may have bugs that format your hard disk!!!! 23 | # Use on your own risk! It is highly recommended to use provided scripts ONLY in 24 | # a completely isolated environment like qemu or virtual box 25 | 26 | 27 | 28 | if [ -f ./mlc-vars.sh ] ; then 29 | . ./mlc-vars.sh 30 | else 31 | echo "could not find mlc-vars.sh in $(pwd)"; exit 1 32 | fi 33 | 34 | mother_name="${mlc_name_prefix}${mlc_mother_id}" 35 | 36 | mother_config="$mlc_conf_dir/$mother_name" 37 | mother_rootfs="$mlc_conf_dir/$mother_name/rootfs" 38 | 39 | MLC_assign_networks $mlc_mother_id 40 | 41 | echo "input returned $? and mlc_conf_dir=$mlc_conf_dir mother_name=$mother_name" 42 | 43 | printf "\n" 44 | printf "creating %s in %s\n" $mother_name $mother_config 45 | 46 | [ -d ] $mother_config.old.old && rm -rf $mother_config.old.old 47 | [ -d ] $mother_config.old && mv $mother_config.old $mother_config.old.old 48 | [ -d ] $mother_config && mv $mother_config $mother_config.old 49 | 50 | mkdir -p $mother_config $mother_rootfs 51 | 52 | tar -C $mother_rootfs -xzvf $mlc_owrt_fs_tgz 53 | 54 | cat < $mother_rootfs/etc/inittab 55 | ::sysinit:/etc/init.d/rcS S boot 56 | ::shutdown:/etc/init.d/rcS K stop 57 | console::askfirst:/bin/ash --login 58 | #tts/0::askfirst:/bin/ash --login 59 | #ttyS0::askfirst:/bin/ash --login 60 | tty1::askfirst:/bin/ash --login 61 | tty2::askfirst:/bin/ash --login 62 | tty3::askfirst:/bin/ash --login 63 | tty4::askfirst:/bin/ash --login 64 | EOF 65 | 66 | 67 | MLC_create_lxc_config $mother_rootfs $mother_config 68 | 69 | echo "finished" 70 | -------------------------------------------------------------------------------- /mlc-help.txt: -------------------------------------------------------------------------------- 1 | 2 | THIS file contains some configuration examples for copy and paster. 3 | Only use them if you know what they are doing. 4 | 5 | read HOWTO first ! 6 | 7 | . ./mlc-vars.sh 8 | 9 | ./mlc-init-host.sh 10 | 11 | 12 | mlc_loop -i 1000 -a 1009 -cb 13 | mlc_qdisc_prepare 14 | 15 | 16 | 17 | for node in \$( seq 1000 109 ) ; do mlc_link_set 1 1000 1 \$node 13 ; done 18 | 19 | mlc_net_flush 20 | mlc_configure_line 1 3 21 | mlc_configure_grid 1 3 3 22 | mlc_configure_grid 1 3 0 0 0 1 1025 1000 3 0 0 5 1 # create 5x5 grid of 25 nodes 23 | 24 | . ./mlc-vars.sh ; mlc_loop -a 1009 -u 25 | 26 | mlc_loop -a 1009 -e "olsrd -d 0; ip rule del pref 9000 lookup 90; ip rule add pref 9000 lookup 90" 27 | mlc_loop -a 1009 -e "babeld -w -t 111 -D eth2; ip rule del pref 10000 lookup 111; ip rule add pref 10000 lookup 111" 28 | mlc_loop -a 1009 -e "batmand eth1" 29 | mlc_loop -a 1009 -e "uci revert bmx6; rm /root/core*; ulimit -c 20000; bmx6 -d0 >> /root/bmx6.log & " 30 | 31 | SIZE=1024; mlc_loop -a 1000 -e "openssl genrsa -out /etc/bmx6/rsa$SIZE.pem $SIZE; openssl rsa -in /etc/bmx6/rsa$SIZE.pem -inform PEM -out /etc/bmx6/rsa$SIZE.der -outform DER" 32 | 33 | 34 | 35 | 36 | grep "ERR" rootfs/mlc1000/rootfs/bmx6.log 37 | find rootfs/mlc1*/rootfs/root/core* 38 | 39 | killall --wait bmx6; echo bmx6 killed; killall --wait olsrd; echo olsrd killed 40 | mlc_loop -a 1009 -e "ip -6 rule del pref 9000 lookup 90; ip -6 rule add pref 9000 lookup 90; olsrd -d 0; rm /root/core*; ulimit -c 20000; bmx6 -d0 > /root/bmx6.log &" 41 | 42 | debugging olsrd: 43 | echo "all" | nc localhost 8080 44 | watch -d -n1 "echo '/all' | nc localhost 8080" 45 | 46 | debugging bmx6 47 | bmx6 -lcd8 48 | bmx6 -lc traffic=summary status interfaces links locals originators descriptions=255 49 | 50 | sudo tcpdump -i mbr1 -n -s0 -w 20110501-01-olsrd-0.6.1-ipv4-grid_1_1_0_0_199.rawdump 51 | 52 | sudo tcpdump -nve -s 200 -i ${mlc_bridge_prefix}1 icmp[icmptype] == icmp-timxceed or 'ip[8] < ( 64 - 29 )' 53 | sudo tcpdump -nve -s 200 -i ${mlc_bridge_prefix}1 'ip6[7] < 50' and icmp6 54 | 55 | 56 | 57 | sudo trafshow -n -i ${mlc_bridge_prefix}1 (takes a very long time to start off) 58 | sudo bwm-ng -I ${mlc_bridge_prefix}1 59 | 60 | 61 | #### auf server:# sudo nc -p 12345 -l ##### auf mlc1000...:# bmx6 -cd0 | nc mlc001 12345 62 | tail -s 0.1 -f rootfs/mlc1*/root/bmx6.log | tee bmx6.log 63 | 64 | 65 | mlc_loop -i 1000 -a 1010 -s 66 | mlc_loop -i 1000 -a 1010 -d 67 | 68 | # iperf -t 2 -c 172.20.1.103 #-u # iperf -t 2 -V -c 1::1:102 #-u ## tends to hang in loop, causing 100% cpuload 69 | 70 | netperf -l 1 -H 172.20.1.105 71 | netperf -6 -p 12866 -l 1 -H 1::1:100 72 | 73 | ######################### 74 | bridging the digital divide (virtualization into physical network): 75 | 76 | mlc_mac_set 3 100 eth0 00:18:84:1a:07:74 3 77 | 78 | ssh root@mlc1000 79 | tcpdump -i eth3 -n 80 | bmx6 dev=eth3:5 d=3 81 | 82 | ssh root@103.130.30.200 83 | ifconfig eth0:bmx6 10.10.5.200 netmask 255.255.255.0 84 | ifconfig ath0:bmx6 10.10.7.200 netmask 255.255.255.0 85 | bmx6 dev=eth0:bmx6 dev=ath0:bmx6 -d3 86 | 87 | ######################### 88 | 89 | 90 | while true; do bmx7 -cp >/dev/null && bmx7 -lc p s s s i s l /r=2 s k /r=1 traffic=eth1; sleep 1; done 91 | 92 | watch -n0.3 "bmx7 -c p s s s i traffic=eth1 s l s o /r=1 s tr > bmx7.dump && mv bmx7.dump bmx7.safe; cat bmx7.safe" 93 | 94 | -------------------------------------------------------------------------------- /mlc-init-host.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # set -ex 3 | 4 | # Copyright (c) 2011 Axel Neumann 5 | # This program is free software; you can redistribute it and/or 6 | # modify it under the terms of version 2 of the GNU General Public 7 | # License as published by the Free Software Foundation. 8 | # 9 | # This program is distributed in the hope that it will be useful, but 10 | # WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 | # General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with this program; if not, write to the Free Software 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 17 | # 02110-1301, USA 18 | 19 | 20 | # WARNING: 21 | # This package requires root priveleges and may have bugs that format your hard disk!!!! 22 | # Use on your own risk! It is highly recommended to use provided scripts 23 | # ONLY in a completely isolated environment like qmp or virtual box 24 | 25 | 26 | if [ -f ./mlc-vars.sh ] ; then 27 | . ./mlc-vars.sh 28 | else 29 | echo "could not find mlc-vars.sh in $(pwd)"; exit 1 30 | fi 31 | 32 | if [ "$(id -u)" != "0" ]; then 33 | echo "This script should be run as 'root'"; exit 1 34 | fi 35 | 36 | 37 | if [ "$(id -u)" != "0" ]; then 38 | echo "This script should be run as 'root'" 39 | exit 1 40 | fi 41 | 42 | modprobe ip6_tunnel 43 | #modprobe niit 44 | 45 | MLC_setup_bridge $mlc_net0_link $mlc_ip4_admin_gateway $mlc_net0_ip4_mask $mlc_net0_ip4_brc 46 | brctl addif $mlc_net0_link enp0s8 47 | ip add del $mlc_ip4_admin_gateway/16 dev enp0s8 48 | 49 | MLC_setup_bridge $mlc_net1_link 50 | MLC_setup_bridge $mlc_net2_link 51 | MLC_setup_bridge $mlc_net3_link 52 | 53 | sysctl -w net.ipv4.conf.all.forwarding=1 54 | sysctl -w net.ipv6.conf.all.forwarding=1 55 | sysctl -w net.ipv6.route.max_size=100000 56 | 57 | sysctl -w fs.inotify.max_user_instances=1024 # 1024 # orig 128 58 | sysctl -w fs.inotify.max_user_watches=65526 # 65536 # orig 8192 59 | sysctl -w fs.inotify.max_queued_events=131072 # 131072 #orig 16384 60 | 61 | sysctl -w net.ipv4.neigh.default.gc_thresh1=4096 # orig 128 # 4096 62 | sysctl -w net.ipv4.neigh.default.gc_thresh2=8192 # orig 256 # 8192 63 | sysctl -w net.ipv4.neigh.default.gc_thresh3=16384 # orig 512 # 16384 64 | 65 | sysctl -w net.ipv6.neigh.default.gc_thresh1=4096 # orig 128 # 4096 66 | sysctl -w net.ipv6.neigh.default.gc_thresh2=8192 # orig 256 # 8192 67 | sysctl -w net.ipv6.neigh.default.gc_thresh3=16384 # orig 512 # 16384 68 | 69 | iptables_mask="$(ipcalc -b $mlc_ip4_admin_gateway/$mlc_ip4_admin_netmask | grep Network: | awk '{print $2}')" 70 | iptables_dev="$(ip r | grep default | cut -d' ' -f 5)" 71 | 72 | if [ "$iptables_dev" ] && [ "$iptables_mask" ]; then 73 | if ! iptables -t nat -L -nv | grep MASQUERADE | grep $iptables_dev | grep $iptables_mask ; then 74 | iptables -t nat -I POSTROUTING -s $iptables_mask -o $iptables_dev -j MASQUERADE 75 | fi 76 | fi 77 | 78 | if ! mount | grep cgroup; then 79 | mkdir -p /cgroup 80 | mount -t cgroup none /cgroup 81 | # echo "none /cgroup cgroup defaults 0 0" >> /etc/fstab 82 | fi 83 | 84 | 85 | lxc-checkconfig # anything enabled?!! 86 | 87 | 88 | #mlc_net_force_reset 89 | #mlc_veth_force_cleanup 90 | mlc_net_flush 91 | mlc_cpu_max 92 | 93 | # dpkg -r mlocate # <- I did this 94 | # please somebody tell me how the new upstart-job scripts work and how to reliable disable updatedb and other stuff 95 | /etc/init.d/cron stop # 96 | /etc/init.d/anachron stop # 97 | #mkdir -p /etc/cron.d 98 | #echo "* * * * * root /bin/echo \"\`/bin/date\` minutely\" >> /root/mlc-error.log" > /etc/cron.d/mlc 99 | #echo "#!/bin/sh" > /etc/cron.hourly/mlc; chmod uog+x /etc/cron.hourly/mlc 100 | #echo "/bin/echo \"\`/bin/date\` hourly\" >> /root/mlc-error.log" >> /etc/cron.hourly/mlc 101 | 102 | /etc/init.d/munin-node stop # stop munin-node # service munin-node stop 103 | /etc/init.d/smokeping stop 104 | /etc/init.d/apport stop 105 | 106 | echo "WARNING! Disabled cron, munin, smokeping, ... services to prevent casual cpu load." 107 | echo " Reenable them after mlc usage!" 108 | 109 | lxc-start -n $mlc_name_prefix$mlc_mother_id -d 110 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /mlc-setup-host.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Copyright (c) 2011 Axel Neumann 4 | # This program is free software; you can redistribute it and/or 5 | # modify it under the terms of version 2 of the GNU General Public 6 | # License as published by the Free Software Foundation. 7 | # 8 | # This program is distributed in the hope that it will be useful, but 9 | # WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 11 | # General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program; if not, write to the Free Software 15 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 16 | # 02110-1301, USA 17 | 18 | 19 | # WARNING: 20 | # This package requires root priveleges and may have bugs that format your hard disk!!!! 21 | # Use on your own risk! It is highly recommended to use provided scripts 22 | # ONLY in a completely isolated environment like qmp or virtual box 23 | 24 | set -x 25 | set -e 26 | 27 | if false; then 28 | apt-get update 29 | apt-get install aptitude 30 | aptitude update 31 | aptitude upgrade 32 | aptitude install --assume-yes lxc1 lxc-templates ipcalc ebtables bridge-utils wireshark screen git-core openssh-server emacs cpufrequtils 33 | fi 34 | 35 | 36 | if false; then 37 | if [ -f /etc/screenrc ] && ! grep -qe "screen /bin/bash" /etc/screenrc; then 38 | cat <> /etc/screenrc 39 | term xterm-256color 40 | screen 41 | screen /bin/bash -c 'screen -X caption always " %{Wk}%?%F%{WK}%? %n %t %h %{r}\$STY@%H %{g}%c:%s %d/%m/%y %{w}%w %{R}%u"' 42 | EOF 43 | fi 44 | 45 | # hostname MLC 46 | if ! [ -f ~/.ssh/id_rsa ]; then 47 | ssh-keygen -f ~/.ssh/id_rsa -P "" 48 | fi 49 | 50 | echo "use password: 'mlc'. And type enter for all other questions." 51 | adduser mlc || true 52 | adduser mlc sudo || true 53 | adduser mlc wireshark || true 54 | 55 | if ! [ -f /home/mlc/.ssh/id_rsa ]; then 56 | su -c 'ssh-keygen -f ~/.ssh/id_rsa -P ""' mlc 57 | fi 58 | 59 | if ! [ -f /home/mlc/.emacs ]; then 60 | cat <> /home/mlc/.emacs 61 | ; from http://linux-quirks.blogspot.com/2010/02/emacs-mouse-scrolling.html 62 | ; Mouse Wheel Scrolling 63 | 64 | ; Scroll up five lines without modifiers 65 | (defun up-slightly () (interactive) (scroll-up 5)) 66 | (defun down-slightly () (interactive) (scroll-down 5)) 67 | (global-set-key [mouse-4] 'down-slightly) 68 | (global-set-key [mouse-5] 'up-slightly) 69 | ; Scroll up five lines with META held 70 | (global-set-key [M-mouse-4] 'down-slightly) 71 | (global-set-key [M-mouse-5] 'up-slightly) 72 | 73 | ; Scroll up one line with SHIFT held 74 | (defun up-one () (interactive) (scroll-up 1)) 75 | (defun down-one () (interactive) (scroll-down 1)) 76 | (global-set-key [S-mouse-4] 'down-one) 77 | (global-set-key [S-mouse-5] 'up-one) 78 | 79 | ; Scroll up one page with CTRL held 80 | (defun up-a-lot () (interactive) (scroll-up)) 81 | (defun down-a-lot () (interactive) (scroll-down)) 82 | (global-set-key [C-mouse-4] 'down-a-lot) 83 | (global-set-key [C-mouse-5] 'up-a-lot) 84 | 85 | 86 | (global-set-key "\M-n" 'up-one) 87 | (global-set-key "\M-p" 'down-one) 88 | 89 | (global-set-key "\M-N" 'up-slightly) 90 | (global-set-key "\M-P" 'down-slightly) 91 | 92 | (set-face-attribute 'default nil :height 72) 93 | 94 | ; (global-set-key "\C-G" ’goto-line) 95 | 96 | 97 | (setq x-select-enable-clipboard t) 98 | 99 | EOF 100 | 101 | chown mlc:mlc /home/mlc/.emacs 102 | fi 103 | fi 104 | 105 | 106 | 107 | if [ -f ./mlc-vars.sh ] ; then 108 | . ./mlc-vars.sh 109 | else 110 | echo "could not find mlc-vars.sh in $(pwd)"; exit 1 111 | fi 112 | 113 | if ! grep -q mlc /etc/hosts; then 114 | cat <> /etc/hosts 115 | 10.${mlc_ip4_admin_prefix1}.0.1 mq 116 | 10.${mlc_ip4_admin_prefix1}.0.3 mh 117 | 10.${mlc_ip4_admin_prefix1}.0.2 mm 118 | 10.${mlc_ip4_admin_prefix1}.0.2 mlc 119 | 10.${mlc_ip4_admin_prefix1}.0.2 mlc0002 120 | 10.${mlc_ip4_admin_prefix1}.10.0 m1000 121 | 10.${mlc_ip4_admin_prefix1}.10.1 m1001 122 | 10.${mlc_ip4_admin_prefix1}.10.2 m1002 123 | 10.${mlc_ip4_admin_prefix1}.10.3 m1003 124 | 10.${mlc_ip4_admin_prefix1}.10.4 m1004 125 | 10.${mlc_ip4_admin_prefix1}.10.5 m1005 126 | 10.${mlc_ip4_admin_prefix1}.10.6 m1006 127 | 10.${mlc_ip4_admin_prefix1}.10.7 m1007 128 | 10.${mlc_ip4_admin_prefix1}.10.8 m1008 129 | 10.${mlc_ip4_admin_prefix1}.10.9 m1009 130 | 131 | 10.${mlc_ip4_admin_prefix1}.10.10 m1010 132 | 10.${mlc_ip4_admin_prefix1}.10.11 m1011 133 | 10.${mlc_ip4_admin_prefix1}.10.12 m1012 134 | 10.${mlc_ip4_admin_prefix1}.10.13 m1013 135 | 10.${mlc_ip4_admin_prefix1}.10.14 m1014 136 | 10.${mlc_ip4_admin_prefix1}.10.15 m1015 137 | 10.${mlc_ip4_admin_prefix1}.10.16 m1016 138 | 10.${mlc_ip4_admin_prefix1}.10.17 m1017 139 | 10.${mlc_ip4_admin_prefix1}.10.18 m1018 140 | 10.${mlc_ip4_admin_prefix1}.10.19 m1019 141 | 142 | EOF 143 | fi 144 | 145 | 146 | 147 | if false; then 148 | 149 | MLC_assign_networks $mlc_mother_id 150 | 151 | echo "input returned $? and mlc_conf_dir=$mlc_conf_dir mother_name=$mother_name" 152 | 153 | printf "\n" 154 | printf "creating %s in %s\n" $mother_name $mother_config 155 | 156 | 157 | #export SUITE="$mlc_debian_suite" 158 | #export ARCH="$mlc_arch" 159 | 160 | for s in $(lxc-ls); do 161 | if echo $s | grep -q $mlc_name_prefix; then 162 | lxc-stop -n $s -k || echo "container $s already stopped" 163 | fi 164 | done 165 | 166 | if false; then 167 | rm -rf --preserve-root $mlc_conf_dir/$mlc_name_prefix* 168 | 169 | mkdir -p $mother_config 170 | 171 | echo "Check if later than ${mlc_debian_release} is needed" 172 | wget "https://ftp-master.debian.org/keys/${mlc_debian_release}.asc" 173 | gpg --no-default-keyring --keyring /var/cache/lxc/debian/archive-key.gpg --import ${mlc_debian_release} 174 | gpg --no-default-keyring --keyring /var/cache/lxc/debian/archive-key.gpg --list-key 175 | 176 | lxc-create -n $mother_name -t debian -P $mlc_conf_dir -- --arch=$mlc_arch --release=$mlc_debian_suite --enable-non-free --packages=$(echo $mlc_deb_packages | sed 's/ /,/g') 177 | fi 178 | 179 | MLC_configure_individual $mlc_mother_id 180 | if [ $? -ne 0 ]; then 181 | echo "failed to configure $child_rootfs"; return 1 182 | fi 183 | 184 | MLC_create_lxc_config $mother_name 185 | if [ $? -ne 0 ]; then 186 | echo "failed write childs configuration file: $child_config"; return 1 187 | fi 188 | 189 | 190 | #################################################### 191 | # reconfigure some services 192 | 193 | # remove pointless services in a container 194 | #chroot $mother_rootfs /usr/sbin/update-rc.d -f umountfs remove 195 | #chroot $mother_rootfs /usr/sbin/update-rc.d -f hwclock.sh remove 196 | #chroot $mother_rootfs /usr/sbin/update-rc.d -f hwclockfirst.sh remove 197 | 198 | 199 | #################################################### 200 | #################################################### 201 | 202 | ./mlc-init-host.sh 203 | #lxc-start -n $mother_name 204 | 205 | lxc-attach -n $mother_name aptitude update 206 | lxc-attach -n $mother_name -- aptitude --assume-yes upgrade 207 | 208 | 209 | #################################################### 210 | # by default setup root password with no password 211 | cat < $mother_rootfs/etc/ssh/sshd_config 212 | Port 22 213 | Protocol 2 214 | HostKey /etc/ssh/ssh_host_rsa_key 215 | HostKey /etc/ssh/ssh_host_dsa_key 216 | UsePrivilegeSeparation yes 217 | KeyRegenerationInterval 3600 218 | ServerKeyBits 768 219 | SyslogFacility AUTH 220 | LogLevel INFO 221 | LoginGraceTime 120 222 | PermitRootLogin yes 223 | StrictModes yes 224 | RSAAuthentication yes 225 | PubkeyAuthentication yes 226 | IgnoreRhosts yes 227 | RhostsRSAAuthentication no 228 | HostbasedAuthentication no 229 | PermitEmptyPasswords yes 230 | ChallengeResponseAuthentication no 231 | UseDNS no 232 | EOF 233 | 234 | # set the root passwd: 235 | if [ -z $mlc_passwd ] ; then 236 | chroot $mother_rootfs /usr/bin/passwd -d root 237 | else 238 | echo -e "$mlc_passwd\n$mlc_passwd" | chroot $mother_rootfs /usr/bin/passwd 239 | # echo -e "$mlc_passwd\n$mlc_passwd" | lxc-attach -n $mother_name passwd 240 | fi 241 | 242 | # configure the public key: 243 | mkdir -p $mother_rootfs/root/.ssh 244 | echo "$mlc_pub_key" > $mother_rootfs/root/.ssh/authorized_keys 245 | cat /root/.ssh/id_rsa.pub >> $mother_rootfs/root/.ssh/authorized_keys 246 | cat /home/mlc/.ssh/id_rsa.pub >> $mother_rootfs/root/.ssh/authorized_keys || true 247 | 248 | 249 | lxc-attach -n $mother_name -- /etc/init.d/ssh restart 250 | 251 | lxc-attach -n $mother_name -- mkdir -p /lib64 252 | fi 253 | 254 | if false ; then 255 | lxc-attach -n $mother_name -- aptitude install $mlc_deb_packages 256 | fi 257 | 258 | if false; then 259 | for project in $mlc_sources; do 260 | project_name="$(echo $project | awk -F'::' '{print $1}')" 261 | project_repo="$(echo $project | awk -F'::' '{print $2}')" 262 | 263 | echo "Installing $project_name from $project_repo via make to $mother_name" 264 | 265 | lxc-attach -n $mother_name -- wget -c --tries=10 --directory-prefix=/usr/src $project_repo 266 | lxc-attach -n $mother_name -- tar -C /usr/src -xzvf /usr/src/$project_name.tar.gz ||\ 267 | lxc-attach -n $mother_name -- tar -C /usr/src -xzvf /usr/src/$project_name-gpl.tgz 268 | lxc-attach -n $mother_name -- make clean all install -C /usr/src/$project_name 269 | done 270 | fi 271 | 272 | if false; then 273 | for project in $mlc_gits; do 274 | project_name="$(echo $project | awk -F'::' '{print $1}')" 275 | project_repo="$(echo $project | awk -F'::' '{print $2}')" 276 | project_make="$(echo $project | awk -F'::' '{print $3}')" 277 | 278 | echo "Installing $project_name from $project_repo via $project_make to $mother_name" 279 | 280 | lxc-attach -n $mother_name -- rm -rf usr/src/$project_name 281 | lxc-attach -n $mother_name -- git clone $project_repo usr/src/$project_name 282 | if echo $project_name | grep -q bmx; then 283 | lxc-attach -n $mother_name -- make -C /usr/src/$project_name/src clean_all build_all install_all EXTRA_CFLAGS="-pg -DPROFILING -DCORE_LIMIT=20000 -DTRAFFIC_DUMP" 284 | elif echo $project_name | grep -q oonf; then 285 | # from: http://www.olsr.org/mediawiki/index.php/OLSR.org_Network_Framework#olsrd2 286 | $mlc_ssh root@mlc "cd /usr/src/oonf.git/build && git checkout v0.14.1 && cmake .. && make clean && make install" 287 | # $mlc_ssh root@mlc "cd /usr/src/oonf.git/build && cmake .. && make clean && make install" 288 | elif echo $project_name | grep -q uci; then 289 | lxc-attach -n $mother_name -- make -C /usr/src/$project_name clean all install WOPTS="-pedantic -Wall" 290 | else 291 | lxc-attach -n $mother_name -- make -C /usr/src/$project_name clean all install 292 | fi 293 | done 294 | 295 | fi 296 | 297 | set +x 298 | echo 299 | echo 300 | echo "ATTENTION: Enable all needed if false/true bocks of this script manually !!!" 301 | echo 302 | 303 | 304 | 305 | 306 | -------------------------------------------------------------------------------- /mlc-vars.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # set -ex 3 | 4 | # Copyright (c) 2011 Axel Neumann 5 | # This program is free software; you can redistribute it and/or 6 | # modify it under the terms of version 2 of the GNU General Public 7 | # License as published by the Free Software Foundation. 8 | # 9 | # This program is distributed in the hope that it will be useful, but 10 | # WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 | # General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with this program; if not, write to the Free Software 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 17 | # 02110-1301, USA 18 | 19 | 20 | # WARNING: 21 | # This package requires root priveleges and may have bugs that format your hard disk!!!! 22 | # Use on your own risk! It is highly recommended to use provided scripts 23 | # ONLY in a completely isolated environment like qmp or virtual box 24 | 25 | 26 | mlc_lxc_bin_dir="$(which lxc-create | awk -F'/lxc-create' '{print $1}')" 27 | mlc_lxc_examples="/usr/share/doc/lxc/examples" 28 | 29 | mlc_path_dir="$(pwd)" 30 | mlc_tmp_dir="$(pwd)/tmp" 31 | mlc_known_hosts_file="$mlc_tmp_dir/known_hosts" 32 | mlc_veth_cache="$mlc_tmp_dir/mlc_veth_cache.txt" 33 | 34 | mlc_ssh="ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=$mlc_known_hosts_file -o ConnectTimeout=1 " 35 | 36 | mkdir -p $mlc_tmp_dir 37 | 38 | #mlc_conf_dir="/usr/local/var/lib/lxc" 39 | mlc_conf_dir="/var/lib/lxc" 40 | 41 | mlc_owrt_fs_tgz="/usr/src/openwrt/13f/qmpfw-gsoc.git/build/alix/bin/x86/openwrt-x86-generic-rootfs.tar.gz" 42 | 43 | mlc_arch="x86_64" 44 | mlc_debian_suite="bookworm" # squeeze, lenny, wheezy, sid. Or check whats available on: http://cdn.debian.net/debian/ 45 | mlc_debian_release="release-12" # for bookworm 46 | 47 | mlc_empty_dirs= 48 | mlc_copy_dirs= 49 | mlc_mount_dirs= 50 | 51 | #mlc_empty_dirs="media dev mnt proc sys var/local var/lock var/log var/log/fsck var/mail var/opt var/run var/tmp" 52 | #mlc_copy_dirs="etc home root selinux srv tmp var/spool var/www " 53 | #mlc_mount_dirs="bin boot lib opt sbin usr var/backups var/cache var/lib" 54 | 55 | mlc_empty_dirs="dev media mnt opt proc run run/mount sys var/backups var/local var/log var/mail " 56 | mlc_copy_dirs="etc home root selinux srv tmp lib64 var/lock var/run var/spool var/tmp var/www " 57 | mlc_mount_dirs="sbin bin usr boot lib var/cache var/lib " 58 | 59 | 60 | mlc_name_prefix="mlc" 61 | mlc_mother_id="0002" 62 | mother_name="${mlc_name_prefix}${mlc_mother_id}" 63 | mother_config="$mlc_conf_dir/$mother_name" 64 | mother_rootfs="$mlc_conf_dir/$mother_name/rootfs" 65 | 66 | 67 | mlc_bridge_prefix="mbr" 68 | mlc_p2p_bridge_prefix="M" 69 | mlc_p2p_bridge_delimiter="=" 70 | mlc_p2p_bridge_idx_delimiter="_" 71 | 72 | mlc_veth_prefix="veth" 73 | mlc_dev_prefix="eth" 74 | 75 | mlc_mnt="NULL" 76 | 77 | mlc_min_node="1000" 78 | mlc_max_node="8999" 79 | 80 | mlc_peer_idx_min="4" 81 | mlc_peer_idx_max="7" 82 | 83 | mlc_ns3_idx_min="3" 84 | mlc_ns3_idx_max="3" 85 | 86 | mlc_mac6_multicast="33:33:0:0:0:0/ff:ff:0:0:0:0" 87 | 88 | mlc_pub_key="ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvbTSxpSlDBV7m+c0i1rUFpaasegLjRL+BZunrpKb1YFvJXwS2DD1WqnAypBk/AlgR9KQlXfHSpeRqxY0HbBnPWG79LQ2NlVlcvF7xokpw3eUeYKpJwx0ivNd/koKE3wvoFN158JseFhUBGcZdaFRGh6bFhrvvXYmAHjroHvaGgVR8YQI4DiKrBULQd75p/U3G2UjeZpMeTK+LaCkuWh0g+93LQPp21w6v8hOZtudJ2rhNHNYB0oFJF8Uf5q+uVjpbOzA/nPxs/qiF4zdg2oyj0eAi0Yfo+eSVI/zj3iyeC4rF5S8/s/cyet+XMXvLQ6X12XUYu7Qv/VEVwI5QkVqSw== mlc@mlc" 89 | 90 | mlc_passwd="mlc" 91 | 92 | mlc_cpu_idle_assumption=50 93 | 94 | mlc_lang="en_US.UTF-8" 95 | mlc_language="en_US:en" 96 | export LANG="$mlc_lang" 97 | export LANGUAGE="$mlc_language" 98 | export LC_ALL="$mlc_lang" 99 | 100 | 101 | mlc_mac_prefix="a0:cd:ef" 102 | mlc_net_mtu="1500" 103 | 104 | mlc_dns="8.8.4.4" 105 | mlc_node="22" 106 | 107 | mlc_ip4_prefix0="10" 108 | mlc_admin_idx="0" 109 | 110 | mlc_ip4_admin_prefix1="111" 111 | mlc_ip4_admin_netmask="255.225.0.0" 112 | mlc_ip4_admin_netmask="255.255.0.0" 113 | mlc_ip4_admin_broadcast="10.111.255.255" 114 | mlc_ip4_admin_gateway="10.111.0.1" 115 | 116 | mlc_ip4_ula1_prefix1="050" 117 | mlc_ip4_ula1_netmask="255.255.0.0" 118 | mlc_ip4_ula1_broadcast="10.50.255.255" 119 | 120 | 121 | 122 | mlc_ip6_prefix="1" 123 | mlc_ip6_ripe1_prefix="2011:0:0" 124 | mlc_ip6_ripe2_prefix="2012:0:0" 125 | mlc_ip6_ripe3_prefix="2013:0:0" 126 | mlc_ip6_ripeLo_prefix="2014:0:0" 127 | mlc_ip6_ula1_prefix="fd01:0:0" 128 | mlc_ip6_ula2_prefix="fd02:0:0" 129 | mlc_ip6_ula3_prefix="fd03:0:0" 130 | mlc_ip6_ulaLo_prefix="fc00:0:0" 131 | 132 | 133 | MLC_ip6_ula() { 134 | local ula48_prefix=$1 135 | local mac=$2 136 | local ula32_host=$3 137 | local mac1="$(( 16#$( echo $mac | awk -F':' '{print $1}' ) ))" 138 | local mac2="$(( 16#$( echo $mac | awk -F':' '{print $2}' ) ))" 139 | local mac3="$(( 16#$( echo $mac | awk -F':' '{print $3}' ) ))" 140 | local mac4="$(( 16#$( echo $mac | awk -F':' '{print $4}' ) ))" 141 | local mac5="$(( 16#$( echo $mac | awk -F':' '{print $5}' ) ))" 142 | local mac6="$(( 16#$( echo $mac | awk -F':' '{print $6}' ) ))" 143 | 144 | printf "%s:%X:%X:%X::%s\n" $ula48_prefix $(( ( $mac1 * 256 ) + $mac2 )) $(( ( $mac3 * 256 ) + $mac4 )) $(( ( $mac5 * 256 ) + $mac6 )) $ula32_host 145 | } 146 | 147 | 148 | MLC_calc_veth_name() { 149 | local node=$1 150 | local idx=$2 151 | local name="${mlc_name_prefix}${node}" 152 | 153 | echo "${mlc_veth_prefix}${node}_${idx}" 154 | } 155 | 156 | 157 | MLC_calc_mac() { 158 | local node=$1 159 | local idx=$2 160 | 161 | local node_div100="$(( $node / 100 ))" 162 | local node_mod100="$(( $node % 100 ))" 163 | 164 | echo "${mlc_mac_prefix}:${node_div100}:${node_mod100}:${idx}" 165 | } 166 | 167 | MLC_calc_ip4() { 168 | local prefix1=$1 169 | local node=$2 170 | local idx=$3 171 | 172 | local node_div100="$(( $node / 100 ))" 173 | local node_mod100="$(( $node % 100 ))" 174 | 175 | echo "${mlc_ip4_prefix0}.$(( prefix1 + $idx )).${node_div100}.${node_mod100}" 176 | } 177 | 178 | MLC_assign_networks() { 179 | local idx 180 | 181 | mlc_node=$1 182 | 183 | # Control/Admin Network: 184 | idx="$mlc_admin_idx" 185 | mlc_net0_link="${mlc_bridge_prefix}${idx}" 186 | mlc_net0_name="${mlc_dev_prefix}${idx}" 187 | mlc_net0_mtu="1500" 188 | mlc_net0_mac="$(MLC_calc_mac $mlc_node $idx )" 189 | mlc_net0_veth="$(MLC_calc_veth_name $mlc_node $idx )" 190 | 191 | mlc_net0_ip4_addr="$(MLC_calc_ip4 $mlc_ip4_admin_prefix1 $mlc_node $idx )" 192 | mlc_net0_ip4_mask="$mlc_ip4_admin_netmask" 193 | mlc_net0_ip4_brc="$mlc_ip4_admin_broadcast" 194 | mlc_net0_ip4_gw="$mlc_ip4_admin_gateway" 195 | 196 | 197 | # Mesh Networks: 198 | idx="1" 199 | mlc_net1_link="${mlc_bridge_prefix}${idx}" 200 | mlc_net1_name="${mlc_dev_prefix}${idx}" 201 | mlc_net1_mac="$(MLC_calc_mac $mlc_node $idx )" 202 | mlc_net1_veth="$(MLC_calc_veth_name $mlc_node $idx )" 203 | 204 | mlc_net11_name="eth${idx}.11" 205 | mlc_net11_ip4_addr="$(MLC_calc_ip4 $mlc_ip4_ula1_prefix1 $mlc_node $idx )" 206 | mlc_net11_ip4_mask="$mlc_ip4_ula1_netmask" 207 | mlc_net11_ip4_brc="$mlc_ip4_ula1_broadcast" 208 | mlc_net11_ula_addr="$(MLC_ip6_ula $mlc_ip6_ula1_prefix $mlc_net1_mac 1)" 209 | mlc_net11_ula_mask="48" 210 | mlc_net11_rip_addr="$mlc_ip6_ripe1_prefix:$mlc_node::11" 211 | mlc_net11_rip_mask="128" 212 | 213 | 214 | idx="2" 215 | mlc_net2_link="${mlc_bridge_prefix}${idx}" 216 | mlc_net2_name="${mlc_dev_prefix}${idx}" 217 | mlc_net2_mac="$(MLC_calc_mac $mlc_node $idx )" 218 | mlc_net2_veth="$(MLC_calc_veth_name $mlc_node $idx )" 219 | 220 | } 221 | 222 | 223 | MLC_assign_networks $mlc_node 224 | 225 | mlc_deb_packages="\ 226 | aptitude \ 227 | ca-certificates \ 228 | ifupdown \ 229 | netbase \ 230 | net-tools \ 231 | iproute2 vlan bridge-utils \ 232 | iptables \ 233 | openssh-server \ 234 | iputils-ping \ 235 | vim nano less \ 236 | locales-all \ 237 | dialog \ 238 | netdiag \ 239 | man-db \ 240 | ipcalc ipv6calc \ 241 | wget \ 242 | bzip2 \ 243 | unzip \ 244 | build-essential gdb file subversion \ 245 | lynx \ 246 | telnet \ 247 | tcpdump \ 248 | mtr traceroute \ 249 | psmisc lsof \ 250 | iptraf-ng netcat-openbsd iperf \ 251 | bison flex m4 autoconf autoconf-archive cmake autogen dh-autoreconf gawk \ 252 | libjson-c-dev zlib1g-dev libiw-dev \ 253 | mini-httpd \ 254 | nmap \ 255 | jq \ 256 | git \ 257 | libmbedtls-dev \ 258 | " 259 | 260 | mlc_deb_packages_disabled="\ 261 | quagga quagga-doc \ 262 | texinfo \ 263 | " 264 | 265 | mlc_sources="\ 266 | " 267 | disabled_mlc_sources="\ 268 | mbedtls-3.6.0::https://tls.mbed.org/download/mbedtls-3.6.0-gpl.tgz \ 269 | olsrd-0.9.6::http://www.olsr.org/releases/0.9/olsrd-0.9.6.tar.gz \ 270 | babeld-1.8.0::http://www.pps.jussieu.fr/~jch/software/files/babeld-1.8.0.tar.gz \ 271 | " 272 | 273 | mlc_gits=" \ 274 | uci.git::https://github.com/axn/uci-0.7.5.git \ 275 | bmx7.git::https://github.com/bmx-routing/bmx7.git \ 276 | " 277 | disabled_mlc_gits=" \ 278 | mbedtls::https://github.com/Mbed-TLS/mbedtls.git \ // added as debian package 279 | bmx6.git::https://github.com/bmx-routing/bmx6.git \ 280 | oonf.git::https://github.com/OLSR/OONF.git \ 281 | " 282 | 283 | 284 | mlc_help() { 285 | 286 | local mother_name="${mlc_name_prefix}${mlc_mother_id}" 287 | 288 | less mlc-help.txt 289 | } 290 | 291 | mlc_rand() { 292 | local max=${1:-"1000"} 293 | local min=${2:-"0"} 294 | echo $((( ( $(dd if=/dev/random bs=4 count=1 2>/dev/null | hexdump -e '"%u\n"') % (($max + 1) - $min) ) + $min ))) 295 | } 296 | 297 | 298 | 299 | mlc_gprof() { 300 | 301 | local nodeMax="${1:-$mlc_min_node}" 302 | local nodeMin="${2:-$mlc_min_node}" 303 | # local nodeMin="${2:-$nodeMax}" 304 | local binary="bmx6" 305 | local binary_path="usr/sbin" 306 | local gmon_dir="gprofs" 307 | local gmon_out="root/gmon.out" 308 | local now="$(date +%y%m%d%H%M%S)" 309 | local gmon_bin="./$gmon_dir/gmon.$now.bin" 310 | local gmon_SUM="./$gmon_dir/gmon.$now.sum" 311 | local gmon_sum="./gmon.sum" 312 | local gmon_txt="./$gmon_dir/gmon.$now.txt" 313 | local mother_name="${mlc_name_prefix}${mlc_mother_id}" 314 | local mother_rootfs=$mlc_conf_dir/$mother_name/rootfs 315 | local vm_min_rootfs=$mlc_conf_dir/$mlc_name_prefix$nodeMin/rootfs 316 | 317 | mkdir -p $gmon_dir 318 | 319 | cp $mother_rootfs/$binary_path/$binary $gmon_bin 320 | cp $mother_rootfs/$binary_path/$binary $gmon_bin.strip 321 | strip $gmon_bin.strip 322 | 323 | echo "cp $vm_min_rootfs/$gmon_out $gmon_sum" 324 | cp $vm_min_rootfs/$gmon_out $gmon_sum 325 | ls --full-time $vm_min_rootfs/$gmon_out $gmon_sum 326 | 327 | 328 | local node 329 | for node in $( seq $(( $nodeMin + 1 )) $nodeMax ) ; do 330 | 331 | local vm_rootfs=$mlc_conf_dir/$mlc_name_prefix$node/rootfs 332 | 333 | echo "gprof -s $gmon_bin $vm_rootfs/$gmon_out $gmon_sum" 334 | gprof -s $gmon_bin $vm_rootfs/$gmon_out $gmon_sum 335 | ls --full-time $vm_rootfs/$gmon_out $gmon_sum 336 | 337 | done 338 | 339 | cp $gmon_sum $gmon_SUM 340 | gprof $gmon_bin $gmon_SUM > $gmon_txt 341 | 342 | less $gmon_txt 343 | 344 | } 345 | 346 | 347 | 348 | mlc_cpu_set(){ 349 | local GOVERNOR=$1 350 | if [ -r /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ]; then 351 | for i in `seq 0 $(($(ls /sys/devices/system/cpu/cpu*/cpufreq/scaling_available_governors | wc -l) -1))`; do 352 | if grep -q $GOVERNOR /sys/devices/system/cpu/cpu$i/cpufreq/scaling_available_governors ; then 353 | if cpufreq-set -c $i -g $GOVERNOR ; then 354 | echo "Success setting cpu$i $GOVERNOR governor" 355 | else 356 | echo "WARNING: Could not set cpu$i $GOVERNOR governor" 357 | fi 358 | fi 359 | done 360 | else 361 | echo "WARNING: unable to set cpus' $GOVERNOR governor" 362 | fi 363 | cpufreq-info 364 | } 365 | 366 | 367 | mlc_cpu_max() { 368 | mlc_cpu_set performance 369 | } 370 | 371 | mlc_cpu_min() { 372 | mlc_cpu_set powersave 373 | } 374 | 375 | 376 | 377 | mlc_cpu_sleep_until_idle() { 378 | 379 | local min=$mlc_cpu_idle_assumption 380 | local cpus=$(cat /proc/cpuinfo | grep processor | wc -l ) 381 | local probeA=$(grep 'cpu ' /proc/stat | awk '{print $5}') 382 | 383 | while true; do 384 | local probeB=$(sleep 0.4; grep 'cpu ' /proc/stat | awk '{print $5}') 385 | local idle=$((( -100 * ( $probeA - $probeB) / (40 * $cpus) ))) 386 | 387 | echo "cpus=$cpus idle=$idle min=$min , $( [ "$idle" -lt "$min" ] && echo "WAITING...")" 388 | 389 | [ "$idle" -lt "$min" ] || break 390 | 391 | probeA=$probeB 392 | done 393 | 394 | } 395 | 396 | MLC_loop_boot() { 397 | # set -x 398 | local node=$1 399 | local name="$mlc_name_prefix$1" 400 | 401 | lxc-info --name $name | grep -q RUNNING && echo "$name already RUNNING" || lxc-start -n $name -d 402 | } 403 | 404 | 405 | 406 | MLC_loop_help() { 407 | echo available long options are: $longopts 408 | echo available short options are: $shortopts 409 | } 410 | 411 | mlc_loop() { 412 | # set -x 413 | 414 | local loop_min=$mlc_min_node 415 | local loop_max=$mlc_max_node 416 | 417 | local loop_help=0 418 | local loop_create=0 419 | local loop_boot=0 420 | local loop_load=0 421 | local loop_stop=0 422 | local loop_destroy=0 423 | local loop_pretend="" 424 | local loop_update=0 425 | 426 | local loop_exec="0" 427 | 428 | local shortopts="hpcubsdli:a:e:C:" 429 | local longopts="help,pretend,create,update;boot,stop,destroy,load,min:,max:,hosts,exec:,config:" 430 | 431 | 432 | local TEMP=$(getopt -o $shortopts --long $longopts -- "$@") 433 | if [ $? != 0 ] ; then echo "Terminating..." >&2 ; return 1 ; fi 434 | 435 | # Note the quotes around `$TEMP': they are essential! 436 | eval set -- "$TEMP" 437 | 438 | while true ; do 439 | # echo evaluating $@ 440 | case "$1" in 441 | -h|--help) MLC_loop_help; return 0;; 442 | -i|--min) loop_max=$2 loop_min=$2 ; shift 2 ;; 443 | -a|--max) loop_max=$2 ; shift 2 ;; 444 | -c|--create) loop_create=1 ; shift 1 ;; 445 | -u|--update) loop_update=1 ; shift 1 ;; 446 | -b|--boot) loop_boot=1 ; shift 1 ;; 447 | -s|--stop) loop_stop=1 ; shift 1 ;; 448 | -l|--load) loop_load=1 ; shift 1 ;; 449 | -d|--desroy) loop_destroy=1 ; shift 1 ;; 450 | -p|--pretend) loop_pretend="echo"; shift 1;; 451 | -e|--exec) loop_exec=$2; shift 2;; 452 | --) shift ; break ;; 453 | *) echo "Internal error!" ; return 1 ;; 454 | esac 455 | done 456 | 457 | for node in $( seq $loop_min $loop_max ) ; do 458 | local loop_name="$mlc_name_prefix$node" 459 | 460 | [ "$loop_load" == "1" ] && mlc_cpu_sleep_until_idle 461 | [ "$loop_create" == "1" ] && echo "creating $loop_name" && $loop_pretend mlc_create_child $node && sync 462 | [ "$loop_update" == "1" ] && echo "updating $loop_name" && $loop_pretend mlc_update_individual $node 463 | [ "$loop_boot" == "1" ] && echo "booting $loop_name" && \ 464 | mlc_cpu_sleep_until_idle && sync && $loop_pretend MLC_loop_boot $node 465 | [ "$loop_stop" == "1" ] && echo "stopping $loop_name" && $loop_pretend lxc-stop -kn $mlc_name_prefix$node #-t 1 466 | [ "$loop_destroy" == "1" ] && echo "destroying $loop_name" && $loop_pretend mlc_destroy $node 467 | [ "$loop_exec" != "0" ] && echo "executing $loop_name $loop_exec" && $loop_pretend $mlc_ssh root@"$(MLC_calc_ip4 $mlc_ip4_admin_prefix1 $node $mlc_admin_idx )" $loop_exec 468 | # [ "$loop_exec" != "0" ] && echo "executing $loop_name $loop_exec" && $loop_pretend lxc-attach -n $loop_name -- $loop_exec 469 | done 470 | 471 | [ "$loop_boot" == "1" ] && $loop_pretend mlc_veth_obtain 472 | 473 | } 474 | 475 | 476 | MLC_transform_long_mac() { 477 | 478 | local long=$1 479 | 480 | printf "%X:%X:%X:%X:%X:%X\n" \ 481 | $(( 16#$(echo $long | awk -F: '{print $1}') )) \ 482 | $(( 16#$(echo $long | awk -F: '{print $2}') )) \ 483 | $(( 16#$(echo $long | awk -F: '{print $3}') )) \ 484 | $(( 16#$(echo $long | awk -F: '{print $4}') )) \ 485 | $(( 16#$(echo $long | awk -F: '{print $5}') )) \ 486 | $(( 16#$(echo $long | awk -F: '{print $6}') )) 487 | 488 | } 489 | 490 | 491 | MLC_setup_bridge() { 492 | local link=$1 493 | local addr=$2 494 | local mask=$3 495 | local brc=$4 496 | 497 | if [ -z "$link" ] ; then 498 | echo something is not defined 499 | return 0 500 | fi 501 | 502 | if brctl show | grep "^$link$" ; then 503 | echo link $link already setup 504 | else 505 | echo setup $link 506 | brctl addbr $link 507 | fi 508 | 509 | if [ -z "$addr" ] ; then 510 | echo no address given 511 | else 512 | ip addr add $addr/$mask br $brc dev $link 513 | ip link set $link address 0:$(printf "%X" $(echo $addr | awk -F. '{print $4}')):$(printf "%X" $(echo $addr | awk -F. '{print $3}')):0:0:0 514 | fi 515 | 516 | brctl setfd $link 0 517 | ip link set $link up 518 | ip link set $link promisc on 519 | 520 | 521 | echo 1 > /sys/devices/virtual/net/$link/bridge/multicast_snooping 522 | } 523 | 524 | 525 | mlc_peer_prepare() { 526 | 527 | for idx in $( seq $mlc_peer_idx_min $mlc_peer_idx_max ) ; do 528 | ebtables -I FORWARD -s $mlc_mac_prefix:0:0:$idx/FF:FF:FF:0:0:FF -j ACCEPT 529 | done 530 | 531 | } 532 | 533 | 534 | mlc_peer_clear() { 535 | 536 | local nodeA=$1 537 | local nodeB=${2:-$nodeA} 538 | 539 | local bridge="" 540 | 541 | if [ -z $nodeA ] ; then 542 | echo "usage: mlc_peer_clear [nodeB]"; return 1; 543 | fi 544 | 545 | if ! ip link show | grep ${mlc_p2p_bridge_delimiter} | grep ${mlc_p2p_bridge_prefix}${nodeA} | grep ${mlc_p2p_bridge_prefix}${nodeB} > /dev/null 2>&1 ; then 546 | return 1; 547 | fi 548 | 549 | 550 | local bridges="$( ip link show | grep ${mlc_p2p_bridge_delimiter} | grep ${mlc_p2p_bridge_prefix}${nodeA} | grep ${mlc_p2p_bridge_prefix}${nodeB} | awk -F': ' '{print $2}' )" 551 | local bridge="" 552 | 553 | echo "del bridge $bridges" 554 | 555 | for bridge in $bridges; do 556 | 557 | # local br 558 | # for br in $( echo $bridge | awk -F"$mlc_p2p_bridge_delimiter" '{print $1 " " $2}' ) ; do 559 | # 560 | # local bridge=$( echo $br | awk -F"$mlc_p2p_bridge_prefix" '{print $2}' ) 561 | # local nodeidx=$( echo $bridge | awk -F"$mlc_p2p_bridge_delimiter" '{print $1}' | awk -F"$mlc_p2p_bridge_prefix" '{print $2}' ) 562 | # local node=$( echo $nodeidx | awk -F"$mlc_p2p_bridge_idx_delimiter" '{print $1}' ) 563 | # local idx=$( echo $nodeidx | awk -F"$mlc_p2p_bridge_idx_delimiter" '{print $2}' ) 564 | # 565 | # ebtables -D FORWARD -o $(MLC_get_veth_cache $node $idx ) -j ACCEPT 566 | # done 567 | 568 | ifconfig $bridge down 569 | brctl delbr $bridge 570 | done 571 | } 572 | 573 | 574 | MLC_peer_alloc_idx() { 575 | 576 | local node=$1 577 | local cache_file="$mlc_tmp_dir/MLC_peer_alloc_idx.tmp" 578 | 579 | ip link show | grep "${mlc_p2p_bridge_delimiter}" | grep "${mlc_p2p_bridge_prefix}${node}${mlc_p2p_bridge_idx_delimiter}" > $cache_file 580 | 581 | for idx in $( seq $mlc_peer_idx_min $mlc_peer_idx_max ) ; do 582 | 583 | if ! grep "${mlc_p2p_bridge_prefix}${node}${mlc_p2p_bridge_idx_delimiter}${idx}" $cache_file > /dev/null 2>&1 ; then 584 | echo "$idx" 585 | return 0; 586 | fi 587 | 588 | done 589 | 590 | return 1; 591 | } 592 | 593 | mlc_peer_get() { 594 | 595 | local node=$1 596 | 597 | local links=$( ip link show | grep ${mlc_p2p_bridge_delimiter} | grep ${mlc_p2p_bridge_prefix}${node} | awk -F': ' '{print $2}' ) 598 | local link 599 | 600 | for link in $links; do 601 | printf "%s " $link 602 | done 603 | 604 | } 605 | 606 | mlc_peer_set() { 607 | 608 | local node_a=$1 609 | local node_b=$2 610 | 611 | if [ -z $node_a ] || [ -z $node_b ] ; then 612 | echo "usage: mlc_peer_set [idxA] [idxB]"; return 1; 613 | fi 614 | 615 | if [ "$node_a" == "$node_b" ] ; then 616 | return 0 617 | fi 618 | 619 | if [ "$node_a" -gt "$node_b" ] ; then 620 | local node_x=$node_a 621 | node_a=$node_b 622 | node_b=$node_x 623 | fi 624 | 625 | mlc_peer_clear $node_a $node_b 626 | 627 | local idx_a=${3:-"$(MLC_peer_alloc_idx $node_a )"} 628 | local idx_b=${4:-"$(MLC_peer_alloc_idx $node_b )"} 629 | 630 | if [ -z $idx_a ] || [ -z $idx_b ] ; then 631 | echo "ERROR: no idx available"; return 1; 632 | fi 633 | 634 | 635 | local veth_a="$(MLC_get_veth_cache $node_a $idx_a)" 636 | local veth_b="$(MLC_get_veth_cache $node_b $idx_b)" 637 | 638 | if ! ip link show dev $veth_a > /dev/null 2>&1 || ! ip link show dev $veth_b > /dev/null ; then 639 | echo "veth interfaces could not be found"; return 1; 640 | fi 641 | 642 | local bridge_name="${mlc_p2p_bridge_prefix}${node_a}${mlc_p2p_bridge_idx_delimiter}${idx_a}${mlc_p2p_bridge_delimiter}${mlc_p2p_bridge_prefix}${node_b}${mlc_p2p_bridge_idx_delimiter}${idx_b}" 643 | 644 | echo "creating bridge $bridge_name ifA $veth_a ifB $veth_b" 645 | 646 | brctl addbr $bridge_name 647 | brctl setfd $bridge_name 0 648 | ifconfig $bridge_name up 649 | ifconfig $bridge_name promisc 650 | 651 | 652 | brctl addif $bridge_name $veth_a 653 | brctl addif $bridge_name $veth_b 654 | 655 | # ebtables -I FORWARD -o $veth_a -j ACCEPT 656 | # ebtables -I FORWARD -o $veth_b -j ACCEPT 657 | } 658 | 659 | 660 | MLC_get_veth_cache() { 661 | 662 | local node=$1 663 | local idx=$2 664 | local name="${mlc_name_prefix}${node}" 665 | 666 | if lxc-info -n $name | grep -q RUNNING ; then 667 | echo "$( MLC_calc_veth_name $node $idx )"; return 0; 668 | fi 669 | 670 | echo "Failed to resolve if name for $name $idx"; return 1; 671 | 672 | } 673 | 674 | 675 | mlc_ls() { 676 | for name in $(lxc-ls | sort -u); do 677 | if lxc-info -n $name | grep -q RUNNING ; then 678 | printf "%-10s %-10s %s \n" $name "RUNNING " "$( mlc_peer_get $(echo $name | awk -F $mlc_name_prefix '{print $2}' ) )" 679 | 680 | fi 681 | done 682 | } 683 | 684 | 685 | MLC_veth_obtain() { 686 | #set -x 687 | local name= 688 | local dev= 689 | local cache_file="$mlc_tmp_dir/MLC_veth_obtain.tmp" 690 | 691 | printf "%-10s %-10s\n" "container:" "state:" 692 | 693 | for name in $(lxc-ls | grep $mlc_name_prefix | sort -u); do 694 | if echo "$name" | grep -q "$mlc_name_prefix" && lxc-info -n $name| grep -q RUNNING ; then 695 | printf "%-10s %-10s " $name "RUNNING" 696 | 697 | local node=$( echo $name | awk -F"$mlc_name_prefix" '{print $2}' ) 698 | local node_ip="$(MLC_calc_ip4 $mlc_ip4_admin_prefix1 $node $mlc_admin_idx )" 699 | 700 | if ping -n -c1 $node_ip > /dev/null ; then 701 | 702 | # for dev in $( $mlc_ssh root@$node_ip ip link | tee $cache_file | grep ": ${mlc_dev_prefix}" | grep -v "@" | awk -F ': ' '{print $2}' | sort -u) ; do 703 | for dev in $( lxc-attach -n $name -- ip link | tee $cache_file | grep ": ${mlc_dev_prefix}" | grep -v "@" | awk -F ': ' '{print $2}' | sort -u) ; do 704 | 705 | printf "%8s: " $dev 706 | 707 | 708 | local iif_lxc_line=$( cat $cache_file | grep " $dev:" ) 709 | if [ $? -ne 0 ]; then 710 | echo "Failed to resolve lxc iif for $name $d"; return 1 711 | fi 712 | 713 | local iif_lxc=$(echo $iif_lxc_line | awk -F ':' '{print $1}') 714 | 715 | let iif_host=$(( $iif_lxc + 1 )) 716 | if [ $? -ne 0 ]; then 717 | echo "Failed to calculate host ifi for $name $dev $iif_lxc"; return 1 718 | fi 719 | 720 | local host_dev=$(ip link show | grep -e "^$iif_host: $mlc_veth_prefix" ) 721 | if [ $? -ne 0 ]; then 722 | echo "Failed to resolve if name for $name $dev $iif_lxc $iif_host"; return 1 723 | fi 724 | 725 | 726 | local veth=$( echo $host_dev | awk -F ': ' '{print $2}' ) 727 | 728 | 729 | if [ "$veth" == "" ]; then 730 | printf "ERROR: interface error\n" 731 | echo "host_dev=$host_dev iif_host=$iif_host mlc_veth_prefix=$mlc_veth_prefix" 732 | else 733 | printf "%-10s " $veth 734 | fi 735 | 736 | done 737 | else 738 | printf "ERROR: not reachable" 739 | fi 740 | 741 | else 742 | printf "%-6s %-10s " "$name" "???" 743 | fi 744 | printf "\n" 745 | done 746 | 747 | } 748 | 749 | mlc_veth_obtain() { 750 | 751 | MLC_veth_obtain | tee $mlc_veth_cache 752 | 753 | } 754 | 755 | mlc_veth_show() { 756 | 757 | cat $mlc_veth_cache 758 | 759 | } 760 | 761 | 762 | mlc_veth_force_cleanup() { 763 | 764 | for dev in $(ip link show | grep $mlc_veth_prefix | awk -F ': ' '{print $2}') ; do 765 | if ip link show | grep ": $dev:" ; then 766 | echo "ip link delete dev $dev" 767 | ip link delete dev $dev 768 | else 769 | echo "ip link dev $dev already removed" 770 | fi 771 | done 772 | } 773 | 774 | 775 | mlc_net_flush() { 776 | ebtables -P FORWARD DROP 777 | ebtables --flush FORWARD 778 | ebtables -I FORWARD --logical-out mbr0 -j ACCEPT 779 | ebtables -I FORWARD --logical-in mbr0 -j ACCEPT 780 | # ebtables -I FORWARD --logical-out mlc0 -j DROP 781 | # ebtables -I FORWARD --logical-out mlc1 -j DROP 782 | # ebtables -I FORWARD --logical-out mlc2 -j DROP 783 | # ebtables -I FORWARD --logical-out mbr1 -j DROP 784 | # ebtables -I FORWARD --logical-out mbr2 -j DROP 785 | } 786 | 787 | 788 | mlc_qdisc_clear() { 789 | local idx_list=${1:-"1 2"} 790 | local idx 791 | 792 | # mlc_net_flush 793 | 794 | for idx in $idx_list ; do 795 | 796 | echo "clearing qdisc idx=$idx of idx_list=$idx_list" 797 | local dev 798 | 799 | for dev in $( tc qdisc | grep "qdisc prio 1: dev $mlc_veth_prefix" | grep "_$idx" | awk -F 'dev ' '{print $2}' | awk '{print $1 }' ) ; do 800 | echo "setting qdisc rules for dev $dev" 801 | tc qdisc del dev $dev root 802 | done 803 | 804 | done 805 | } 806 | 807 | MLC_qdisc_set_rule() { 808 | 809 | local dev=$1 810 | local mark=$2 811 | local delay=$3 812 | local delay_correlation=$4 813 | local loss=$5 814 | local loss_correlation=$6 815 | tc qdisc add dev $dev parent 1:$(printf "0x%X" $mark) netem loss $loss $loss_correlation delay $delay 816 | tc filter add dev $dev parent 1:0 protocol all prio 1 handle $(printf "0x%X" $mark) fw flowid 1:$(printf "0x%X" $mark) 817 | # tc filter add dev $dev parent 1:0 protocol ip prio 2 handle $(printf "0x%X" $mark) fw flowid 1:$(printf "0x%X" $mark) 818 | # tc filter add dev $dev parent 1:0 protocol ipv6 prio 3 handle $(printf "0x%X" $mark) fw flowid 1:$(printf "0x%X" $mark) 819 | } 820 | 821 | MLC_qdisc_set_rules() { 822 | local dev=$1 823 | 824 | if tc qdisc | grep -q "qdisc prio 1: dev $dev" ; then 825 | tc qdisc del dev $dev root 826 | fi 827 | 828 | tc qdisc add dev $dev root handle 1: prio bands 16 priomap 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 829 | # tc qdisc add dev $a_veth parent 1:1 netem loss 100% 830 | 831 | # delay corr loss correlation 832 | MLC_qdisc_set_rule $dev 3 0.1ms 0% 0% 0% #BroadCast 833 | MLC_qdisc_set_rule $dev 4 0.1ms 0% 0% 0% #UniCast 834 | 835 | MLC_qdisc_set_rule $dev 5 0.2ms 0% 10% 0% #BroadCast 836 | MLC_qdisc_set_rule $dev 6 0.4ms 0% 0% 0% # 0.2% #UniCast 837 | # MLC_qdisc_set_rule $dev 5 0.2ms 0% 0% 0% #BroadCast 838 | # MLC_qdisc_set_rule $dev 6 0.4ms 0% 2% 0% # 0.2% #UniCast 839 | 840 | MLC_qdisc_set_rule $dev 7 0.3ms 0% 20% 0% #BroadCast 841 | MLC_qdisc_set_rule $dev 8 1.6ms 0% 0% 0% #0.5% #UniCast 842 | # MLC_qdisc_set_rule $dev 7 0.3ms 0% 0% 0% #BroadCast 843 | # MLC_qdisc_set_rule $dev 8 1.6ms 0% 5% 0% #0.5% #UniCast 844 | 845 | MLC_qdisc_set_rule $dev 9 0.4ms 0% 30% 0% #BroadCast 846 | MLC_qdisc_set_rule $dev 10 6.4ms 0% 0% 0% #1% #UniCast 847 | # MLC_qdisc_set_rule $dev 9 0.4ms 0% 0% 0% #BroadCast 848 | # MLC_qdisc_set_rule $dev 10 6.4ms 0% 10% 0% #1% #UniCast 849 | 850 | MLC_qdisc_set_rule $dev 11 0.5ms 0% 40% 0% #BroadCast 851 | MLC_qdisc_set_rule $dev 12 25ms 0% 0% 0% #2% #UniCast 852 | # MLC_qdisc_set_rule $dev 11 0.5ms 0% 0% 0% #BroadCast 853 | # MLC_qdisc_set_rule $dev 12 25ms 0% 20% 0% #2% #UniCast 854 | 855 | MLC_qdisc_set_rule $dev 13 0.6ms 0% 50% 0% #0.8ms 25% BroadCast 856 | MLC_qdisc_set_rule $dev 14 100ms 0% 0% 0% #5% #UniCast 857 | # MLC_qdisc_set_rule $dev 13 0.6ms 0% 0% 0% #0.8ms 25% BroadCast 858 | # MLC_qdisc_set_rule $dev 14 100ms 0% 40% 0% #5% #UniCast 859 | 860 | MLC_qdisc_set_rule $dev 15 0.7ms 0% 60% 0% #1ms 40% BroadCast 861 | MLC_qdisc_set_rule $dev 16 400ms 0% 0% 0% #10% #UniCast 862 | # MLC_qdisc_set_rule $dev 15 0.7ms 0% 0% 0% #1ms 40% BroadCast 863 | # MLC_qdisc_set_rule $dev 16 400ms 0% 80% 0% #10% #UniCast 864 | 865 | } 866 | 867 | mlc_qdisc_prepare() { 868 | local idx_list=${1:-"0 1 2 3 6"} 869 | local idx 870 | for idx in $idx_list ; do 871 | echo "setting qdisc idx=$idx of idx_list=$idx_list" 872 | local dev 873 | for dev in $( cat $mlc_veth_cache | grep "RUNNING" | awk -F"${mlc_dev_prefix}${idx}:" '{print $2}' | awk '{print $1 }' ) ; do 874 | echo "setting qdisc rules for idx=$idx $dev" 875 | MLC_qdisc_set_rules $dev 876 | done 877 | done 878 | } 879 | 880 | MLC_link_get() { 881 | 882 | local src=$1 883 | local oif=$2 884 | local mark_mc mark_uc mark_bc 885 | 886 | 887 | # mark_mc="$(ebtables -L FORWARD | grep -ie "-s $src -d $mlc_mac6_multicast -o $oif -j mark --mark-set " | awk -F 'mark-set ' '{print $2}' | awk '{print $1}')" 888 | mark_bc="$(ebtables -L FORWARD | grep -ie "-s $src -d Broadcast -o $oif -j mark --mark-set " | awk -F 'mark-set ' '{print $2}' | awk '{print $1}')" 889 | mark_uc="$(ebtables -L FORWARD | grep -ie "-s $src -o $oif -j mark --mark-set " | awk -F 'mark-set ' '{print $2}' | awk '{print $1}')" 890 | 891 | echo "obtaining old lq for src $src oif $oif mark $mark_mc $mark_bc $mark_uc" >&2 892 | 893 | if [ -z $mark_mc ] && [ -z $mark_bc ] && [ -z $mark_uc ]; then 894 | echo 0; 895 | return 0; 896 | fi 897 | 898 | 899 | if [ "$(( $mark_bc + 1 ))" != "$(( $mark_uc ))" ] ; then 900 | echo "Failed to obtain old lq for src $src oif $oif mark $mark_bc $mark_uc" >&2 901 | return 1; 902 | fi 903 | 904 | echo "$(( $mark_bc ))" 905 | 906 | } 907 | 908 | 909 | mlc_link_clear() { 910 | 911 | local src_long="$1" 912 | local src="$(MLC_transform_long_mac $src_long)" 913 | local oif="$2" 914 | 915 | echo "mlc_link: src=$src_long -> oif=$oif " 916 | 917 | for mark in $(ebtables -L FORWARD | grep -ie "-s $src -o $oif -j mark --mark-set " | awk -F 'mark-set ' '{print $2}' | awk '{print $1}') ; do 918 | ebtables -D FORWARD -s $src -o $oif -j mark --mark-set $mark --mark-target ACCEPT 919 | done 920 | 921 | for mark in $(ebtables -L FORWARD | grep -ie "-s $src -d Broadcast -o $oif -j mark --mark-set " | awk -F 'mark-set ' '{print $2}' | awk '{print $1}') ; do 922 | ebtables -D FORWARD -s $src -d Broadcast -o $oif -j mark --mark-set $mark --mark-target ACCEPT 923 | done 924 | 925 | for mark in $(ebtables -L FORWARD | grep -ie "-s $src -d $mlc_mac6_multicast -o $oif -j mark --mark-set " | awk -F 'mark-set ' '{print $2}' | awk '{print $1}') ; do 926 | ebtables -D FORWARD -s $src -d $mlc_mac6_multicast -o $oif -j mark --mark-set $mark --mark-target ACCEPT 927 | done 928 | 929 | } 930 | 931 | mlc_link_set() { 932 | 933 | local cmd="mlc_link_set" 934 | 935 | if [ -z $1 ] || [ -z $2 ] || [ -z $3 ] || [ -z $4 ] || [ -z $5 ]; then 936 | printf "usage: $cmd ifnA nodeA ifnB nodeB txA txB purgeFlag \n" 937 | printf "example: $cmd 1 $mlc_min_node 1 $(( $mlc_min_node + 1 )) 3 [13] [1] \n" 938 | return 1 939 | fi 940 | 941 | local a_ifn=$1 942 | local a_node=$2 943 | local b_ifn=$3 944 | local b_node=$4 945 | local a_tq=$5 946 | local b_tq=${6:-$a_tq} 947 | local purge=${7:-1} 948 | 949 | 950 | local a_mark_bc=$a_tq #0x2 #2,4,6,..14 951 | local a_mark_uc=$(( $a_mark_bc + 1 )) 952 | local b_mark_bc=$b_tq #0x2 #2,4,6,..14 953 | local b_mark_uc=$(( $b_mark_bc + 1 )) 954 | 955 | local a_mac="$( MLC_calc_mac $a_node $a_ifn )" 956 | local b_mac="$( MLC_calc_mac $b_node $b_ifn )" 957 | local a_veth 958 | local b_veth 959 | 960 | a_veth="$( MLC_get_veth_cache $a_node $a_ifn )" 961 | if [ $? -ne 0 ]; then 962 | echo "Failed to resolve veth for $a_veth" 963 | return 1 964 | fi 965 | 966 | b_veth="$( MLC_get_veth_cache $b_node $b_ifn )" 967 | if [ $? -ne 0 ]; then 968 | echo "Failed to resolve veth for $b_veth" 969 | return 1 970 | fi 971 | 972 | echo mlc_link_set ${mlc_dev_prefix}$a_ifn $a_node $a_veth TQ=$a_tq -- ${mlc_dev_prefix}$b_ifn $b_node $b_veth TQ=$b_tq 973 | 974 | [ "$a_tq" != "0" ] || [ "$purge" != "0" ] && mlc_link_clear $a_mac $b_veth 975 | 976 | if [ "$a_tq" != "0" ] ; then 977 | ebtables -A FORWARD -s $a_mac -d $mlc_mac6_multicast -o $b_veth -j mark --set-mark $(printf "0x%X" $a_mark_bc) --mark-target ACCEPT 978 | ebtables -A FORWARD -s $a_mac -d Broadcast -o $b_veth -j mark --set-mark $(printf "0x%X" $a_mark_bc) --mark-target ACCEPT 979 | ebtables -A FORWARD -s $a_mac -o $b_veth -j mark --set-mark $(printf "0x%X" $a_mark_uc) --mark-target ACCEPT 980 | fi 981 | 982 | [ "$b_tq" != "0" ] || [ "$purge" != "0" ] && mlc_link_clear $b_mac $a_veth 983 | 984 | if [ "$b_tq" != "0" ] ; then 985 | ebtables -A FORWARD -s $b_mac -d $mlc_mac6_multicast -o $a_veth -j mark --set-mark $(printf "0x%X" $b_mark_bc) --mark-target ACCEPT 986 | ebtables -A FORWARD -s $b_mac -d Broadcast -o $a_veth -j mark --set-mark $(printf "0x%X" $b_mark_bc) --mark-target ACCEPT 987 | ebtables -A FORWARD -s $b_mac -o $a_veth -j mark --set-mark $(printf "0x%X" $b_mark_uc) --mark-target ACCEPT 988 | fi 989 | 990 | } 991 | 992 | mlc_mac_set() { 993 | 994 | [ -z $1 ] && \ 995 | echo "example: mlc_mac_set " && \ 996 | echo "example: mlc_mac_set 1 1001 ${mlc_dev_prefix}0 p00:00:00:00:00:AA 3 " && \ 997 | return 1 998 | 999 | local ifn=$1 1000 | local a=$2 1001 | local dev=$3 1002 | local dev_mac=$4 1003 | local lq=$5 1004 | 1005 | local mark_bc=$lq #0x2 #2,4,6,..14 1006 | local mark_uc=$(( $mark_bc + 1 )) 1007 | 1008 | local a_mac="$( MLC_calc_mac $a $ifn )" 1009 | 1010 | local a_veth 1011 | 1012 | a_veth="$( MLC_get_veth_cache $a $ifn )" 1013 | if [ $? -ne 0 ]; then 1014 | echo "Failed to resolve veth for $a_veth" 1015 | return 1 1016 | fi 1017 | 1018 | echo mlc_mac_set $a $a_veth $a_mac -- $dev_mac $dev dev=${mlc_dev_prefix}$ifn LQ=$lq 1019 | 1020 | mlc_link_clear $dev_mac $a_veth 1021 | 1022 | [ "$lq" != "0" ] && ebtables -A FORWARD -s $dev_mac -d $mlc_mac6_multicast -o $a_veth -j mark --set-mark $(printf "0x%X" $mark_bc) --mark-target ACCEPT 1023 | [ "$lq" != "0" ] && ebtables -A FORWARD -s $dev_mac -d Broadcast -o $a_veth -j mark --set-mark $(printf "0x%X" $mark_bc) --mark-target ACCEPT 1024 | [ "$lq" != "0" ] && ebtables -A FORWARD -s $dev_mac -o $a_veth -j mark --set-mark $(printf "0x%X" $mark_uc) --mark-target ACCEPT 1025 | 1026 | mlc_link_clear $a_mac $dev 1027 | 1028 | [ "$lq" != "0" ] && ebtables -A FORWARD -s $a_mac -d $mlc_mac6_multicast -o $dev -j mark --set-mark $(printf "0x%X" $mark_bc) --mark-target ACCEPT 1029 | [ "$lq" != "0" ] && ebtables -A FORWARD -s $a_mac -d Broadcast -o $dev -j mark --set-mark $(printf "0x%X" $mark_bc) --mark-target ACCEPT 1030 | [ "$lq" != "0" ] && ebtables -A FORWARD -s $a_mac -o $dev -j mark --set-mark $(printf "0x%X" $mark_uc) --mark-target ACCEPT 1031 | 1032 | ifconfig $dev up 1033 | 1034 | local br; for br in $( brctl show | grep mlc | awk '{print $1}'); do brctl delif $br $dev ; echo "in bridge $br"; done 1035 | 1036 | brctl show $mlc_bridge_prefix$ifn | grep "$dev$" || \ 1037 | brctl addif $mlc_bridge_prefix$ifn $dev 1038 | 1039 | MLC_qdisc_set_rules $dev 1040 | MLC_qdisc_set_rules $a_veth 1041 | } 1042 | 1043 | mlc_link_periodicy() { 1044 | local cmd="mlc_link_periodicy" 1045 | local lq_default="15 13 11 9 7 5 3 3 5 7 9 11 13 15 " 1046 | 1047 | if [ -z $1 ] || [ -z $2 ] || [ -z $3 ]; then 1048 | printf "usage: $cmd ifn nodea nodeb pause [s] duration [s] \"lq1 lq2 ...\"\n" 1049 | printf "example: $cmd 1 100 109 1 100 \"$lq_default\" \n" 1050 | return 1 1051 | fi 1052 | 1053 | local ifn=$1 1054 | local a=$2 1055 | local b=$3 1056 | local period="${4:-1}" 1057 | local duration="${5:-14}" 1058 | local lqs="${6:-$lq_default}" 1059 | 1060 | local a_mac="$( MLC_calc_mac $a $ifn )" 1061 | 1062 | local b_veth 1063 | local lq_old 1064 | 1065 | b_veth="$( MLC_get_veth_cache $b $ifn )" 1066 | if [ $? -ne 0 ]; then 1067 | echo "Failed to resolve veth for mlc$b" 1068 | return 1 1069 | fi 1070 | 1071 | lq_old="$( MLC_link_get $a_mac $b_veth )" 1072 | if [ $? -ne 0 ]; then 1073 | echo "Failed to resolve link-qualtiy for link $ifn $a -- $b $a_mac $b_veth" 1074 | return 1 1075 | fi 1076 | 1077 | printf "varying link-quality of channel $ifn link $a -- $b range [$lqa..$lqb] $lq_old period $period s for $duration s \n" 1078 | 1079 | local start="$(date +%s)" 1080 | local stop=$(( start + duration )) 1081 | 1082 | echo $start $stop 1083 | 1084 | while [ $stop -ge $(date +%s) ]; do 1085 | for lq in $lqs; do 1086 | mlc_link_set $ifn $a $ifn $b $lq 1087 | sleep $(( $period )) 1088 | done 1089 | done 1090 | 1091 | mlc_link_set $ifn $a $ifn $b $(( $lq_old )) 1092 | 1093 | } 1094 | 1095 | 1096 | 1097 | mlc_get_max_node() { 1098 | local node="" 1099 | local max_node="" 1100 | for node in $( mlc_veth_show | grep RUNNING | awk '{print $1}' | awk -F 'mlc' {'print $2}' ) ; do 1101 | max_node=$node 1102 | done 1103 | [ -z $max_node ] && return 1 1104 | echo $max_node 1105 | } 1106 | 1107 | 1108 | mlc_configure_line() { 1109 | [ -z $1 ] &&\ 1110 | echo "mlc_configure_line [tq] [loop_tq] [max_node] [rq] [loop_rq] [min_node] [purgeFlag]" &&\ 1111 | echo "example: mlc_configure_line 1 [3] [5] [$mlc_max_node] [13] [15] [$mlc_min_node] [1]" &&\ 1112 | return 1 1113 | 1114 | #assign default values see:http://snipplr.com/view/11080/setting-default-value-for-bash-variable/ 1115 | local ifn=$1 1116 | local tq=${2:-3} # assign default value of 3 if $2 is not set 1117 | local loop_tq=${3:-0} 1118 | local max=${4:-$( mlc_get_max_node )} 1119 | local rq=${5:-$tq} # assign default value of 3 if $2 is not set 1120 | local loop_rq=${6:-$loop_tq} 1121 | 1122 | local min=${7:-$mlc_min_node} 1123 | local purge=${8:-$1} 1124 | 1125 | 1126 | 1127 | for node in $( seq $min $max ) ; do 1128 | if [ $node -ne $max ] ; then 1129 | mlc_link_set $ifn $node $ifn $(( $node + 1 )) $tq $rq $purge 1130 | else 1131 | mlc_link_set $ifn $node $ifn $min $loop_tq $loop_rq $purge 1132 | fi 1133 | done 1134 | 1135 | } 1136 | 1137 | 1138 | 1139 | mlc_configure_grid() { 1140 | [ -z $1 ] &&\ 1141 | echo "mlc_configure_grid [lq] [loop_x_lq] [loop_y_lq] [0=ortographic,1=diagonal] [distance] [max_node] [min_node] [rq] [loop_x_rq] [loop_y_rq] [columns] [purge]" &&\ 1142 | echo "example: mlc_configure_grid 1 9 0 0 0 1 119 10 1 # configures a grid of 2x10 nodes with links to each 1 hop-neighbor of lq=3 and purge previous affected links" &&\ 1143 | echo "example: mlc_configure_grid 1 # will do the same with all nodes and lq=3" &&\ 1144 | return 1 1145 | 1146 | local ifn=$1 1147 | local default_lq=${2:-3} 1148 | local loop_x_lq=${3:-0} 1149 | local loop_y_lq=${4:-0} 1150 | local diagonal=${5:-0} 1151 | local distance=${6:-1} 1152 | local max=$( mlc_get_max_node ) 1153 | local max=${7:-$max} 1154 | local min=${8:-$mlc_min_node} 1155 | local default_rq=${9:-$default_lq} 1156 | local loop_x_rq=${10:-$loop_x_lq} 1157 | local loop_y_rq=${11:-$loop_y_lq} 1158 | local row_size=${12:-$10} 1159 | local purge=${13:-1} 1160 | 1161 | local x_max=$(( $row_size - 1 )) 1162 | local y_max=$(( ( ( ( $max - $min ) + 1 ) / $row_size ) - 1 )) 1163 | 1164 | local col_size=$(( $y_max + 1 )) 1165 | 1166 | local x0 x1 y0 y1 x_wrap y_wrap x_curr y_curr curr x_next y_next right_lq down_lq right_rq down_rq 1167 | 1168 | echo "$0 ifn=$ifn lq=$default_lq/$default_rq x_lq=$loop_x_lq/$loop_x_rq y_lq=$loop_y_lq/$loop_y_rq diagonal=$diagonal distance=$distance min=$min max=$max x_max=$x_max y_max=$y_max row_size=$row_size" 1169 | 1170 | for y0 in $( seq 0 $y_max ) ; do 1171 | let y1=$(( $y0 + $distance )) 1172 | 1173 | for x0 in $( seq 0 $x_max ) ; do 1174 | let x1=$(( $x0 + $distance )) 1175 | 1176 | let x_wrap=$(( $x_max - $distance )) 1177 | let y_wrap=$(( $y_max - $distance )) 1178 | let x_curr=$x0 1179 | let y_curr=$(( ( $row_size * $y0 ) )) 1180 | # let curr=$(( $min + $y_curr + $x_curr )) 1181 | 1182 | if [ $x0 -le $x_wrap ] ; then 1183 | let x_next=$(( $x1 - 000000000 )) 1184 | else 1185 | let x_next=$(( $x1 - $row_size )) 1186 | fi 1187 | 1188 | # prepare link to down neighbor 1189 | if [ $y0 -le $y_wrap ] ; then 1190 | let y_next=$(( $row_size * ( $y1 - 000000000 ) )) 1191 | else 1192 | let y_next=$(( $row_size * ( $y1 - $col_size ) )) 1193 | fi 1194 | 1195 | 1196 | if [ "$diagonal" == "0" ] ; then 1197 | 1198 | # prepare link to right neighbor 1199 | if [ $x0 -le $x_wrap ] ; then 1200 | let right_lq=$default_lq 1201 | let right_rq=$default_rq 1202 | else 1203 | let right_lq=$loop_x_lq 1204 | let right_rq=$loop_x_rq 1205 | fi 1206 | 1207 | # prepare link to down neighbor 1208 | if [ $y0 -le $y_wrap ] ; then 1209 | let down_lq=$default_lq 1210 | let down_rq=$default_rq 1211 | else 1212 | let down_lq=$loop_y_lq 1213 | let down_rq=$loop_y_rq 1214 | fi 1215 | 1216 | # configure link to right neighbor 1217 | mlc_link_set $ifn $(( $min + $y_curr + $x_curr )) $ifn $(( $min + $y_curr + $x_next )) $right_lq $right_rq $purge 1218 | # configure link to down neighbor 1219 | mlc_link_set $ifn $(( $min + $y_curr + $x_curr )) $ifn $(( $min + $y_next + $x_curr )) $down_lq $down_rq $purge 1220 | 1221 | else 1222 | 1223 | if [ $x0 -le $x_wrap ] && [ $y0 -le $y_wrap ]; then 1224 | let right_lq=$default_lq 1225 | let right_rq=$default_rq 1226 | let down_lq=$default_lq 1227 | let down_rq=$default_rq 1228 | else 1229 | let right_lq=$loop_x_lq 1230 | let right_rq=$loop_x_rq 1231 | let down_lq=$loop_y_lq 1232 | let down_rq=$loop_y_rq 1233 | fi 1234 | 1235 | # configure diagonal link to down-right neighbor 1236 | mlc_link_set $ifn $(( $min + $y_curr + $x_curr )) $ifn $(( $min + $y_next + $x_next )) $right_lq $right_rq $purge 1237 | # configure diagonal link from right neighbor to down neighbor 1238 | mlc_link_set $ifn $(( $min + $y_curr + $x_next )) $ifn $(( $min + $y_next + $x_curr )) $down_lq $down_rq $purge 1239 | 1240 | fi 1241 | 1242 | done 1243 | done 1244 | } 1245 | 1246 | 1247 | 1248 | mlc_ns3_prepare() { 1249 | 1250 | for idx in $( seq $mlc_ns3_idx_min $mlc_ns3_idx_max ) ; do 1251 | ebtables -I FORWARD -s $mlc_mac_prefix:0:0:$idx/FF:FF:FF:0:0:FF -j ACCEPT 1252 | done 1253 | 1254 | } 1255 | 1256 | 1257 | mlc_ns3_connect() { 1258 | 1259 | [ -z $1 ] &&\ 1260 | echo "mlc_ns3_connect [dev_idx] [min_node] [max_node] [tap-offset] [tap-prefix] [br-prefix]" &&\ 1261 | return 1 1262 | 1263 | local idx=${2:-$mlc_ns3_idx_min} 1264 | local min=${3:-$mlc_min_node} 1265 | local max=${4:-$( mlc_get_max_node )} 1266 | local tap_prefix=${5:-"NTP"} 1267 | local br_prefix=${6:-"NBR"} 1268 | local offset=${7:-2} 1269 | 1270 | echo "idx=$idx min=$min max=$max tap_prefix=$tap_prefix br_prefix=$br_prefix offset=$offset" 1271 | local node 1272 | 1273 | for node in $( seq $min $max ) ; do 1274 | 1275 | local tap_num=$(( ($node - $min) + $offset )) 1276 | local bridge_name="${br_prefix}${node}" 1277 | local tap_name="${tap_prefix}${node}" 1278 | local veth_name="$(MLC_get_veth_cache $node $idx)" 1279 | 1280 | brctl addbr $bridge_name 1281 | brctl setfd $bridge_name 0 1282 | ifconfig $bridge_name up 1283 | ifconfig $bridge_name promisc 1284 | 1285 | ifconfig $veth_name 0.0.0.0 promisc up 1286 | brctl addif $bridge_name $veth_name 1287 | 1288 | tunctl -t $tap_name 1289 | ifconfig $tap_name 0.0.0.0 promisc up 1290 | brctl addif $bridge_name $tap_name 1291 | 1292 | 1293 | done 1294 | 1295 | 1296 | } 1297 | 1298 | 1299 | mlc_peer_grid() { 1300 | [ -z $1 ] &&\ 1301 | echo "mlc_configure_grid [lq] [loop_x_lq] [loop_y_lq] [0=ortographic,1=diagonal] [distance] [max_node] [min_node] [rq] [loop_x_rq] [loop_y_rq] [columns]" &&\ 1302 | echo "example: mlc_configure_grid 1 9 0 0 0 1 119 10 # configures a grid of 2x10 nodes with links to each 1 hop-neighbor of lq=3" &&\ 1303 | echo "example: mlc_configure_grid 1 # will do the same with all nodes and lq=3" &&\ 1304 | return 1 1305 | 1306 | local ifn=$1 1307 | local default_lq=${2:-3} 1308 | local loop_x_lq=${3:-0} 1309 | local loop_y_lq=${4:-0} 1310 | local diagonal=${5:-0} 1311 | local distance=${6:-1} 1312 | local max=$( mlc_get_max_node ) 1313 | local max=${7:-$max} 1314 | local min=${8:-$mlc_min_node} 1315 | local default_rq=${9:-$default_lq} 1316 | local loop_x_rq=${10:-$loop_x_lq} 1317 | local loop_y_rq=${11:-$loop_y_lq} 1318 | local row_size=${12:-$10} 1319 | 1320 | local x_max=$(( $row_size - 1 )) 1321 | local y_max=$(( ( ( ( $max - $min ) + 1 ) / $row_size ) - 1 )) 1322 | 1323 | local col_size=$(( $y_max + 1 )) 1324 | 1325 | local x0 x1 y0 y1 x_wrap y_wrap x_curr y_curr curr x_next y_next right_lq down_lq right_rq down_rq 1326 | 1327 | echo "$0 ifn=$ifn lq=$default_lq/$default_rq x_lq=$loop_x_lq/$loop_x_rq y_lq=$loop_y_lq/$loop_y_rq diagonal=$diagonal distance=$distance min=$min max=$max x_max=$x_max y_max=$y_max row_size=$row_size" 1328 | 1329 | for y0 in $( seq 0 $y_max ) ; do 1330 | let y1=$(( $y0 + $distance )) 1331 | 1332 | for x0 in $( seq 0 $x_max ) ; do 1333 | let x1=$(( $x0 + $distance )) 1334 | 1335 | let x_wrap=$(( $x_max - $distance )) 1336 | let y_wrap=$(( $y_max - $distance )) 1337 | let x_curr=$x0 1338 | let y_curr=$(( ( $row_size * $y0 ) )) 1339 | # let curr=$(( $min + $y_curr + $x_curr )) 1340 | 1341 | if [ $x0 -le $x_wrap ] ; then 1342 | let x_next=$(( $x1 - 000000000 )) 1343 | else 1344 | let x_next=$(( $x1 - $row_size )) 1345 | fi 1346 | 1347 | # prepare link to down neighbor 1348 | if [ $y0 -le $y_wrap ] ; then 1349 | let y_next=$(( $row_size * ( $y1 - 000000000 ) )) 1350 | else 1351 | let y_next=$(( $row_size * ( $y1 - $col_size ) )) 1352 | fi 1353 | 1354 | 1355 | if [ "$diagonal" == "0" ] ; then 1356 | 1357 | # prepare link to right neighbor 1358 | if [ $x0 -le $x_wrap ] ; then 1359 | let right_lq=$default_lq 1360 | let right_rq=$default_rq 1361 | else 1362 | let right_lq=$loop_x_lq 1363 | let right_rq=$loop_x_rq 1364 | fi 1365 | 1366 | # prepare link to down neighbor 1367 | if [ $y0 -le $y_wrap ] ; then 1368 | let down_lq=$default_lq 1369 | let down_rq=$default_rq 1370 | else 1371 | let down_lq=$loop_y_lq 1372 | let down_rq=$loop_y_rq 1373 | fi 1374 | 1375 | # configure link to right neighbor 1376 | # mlc_link_set $ifn $(( $min + $y_curr + $x_curr )) $ifn $(( $min + $y_curr + $x_next )) $right_lq $right_rq 1377 | mlc_peer_set $(( $min + $y_curr + $x_curr )) $(( $min + $y_curr + $x_next )) 1378 | # configure link to down neighbor 1379 | # mlc_link_set $ifn $(( $min + $y_curr + $x_curr )) $ifn $(( $min + $y_next + $x_curr )) $down_lq $down_rq 1380 | mlc_peer_set $(( $min + $y_curr + $x_curr )) $(( $min + $y_next + $x_curr )) 1381 | 1382 | else 1383 | 1384 | if [ $x0 -le $x_wrap ] && [ $y0 -le $y_wrap ]; then 1385 | let right_lq=$default_lq 1386 | let right_rq=$default_rq 1387 | let down_lq=$default_lq 1388 | let down_rq=$default_rq 1389 | else 1390 | let right_lq=$loop_x_lq 1391 | let right_rq=$loop_x_rq 1392 | let down_lq=$loop_y_lq 1393 | let down_rq=$loop_y_rq 1394 | fi 1395 | 1396 | # configure diagonal link to down-right neighbor 1397 | # mlc_link_set $ifn $(( $min + $y_curr + $x_curr )) $ifn $(( $min + $y_next + $x_next )) $right_lq $right_rq 1398 | mlc_peer_set $(( $min + $y_curr + $x_curr )) $(( $min + $y_next + $x_next )) 1399 | # configure diagonal link from right neighbor to down neighbor 1400 | # mlc_link_set $ifn $(( $min + $y_curr + $x_next )) $ifn $(( $min + $y_next + $x_curr )) $down_lq $down_rq 1401 | mlc_peer_set $(( $min + $y_curr + $x_next )) $(( $min + $y_next + $x_curr )) 1402 | 1403 | fi 1404 | 1405 | done 1406 | done 1407 | } 1408 | 1409 | MLC_get_input_args() { 1410 | 1411 | if ! getopt -V | grep enhanced > /dev/null; then 1412 | echo "Old getopt(1). You need the enhanced getopt to let this work !" 1413 | return 1 1414 | fi 1415 | 1416 | if ! ipcalc -v > /dev/null; then 1417 | echo "Missing ipcalc You need ipcalc to let this work !" 1418 | return 1 1419 | fi 1420 | 1421 | if ! debootstrap --help > /dev/null; then 1422 | echo "'debootstrap' command is missing" 1423 | return 1 1424 | fi 1425 | 1426 | # echo MLC_get_input_args $@ || return 1 1427 | 1428 | TEMP=$(getopt -o hn:p:m: --long help,name:,path:,mother:,id: -- "$@") 1429 | if [ $? != 0 ] ; then echo "Terminating..." >&2 ; return 1 ; fi 1430 | 1431 | # Note the quotes around `$TEMP': they are essential! 1432 | eval set -- "$TEMP" 1433 | 1434 | while true ; do 1435 | # echo evaluating $@ 1436 | case "$1" in 1437 | --id) MLC_assign_networks $2 ; shift 2 ;; 1438 | --) shift ; break ;; 1439 | *) echo "Internal error!" ; return 1 ;; 1440 | esac 1441 | done 1442 | 1443 | if [ "$1" != "" ] ; then echo "found illegal commands: $@" ; return 1 ; fi 1444 | 1445 | 1446 | if [ ! -d "$mlc_conf_dir" ]; then 1447 | echo "specified path to mlc configs and rootfs '$mlc_conf_dir' does not exist" 1448 | return 1 1449 | fi 1450 | 1451 | if [ ! -d "$mlc_path_dir" ]; then 1452 | echo "specified path to mlc home dir: '$mlc_path_dir' does not exist" 1453 | return 1 1454 | fi 1455 | 1456 | if [ "$(id -u)" != "0" ]; then 1457 | echo "This script should be run as 'root'" 1458 | return 1 1459 | fi 1460 | 1461 | } 1462 | 1463 | 1464 | MLC_configure_individual() { 1465 | 1466 | local vm_id=$1 1467 | local vm_name="${mlc_name_prefix}${vm_id}" 1468 | 1469 | local vm_rootfs=$mlc_conf_dir/$vm_name/rootfs 1470 | 1471 | local mother_name="${mlc_name_prefix}${mlc_mother_id}" 1472 | 1473 | echo MLC_configure_individual "vm_id=$vm_id vm_name=$vm_name" 1474 | 1475 | # cp -ar $mlc_path_dir/files/* $vm_rootfs 1476 | # http://stackoverflow.com/questions/2193584/copy-folder-recursively-excluding-some-folders 1477 | # putting things in files/usr/ does not work because it'll be overmounted anyway! 1478 | 1479 | if [ "$vm_name" == "$mother_name" ] ; then 1480 | rsync -av --exclude='.svn' --exclude='.git' $mlc_path_dir/files/* $vm_rootfs/ 1481 | else 1482 | rsync -av --exclude='.svn' --exclude='.git' $mlc_path_dir/files/etc $vm_rootfs/ 1483 | fi 1484 | 1485 | mkdir -p $vm_rootfs/etc/config 1486 | 1487 | # enable root ssh login: 1488 | cat < $vm_rootfs/etc/ssh/sshd_config 1489 | PermitRootLogin yes 1490 | EOF 1491 | 1492 | # set the hostname 1493 | cat < $vm_rootfs/etc/hostname 1494 | $vm_name 1495 | EOF 1496 | 1497 | # set the nameserver 1498 | cat < $mother_rootfs/etc/resolv.conf 1499 | nameserver $mlc_dns 1500 | EOF 1501 | 1502 | # configure the network using static IPs 1503 | cat < $vm_rootfs/etc/network/interfaces 1504 | 1505 | auto lo 1506 | iface lo inet loopback 1507 | up /sbin/ip -4 addr add $mlc_netLo_ip4_addr/$mlc_netLo_ip4_mask dev $mlc_netLo_name 1508 | up /sbin/ip -6 addr add $mlc_netLo_ula_addr/$mlc_netLo_ula_mask dev $mlc_netLo_name 1509 | 1510 | 1511 | auto $mlc_net0_name 1512 | iface $mlc_net0_name inet static 1513 | address $mlc_net0_ip4_addr 1514 | netmask $mlc_net0_ip4_mask 1515 | broadcast $mlc_net0_ip4_brc 1516 | mtu $mlc_net_mtu 1517 | up route add default gw $mlc_net0_ip4_gw 1518 | 1519 | 1520 | ######################################################### 1521 | ######################################################### 1522 | # MESH interfaces: 1523 | 1524 | auto $mlc_net1_name 1525 | iface $mlc_net1_name inet static 1526 | mtu $mlc_net_mtu 1527 | 1528 | auto $mlc_net11_name 1529 | iface $mlc_net11_name inet static 1530 | address $mlc_net11_ip4_addr 1531 | netmask $mlc_net11_ip4_mask 1532 | broadcast $mlc_net11_ip4_brc 1533 | vlan_raw_device $mlc_net1_name 1534 | up /sbin/ip -6 addr add $mlc_net11_ula_addr/$mlc_net11_ula_mask dev $mlc_net11_name 1535 | # up /sbin/ip -6 addr add $mlc_net11_rip_addr/$mlc_net11_rip_mask dev $mlc_net11_name 1536 | 1537 | 1538 | auto $mlc_net2_name 1539 | iface $mlc_net2_name inet static 1540 | mtu $mlc_net_mtu 1541 | 1542 | EOF 1543 | 1544 | 1545 | 1546 | # configure bmxd 1547 | cat < $vm_rootfs/etc/config/bmx 1548 | 1549 | config 'bmx' 'general' 1550 | 1551 | option 'ogm_interval' '500' 1552 | option 'aggreg_interval' '200' 1553 | 1554 | option 'dbg_mute_timeout' '0' 1555 | 1556 | option 'http_info_port' '8099' 1557 | option 'http_info_global_access' '1' 1558 | 1559 | config 'plugin' 1560 | option 'plugin' 'bmx_http_info.so' 1561 | 1562 | config 'dev' 1563 | option 'dev' "${mlc_dev_prefix}1" # 1564 | option 'linklayer' '2' 1565 | option 'clone' '200' 1566 | 1567 | config 'dev' 1568 | option 'dev' "${mlc_dev_prefix}2" 1569 | option 'linklayer' '2' 1570 | option 'clone' '200' 1571 | 1572 | EOF 1573 | 1574 | 1575 | # configure babeld 1576 | cat < $vm_rootfs/etc/babeld.conf 1577 | 1578 | ## http://battlemesh.org/BattleMeshV4/NodeConfig 1579 | ## http://lists.alioth.debian.org/pipermail/babel-users/2008-March/000074.html 1580 | 1581 | redistribute local if $mlc_net1_name ip $mlc_ip6_ula3_prefix::/48 ge 48 1582 | redistribute local deny 1583 | redistribute deny 1584 | 1585 | EOF 1586 | 1587 | # configure bmx6 1588 | cat < $vm_rootfs/etc/config/bmx6 1589 | 1590 | config 'bmx6' 'general' 1591 | option 'tunOutTimeout' '5000' 1592 | 1593 | config 'plugin' 1594 | option 'plugin' 'bmx6_config.so' 1595 | 1596 | config 'plugin' 1597 | option 'plugin' 'bmx6_json.so' 1598 | 1599 | config 'plugin' 1600 | option 'plugin' 'bmx6_sms.so' 1601 | 1602 | config 'plugin' 1603 | option 'plugin' 'bmx6_table.so' 1604 | 1605 | config 'plugin' 1606 | option 'plugin' 'bmx6_topology.so' 1607 | 1608 | 1609 | 1610 | #config 'ipVersion' 1611 | # option 'ipVersion' '6' 1612 | # option 'throwRules' '0' 1613 | # option tableTuns 61 1614 | # option tablePrefTuns 6001 1615 | 1616 | config dev 1617 | # option dev $mlc_net12_name 1618 | option dev $mlc_net1_name 1619 | 1620 | config 'tunDev' default 1621 | option 'tunDev' 'default' 1622 | option tun6Address $mlc_ip6_ripe2_prefix:$vm_id::1/64 1623 | option tun4Address 10.$(( ( $vm_id / 100 ) )).$(( $vm_id % 100 )).1/24 1624 | 1625 | config 'tunOut' ip6 1626 | option 'tunOut' 'ip6' 1627 | option 'network' '$mlc_ip6_ripe2_prefix::/16' 1628 | # option 'exportDistance' '0' 1629 | # option 'ipMetric' '2000' 1630 | 1631 | config 'tunOut' ip4 1632 | option 'tunOut' 'ip4' 1633 | option 'network' '10.111.0.0/16' 1634 | # option 'ipMetric' '2000' 1635 | 1636 | 1637 | config 'redistTable' 1638 | option 'redistTable' 'bla' 1639 | option 'table' '100' 1640 | option 'all' '1' 1641 | option 'sys' '60' 1642 | 1643 | config 'redistTable' 1644 | option 'redistTable' 'myBird' 1645 | option 'table' '100' 1646 | option 'all' '1' 1647 | option 'sys' '12' 1648 | 1649 | EOF 1650 | 1651 | 1652 | # configure bmx7 1653 | cat < $vm_rootfs/etc/config/bmx7 1654 | 1655 | #config 'bmx7' 'general' 1656 | # option 'trustedNodesDir' '/etc/bmx7/trustedNodes' 1657 | # option 'tunOutTimeout' '5000' 1658 | # option 'descCompression' '1' 1659 | 1660 | config 'plugin' 1661 | option 'plugin' 'bmx7_config.so' 1662 | 1663 | config 'plugin' 1664 | option 'plugin' 'bmx7_json.so' 1665 | 1666 | config 'plugin' 1667 | option 'plugin' 'bmx7_sms.so' 1668 | 1669 | config 'plugin' 1670 | option 'plugin' 'bmx7_tun.so' 1671 | 1672 | config 'plugin' 1673 | option 'plugin' 'bmx7_topology.so' 1674 | 1675 | #config 'plugin' 1676 | # option 'plugin' 'bmx7_iwinfo.so' 1677 | 1678 | config 'plugin' 1679 | option 'plugin' 'bmx7_table.so' 1680 | 1681 | #config 'ipVersion' 1682 | # option 'ipVersion' '6' 1683 | # option 'throwRules' '0' 1684 | # option tableTuns 61 1685 | # option tablePrefTuns 6001 1686 | 1687 | config dev 1688 | option dev $mlc_net1_name 1689 | 1690 | #config dev 1691 | # option dev $mlc_net2_name 1692 | 1693 | config 'unicastHna' 1694 | option 'unicastHna' $mlc_ip6_ripe3_prefix:$vm_id::/64 1695 | 1696 | config 'tunDev' default 1697 | option 'tunDev' 'default' 1698 | option tun6Address $mlc_ip6_ripe3_prefix:$vm_id::1/64 1699 | option tun4Address 10.20.$(( $vm_id % 100 )).1/24 1700 | 1701 | config 'tunOut' ip6 1702 | option 'tunOut' 'ip6' 1703 | option 'network' '$mlc_ip6_ripe3_prefix::/16' 1704 | # option 'exportDistance' '0' 1705 | # option 'ipMetric' '2000' 1706 | 1707 | config 'tunOut' ip4 1708 | option 'tunOut' 'ip4' 1709 | option 'network' '10.20.0.0/16' 1710 | # option 'ipMetric' '2000' 1711 | 1712 | 1713 | #config 'redistTable' 1714 | # option 'redistTable' 'bla' 1715 | # option 'table' '110' 1716 | # option 'all' '1' 1717 | # option 'sys' '60' 1718 | 1719 | #config 'redistTable' 1720 | # option 'redistTable' 'myBird' 1721 | # option 'table' '110' 1722 | # option 'all' '1' 1723 | # option 'sys' '12' 1724 | 1725 | EOF 1726 | 1727 | 1728 | 1729 | 1730 | 1731 | 1732 | # configure olsrd 1733 | cat < $vm_rootfs/etc/olsrd.conf 1734 | 1735 | IpVersion 6 1736 | RtTable 90 1737 | 1738 | LoadPlugin "olsrd_txtinfo.so.0.1" 1739 | { 1740 | PlParam "port" "8080" 1741 | #PlParam "Host" "127.0.0.1" 1742 | PlParam "Net" "0.0.0.0 0.0.0.0" 1743 | } 1744 | 1745 | Interface "$mlc_net11_name" 1746 | { 1747 | IPv6Src $mlc_net11_ula_addr 1748 | IPv6Multicast FF0E::1 1749 | } 1750 | 1751 | 1752 | 1753 | EOF 1754 | 1755 | #configure olsrd2 1756 | cat < $vm_rootfs/etc/olsrd2.conf 1757 | [http] 1758 | bindto 0.0.0.0 1759 | 1760 | #[lan_import=1] 1761 | # interface br-testnet 1762 | 1763 | [domain=0] 1764 | mpr - 1765 | 1766 | [nhdp] 1767 | mpr - 1768 | 1769 | [interface=lo] 1770 | 1771 | [interface=$mlc_net1_name] 1772 | 1773 | EOF 1774 | 1775 | 1776 | return 0 1777 | } 1778 | 1779 | 1780 | 1781 | 1782 | 1783 | 1784 | MLC_create_lxc_config() 1785 | { 1786 | local node_name=$1 1787 | 1788 | local child_rootfs=$mlc_conf_dir/$node_name/rootfs 1789 | local child_config=$mlc_conf_dir/$node_name 1790 | local mother_name="${mlc_name_prefix}${mlc_mother_id}" 1791 | local mother_rootfs=$mlc_conf_dir/$mother_name/rootfs 1792 | 1793 | echo "MLC_create_lxc_config() node_name=$node_name child_rootfs=$child_rootfs child_config=$child_config mother_name=$mother_name mother_rootfs=$mother_rootfs" 1794 | 1795 | 1796 | mkdir -p $child_config 1797 | [ -f $child_config/config.old ] && mv -f $child_config/config.old $child_config/config.old.old 1798 | [ -f $child_config/config ] && mv -f $child_config/config $child_config/config.old 1799 | 1800 | 1801 | cat < $child_config/config 1802 | 1803 | ########################################################## 1804 | # Container specific configuration 1805 | lxc.uts.name = $node_name 1806 | lxc.arch = $mlc_arch 1807 | lxc.rootfs.path = dir:$child_rootfs 1808 | #lxc.rootfs.backend = dir 1809 | 1810 | lxc.net.0.type = veth 1811 | lxc.net.0.flags = up 1812 | lxc.net.0.link = $mlc_net0_link 1813 | lxc.net.0.name = $mlc_net0_name 1814 | lxc.net.0.mtu = $mlc_net_mtu 1815 | lxc.net.0.hwaddr = $mlc_net0_mac 1816 | lxc.net.0.veth.pair = $mlc_net0_veth 1817 | 1818 | lxc.net.1.type = veth 1819 | lxc.net.1.flags = up 1820 | lxc.net.1.link = $mlc_net1_link 1821 | lxc.net.1.name = $mlc_net1_name 1822 | lxc.net.1.mtu = $mlc_net_mtu 1823 | lxc.net.1.hwaddr = $mlc_net1_mac 1824 | lxc.net.1.veth.pair = $mlc_net1_veth 1825 | 1826 | #lxc.net.2.type = veth 1827 | #lxc.net.2.flags = up 1828 | #lxc.net.2.link = $mlc_net2_link 1829 | #lxc.net.2.name = $mlc_net2_name 1830 | #lxc.net.2.mtu = $mlc_net_mtu 1831 | #lxc.net.2.hwaddr = $mlc_net2_mac 1832 | #lxc.net.2.veth.pair = $mlc_net2_veth 1833 | 1834 | 1835 | # Common configuration 1836 | # lxc.include = /usr/share/lxc/config/debian.common.conf 1837 | ########################################################## 1838 | # Copied from /share/lxc/config/debian.common.conf 1839 | # This derives from the global common config 1840 | # lxc.include = /usr/share/lxc/config/common.conf 1841 | ########################################################## 1842 | # Copied from /usr/share/lxc/config/common.conf 1843 | # Default configuration shared by all containers 1844 | 1845 | # Setup the LXC devices in /dev/lxc/ 1846 | lxc.tty.dir = lxc 1847 | 1848 | # Allow for 1024 pseudo terminals 1849 | lxc.pty.max = 1024 1850 | 1851 | # Setup 4 tty devices 1852 | lxc.tty.max = 4 1853 | 1854 | # Drop some harmful capabilities 1855 | lxc.cap.drop = mac_admin mac_override sys_time sys_module sys_rawio 1856 | 1857 | # Set the pivot directory 1858 | # lxc.pivotdir = lxc_putold 1859 | 1860 | # Ensure hostname is changed on clone 1861 | lxc.hook.clone = /usr/share/lxc/hooks/clonehostname 1862 | 1863 | # CGroup whitelist 1864 | lxc.cgroup.devices.deny = a 1865 | ## Allow any mknod (but not reading/writing the node) 1866 | lxc.cgroup.devices.allow = c *:* m 1867 | lxc.cgroup.devices.allow = b *:* m 1868 | ## Allow specific devices 1869 | ### /dev/null 1870 | lxc.cgroup.devices.allow = c 1:3 rwm 1871 | ### /dev/zero 1872 | lxc.cgroup.devices.allow = c 1:5 rwm 1873 | ### /dev/full 1874 | lxc.cgroup.devices.allow = c 1:7 rwm 1875 | ### /dev/tty 1876 | lxc.cgroup.devices.allow = c 5:0 rwm 1877 | ### /dev/console 1878 | lxc.cgroup.devices.allow = c 5:1 rwm 1879 | ### /dev/ptmx 1880 | lxc.cgroup.devices.allow = c 5:2 rwm 1881 | ### /dev/random 1882 | lxc.cgroup.devices.allow = c 1:8 rwm 1883 | ### /dev/urandom 1884 | lxc.cgroup.devices.allow = c 1:9 rwm 1885 | ### /dev/pts/* 1886 | lxc.cgroup.devices.allow = c 136:* rwm 1887 | ### fuse 1888 | lxc.cgroup.devices.allow = c 10:229 rwm 1889 | 1890 | # Setup the default mounts 1891 | lxc.mount.auto = cgroup:mixed proc:mixed sys:mixed 1892 | lxc.mount.entry = /sys/fs/fuse/connections sys/fs/fuse/connections none bind,optional 0 0 1893 | 1894 | # Blacklist some syscalls which are not safe in privileged 1895 | # containers 1896 | lxc.seccomp.profile = /usr/share/lxc/config/common.seccomp 1897 | 1898 | # Lastly, include all the configs from /usr/share/lxc/config/common.conf.d/ 1899 | # lxc.include = /usr/share/lxc/config/common.conf.d/ 1900 | ########################################################## 1901 | # Copied from /usr/share/lxc/config/common.conf.d/00-lxcfs.conf 1902 | lxc.hook.mount = /usr/share/lxcfs/lxc.mount.hook 1903 | lxc.hook.post-stop = /usr/share/lxcfs/lxc.reboot.hook 1904 | ########################################################## 1905 | 1906 | # Doesn't support consoles in /dev/lxc/ 1907 | # lxc.devttydir = 1908 | 1909 | # When using LXC with apparmor, the container will be confined by default. 1910 | # If you wish for it to instead run unconfined, copy the following line 1911 | # (uncommented) to the container's configuration file. 1912 | #lxc.aa_profile = unconfined 1913 | 1914 | # If you wish to allow mounting block filesystems, then use the following 1915 | # line instead, and make sure to grant access to the block device and/or loop 1916 | # devices below in lxc.cgroup.devices.allow. 1917 | #lxc.aa_profile = lxc-container-default-with-mounting 1918 | 1919 | # Extra cgroup device access 1920 | ## rtc 1921 | lxc.cgroup.devices.allow = c 254:0 rm 1922 | ## tun 1923 | lxc.mount.entry = /dev/net dev/net none bind,create=dir 1924 | lxc.cgroup.devices.allow = c 10:200 rwm 1925 | # lxc.hook.autodev = sh -c "modprobe tun; mkdir $child_rootfs/dev/net; mknod $child_rootfs/dev/net/tun c 10 200; chmod 0666 $child_rootfs/dev/net/tun" 1926 | ## hpet 1927 | lxc.cgroup.devices.allow = c 10:228 rwm 1928 | ## kvm 1929 | lxc.cgroup.devices.allow = c 10:232 rwm 1930 | ## To use loop devices, copy the following line to the container's 1931 | ## configuration file (uncommented). 1932 | #lxc.cgroup.devices.allow = b 7:* rwm 1933 | ########################################################## 1934 | 1935 | 1936 | 1937 | ## consoles 1938 | #lxc.cgroup.devices.allow = c 4:0 rwm 1939 | #lxc.cgroup.devices.allow = c 4:1 rwm 1940 | 1941 | #lxc.mount.entry=proc $mother_rootfs/proc proc nodev,noexec,nosuid 0 0 1942 | #lxc.mount.entry=devpts $mother_rootfs/dev/pts devpts defaults 0 0 1943 | #lxc.mount.entry=sysfs $mother_rootfs/sys sysfs defaults 0 0 1944 | 1945 | EOF 1946 | 1947 | 1948 | 1949 | if [ $? -ne 0 ]; then 1950 | echo "Failed to add configuration" 1951 | return 1 1952 | fi 1953 | 1954 | if [ "$mother_rootfs" ] && [ "$node_name" != "$mother_name" ] ; then 1955 | for dir in $mlc_mount_dirs; do 1956 | cat <> $child_config/config 1957 | # lxc.mount.entry=$mother_rootfs/$dir $child_rootfs/$dir none ro,bind 0 0 1958 | lxc.mount.entry=$mother_rootfs/$dir $dir none ro,bind 0 0 1959 | EOF 1960 | if [ $? -ne 0 ]; then 1961 | echo "failed to attach $dir mount entry to lxc configuration file: $child_config" 1962 | return 1 1963 | fi 1964 | done 1965 | fi 1966 | 1967 | cat <> /dev/zero 1968 | # $child_config/config 1969 | 1970 | lxc.network.type = veth 1971 | lxc.network.flags = up 1972 | lxc.network.name = $mlc_net3_name 1973 | lxc.network.mtu = $mlc_net_mtu 1974 | lxc.network.hwaddr = $mlc_net3_mac 1975 | lxc.network.veth.pair = $mlc_net3_veth 1976 | 1977 | lxc.network.type = veth 1978 | lxc.network.flags = up 1979 | lxc.network.name = $mlc_net4_name 1980 | lxc.network.mtu = $mlc_net_mtu 1981 | lxc.network.hwaddr = $mlc_net4_mac 1982 | lxc.network.veth.pair = $mlc_net4_veth 1983 | 1984 | lxc.network.type = veth 1985 | lxc.network.flags = up 1986 | lxc.network.name = $mlc_net5_name 1987 | lxc.network.mtu = $mlc_net_mtu 1988 | lxc.network.hwaddr = $mlc_net5_mac 1989 | lxc.network.veth.pair = $mlc_net5_veth 1990 | 1991 | lxc.network.type = veth 1992 | lxc.network.flags = up 1993 | lxc.network.name = $mlc_net6_name 1994 | lxc.network.mtu = $mlc_net_mtu 1995 | lxc.network.hwaddr = $mlc_net6_mac 1996 | lxc.network.veth.pair = $mlc_net6_veth 1997 | 1998 | lxc.network.type = veth 1999 | lxc.network.flags = up 2000 | lxc.network.name = $mlc_net7_name 2001 | lxc.network.mtu = $mlc_net_mtu 2002 | lxc.network.hwaddr = $mlc_net7_mac 2003 | lxc.network.veth.pair = $mlc_net7_veth 2004 | 2005 | EOF 2006 | 2007 | return 0 2008 | } 2009 | 2010 | 2011 | 2012 | mlc_update_individual() { 2013 | 2014 | if [ -z $1 ] ; then 2015 | echo "mlc_update_individual [custom-config.sh]" 2016 | return 1 2017 | fi 2018 | 2019 | 2020 | local node_id=$1 2021 | local node_name=$mlc_name_prefix$node_id 2022 | 2023 | local mother_name="${mlc_name_prefix}${mlc_mother_id}" 2024 | 2025 | if ! lxc-info -n $node_name | grep STOPPED ; then 2026 | echo "WARNING: specified container $node_name is RUNNING" 2027 | fi 2028 | 2029 | local child_rootfs=$mlc_conf_dir/$node_name/rootfs 2030 | local child_config=$mlc_conf_dir/$node_name 2031 | local mother_rootfs=$mlc_conf_dir/$mother_name/rootfs 2032 | 2033 | MLC_assign_networks $node_id 2034 | 2035 | if ! [ -d "$child_rootfs" ]; then 2036 | echo "childs rootfs: '$child_rootfs' does not exist !!!" 2037 | return 1 2038 | fi 2039 | 2040 | echo configuring $child_rootfs $node_id $(( $node_id % 100 )) $(( $node_id / 100 )) 2041 | 2042 | 2043 | MLC_configure_individual $node_id 2044 | if [ $? -ne 0 ]; then 2045 | echo "failed to configure $child_rootfs"; return 1 2046 | fi 2047 | 2048 | MLC_create_lxc_config $node_name 2049 | if [ $? -ne 0 ]; then 2050 | echo "failed write childs configuration file: $child_config"; return 1 2051 | fi 2052 | 2053 | 2054 | } 2055 | 2056 | 2057 | 2058 | MLC_install_child() 2059 | { 2060 | local child_rootfs=$1 2061 | local mother_rootfs=$2 2062 | 2063 | echo "MLC_install_child child_rootfs=$child_rootfs mother_rootfs=$mother_rootfs" 2064 | 2065 | 2066 | mkdir -p $child_rootfs/ 2067 | 2068 | for dir in $mlc_empty_dirs; do 2069 | mkdir -p $child_rootfs/$dir 2070 | done 2071 | 2072 | 2073 | for dir in $mlc_mount_dirs; do 2074 | mkdir -p $child_rootfs/$dir 2075 | done 2076 | 2077 | for dir in $mlc_copy_dirs; do 2078 | cp -ar $mother_rootfs/$dir $child_rootfs/$dir 2079 | if [ $? -ne 0 ]; then 2080 | echo "Failed to copy mother rootfs: $mother_rootfs" 2081 | return 1 2082 | fi 2083 | done 2084 | 2085 | if false; then 2086 | 2087 | find $vm_rootfs/root/fifo0 > /dev/null 2>&1 || mkfifo $vm_rootfs/root/fifo0 2088 | find $vm_rootfs/root/fifo1 > /dev/null 2>&1 || mkfifo $vm_rootfs/root/fifo1 2089 | 2090 | if echo "$mlc_arch" | grep "64" ; then 2091 | ln -s /lib $child_rootfs/lib64 2092 | fi 2093 | 2094 | chmod 755 $child_rootfs/* 2095 | chmod 777 $child_rootfs/tmp 2096 | 2097 | chmod 777 $child_rootfs/var/tmp 2098 | 2099 | chmod 777 $child_rootfs/var/local 2100 | chmod g+s $child_rootfs/var/local 2101 | chgrp staff $child_rootfs/var/local 2102 | 2103 | chmod 777 $child_rootfs/var/lock 2104 | chmod o+t $child_rootfs/var/lock 2105 | 2106 | chmod g+ws $child_rootfs/var/mail 2107 | fi 2108 | 2109 | return 0 2110 | } 2111 | 2112 | 2113 | 2114 | mlc_create_child() { 2115 | 2116 | if [ -z $1 ] ; then 2117 | echo "mlc_create_child " 2118 | return 1 2119 | fi 2120 | 2121 | local child_id="$1" 2122 | local child_name="${mlc_name_prefix}${child_id}" 2123 | local child_rootfs="$mlc_conf_dir/$child_name/rootfs" 2124 | local child_config="$mlc_conf_dir/$child_name" 2125 | local mother_name="${mlc_name_prefix}${mlc_mother_id}" 2126 | local mother_rootfs="$mlc_conf_dir/$mother_name/rootfs" 2127 | local mother_config="$mlc_conf_dir/$mother_name/config" 2128 | 2129 | 2130 | time MLC_assign_networks $child_id 2131 | 2132 | 2133 | if lxc-info -n $child_name 2>&1 | grep RUNNING ; then 2134 | echo "specified container '$child_name' must be stopped first"; return 1 2135 | fi 2136 | 2137 | if [ -d "$child_rootfs" ]; then 2138 | echo "childs rootfs: '$child_rootfs' does already exist"; return 1 2139 | fi 2140 | 2141 | if [ -d "$child_config" ]; then 2142 | echo "childs config:'$child_config' does already exist"; return 1 2143 | fi 2144 | 2145 | if [ ! -d "$mother_rootfs" ]; then 2146 | echo "mother rootfs: '$mother_rootfs' does not exist"; return 1 2147 | fi 2148 | 2149 | 2150 | if [ ! -f "$mother_config" ]; then 2151 | echo "mother config:'$mother_config' does not exist"; return 1 2152 | fi 2153 | 2154 | 2155 | 2156 | time MLC_install_child $child_rootfs $mother_rootfs 2157 | if [ $? -ne 0 ]; then 2158 | echo "failed to install child fs"; return 1 2159 | fi 2160 | 2161 | time MLC_configure_individual $child_id 2162 | if [ $? -ne 0 ]; then 2163 | echo "failed to configure child debian for a container"; return 1 2164 | fi 2165 | 2166 | 2167 | time MLC_create_lxc_config $child_name 2168 | if [ $? -ne 0 ]; then 2169 | echo "failed write childs configuration file: $child_config"; return 1 2170 | fi 2171 | 2172 | echo done 2173 | } 2174 | 2175 | 2176 | 2177 | mlc_destroy() { 2178 | 2179 | if [ -z $1 ] ; then 2180 | echo "mlc_create_child " 2181 | return 1 2182 | fi 2183 | 2184 | local child_id="$1" 2185 | local child_name="${mlc_name_prefix}${child_id}" 2186 | 2187 | MLC_assign_networks $child_id 2188 | 2189 | if lxc-info -n $child_name | grep RUNNING ; then 2190 | echo "specified container $child_name must be stopped first"; return 1 2191 | fi 2192 | 2193 | 2194 | local vm_rootfs=$mlc_conf_dir/$child_name/rootfs 2195 | local vm_config=$mlc_conf_dir/$child_name 2196 | 2197 | 2198 | if [ ! -d "$vm_config" ]; then 2199 | echo "config for '$vm_config' does not exist" 2200 | else 2201 | rm -r --preserve-root $vm_config 2202 | fi 2203 | } 2204 | 2205 | 2206 | 2207 | mlc_perf() { 2208 | # set -x 2209 | local child_id="$1" 2210 | local process_name="$2" 2211 | local perf_time="$3" 2212 | local repeat="$4" 2213 | local selections=${5:-u} 2214 | 2215 | local child_name="${mlc_name_prefix}${child_id}" 2216 | local process_pid=$(lxc-ps -n $child_name -- aux | grep "$process_name" | awk '{print $3}') 2217 | local perf_log_dir="/tmp/mlc_perfs" 2218 | local perf_log_name="$child_name.$process_pid.log" 2219 | local perf_log_path="$perf_log_dir/$perf_log_name" 2220 | 2221 | local i=0 2222 | 2223 | if [ "$process_pid" ]; then 2224 | mkdir -p $perf_log_dir 2225 | 2226 | while ! [ "$repeat" ] || [ "$repeat" == "0" ] || [ $i -lt $repeat ]; do 2227 | 2228 | local pstart=$(ps aux | grep -v "grep" | grep "$process_name" | wc -l) 2229 | 2230 | # timeout -s INT $perf_time perf stat -a -e task-clock,cycles,instructions --pid $process_pid 2>$perf_log_path 2231 | # perf stat -a -e instructions:$selections --pid $process_pid sleep $perf_time 2>$perf_log_path 2232 | timeout -s INT $perf_time perf stat -a -e instructions:$selections --pid $process_pid 2>$perf_log_path 2233 | 2234 | # cat $perf_log_path 2235 | 2236 | local pend=$(ps aux | grep -v "grep" | grep "$process_name" | wc -l) 2237 | local ips=$((( $(cat $perf_log_path| grep instructions | awk '{print $1}' | sed s/,//g ) / $perf_time ))) 2238 | 2239 | printf "%10s %3s %3s\n" $ips $pstart $pend 2240 | 2241 | i=$((( $i + 1 ))) 2242 | 2243 | if ! [ "$repeat" ]; then 2244 | break 2245 | fi 2246 | done 2247 | fi 2248 | 2249 | } 2250 | 2251 | -------------------------------------------------------------------------------- /openwrt-routing-package-ana/ana/Makefile: -------------------------------------------------------------------------------- 1 | include $(TOPDIR)/rules.mk 2 | include $(INCLUDE_DIR)/kernel.mk 3 | 4 | PKG_NAME:=ana 5 | PKG_VERSION:=1.0.7 6 | PKG_RELEASE:=1 7 | PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) 8 | 9 | include $(INCLUDE_DIR)/package.mk 10 | 11 | define Package/ana 12 | SECTION:=net 13 | CATEGORY:=Network 14 | SUBMENU:=Routing and Redirection 15 | TITLE:=Analysis tools for mesh routing protocols 16 | URL:=http://dev.qmp.cat/ana 17 | DEPENDS:=\ 18 | +coreutils +coreutils-timeout +coreutils-kill \ 19 | +iputils-ping6 +iputils-ping +iputils-tracepath +iputils-tracepath6 \ 20 | +ip-full +ipip \ 21 | +zlib +kmod-ip6-tunnel +kmod-iptunnel6 +kmod-tun \ 22 | +iw +wireless-tools +libiwinfo \ 23 | +iptables +ip6tables \ 24 | +iperf3 \ 25 | +libmbedtls 26 | 27 | # +iperf-mt 28 | # +libpolarssl 29 | # 30 | # and deselect if needed: odhcpc ppp wpad-mini hostapd 31 | # +less +iwinfo 32 | # +netcat 33 | # +iputils-traceroute6 34 | # +mtr +netperf 35 | # +@BUSYBOX_CONFIG_KILLALL5 36 | 37 | # DISABLE anything non-mandatory in make Menuconfig: network 38 | 39 | endef 40 | 41 | define Package/ana/description 42 | Analysis tools for mesh routing protocols 43 | endef 44 | 45 | define Build/Prepare 46 | mkdir -p $(PKG_BUILD_DIR) 47 | endef 48 | 49 | define Build/Configure 50 | endef 51 | 52 | define Build/Compile 53 | endef 54 | 55 | define Package/ana/install 56 | $(INSTALL_DIR) $(1)/etc 57 | $(INSTALL_DIR) $(1)/etc/dropbear 58 | $(INSTALL_DIR) $(1)/etc/config 59 | $(INSTALL_DIR) $(1)/etc/uci-defaults 60 | $(INSTALL_DIR) $(1)/etc/init.d 61 | $(CP) ./files/etc/dropbear/* $(1)/etc/dropbear/ 62 | $(CP) ./files/etc/config/* $(1)/etc/config/ 63 | $(INSTALL_BIN) ./files/etc/uci-defaults/99_ana $(1)/etc/uci-defaults/ 64 | $(INSTALL_BIN) ./files/etc/init.d/ana $(1)/etc/init.d/ 65 | endef 66 | 67 | define Package/ana/postinst 68 | #!/bin/sh 69 | # check if we are on real system 70 | if [ -z "$${IPKG_INSTROOT}" ]; then 71 | cp /etc/dropbear/authorized_keys.ana /etc/dropbear/authorized_keys 72 | cp /etc/dropbear/dropbear_dss_host_key.ana /etc/dropbear/dropbear_dss_host_key 73 | cp /etc/dropbear/dropbear_rsa_host_key.ana /etc/dropbear/dropbear_rsa_host_key 74 | fi 75 | exit 0 76 | endef 77 | 78 | 79 | $(eval $(call BuildPackage,ana)) 80 | 81 | 82 | -------------------------------------------------------------------------------- /openwrt-routing-package-ana/ana/files/etc/config/network: -------------------------------------------------------------------------------- 1 | 2 | config interface 'loopback' 3 | option ifname 'lo' 4 | option proto 'static' 5 | option ipaddr '127.0.0.1' 6 | option netmask '255.0.0.0' 7 | 8 | config globals 'globals' 9 | option ula_prefix 'fd19:106c:6700::/48' 10 | 11 | config interface 'lan' 12 | option ifname 'eth0' 13 | option force_link '1' 14 | option type 'bridge' 15 | option proto 'static' 16 | option ipaddr '192.168.1.100' 17 | option netmask '255.255.255.0' 18 | option ip6assign '60' 19 | 20 | config device 'lm_net_eth0_bmx6_dev' 21 | option type '8021ad' 22 | option name 'eth0_13' 23 | option ifname 'eth0' 24 | option vid '13' 25 | option mtu '1398' 26 | 27 | config interface 'lm_net_eth0_bmx6_if' 28 | option proto 'none' 29 | option auto '1' 30 | option ifname 'eth0_13' 31 | 32 | config interface wmesh0 33 | # option ifname wlan0 34 | # option proto static 35 | option proto none 36 | # option ip6asign 60 37 | 38 | config interface 'wmesh0_2' 39 | option ifname @wmesh0.2 40 | option proto 'static' 41 | option ipaddr '192.168.2.100' 42 | option netmask '255.255.255.0' 43 | 44 | config interface 'wmesh0_3' 45 | option ifname @wmesh0.3 46 | option proto 'static' 47 | option ipaddr '192.168.3.100' 48 | option netmask '255.255.255.0' 49 | 50 | config interface 'wmesh0_4' 51 | option ifname @wmesh0.4 52 | option proto 'static' 53 | option ipaddr '192.168.4.100' 54 | option netmask '255.255.255.0' 55 | -------------------------------------------------------------------------------- /openwrt-routing-package-ana/ana/files/etc/config/wireless: -------------------------------------------------------------------------------- 1 | config wifi-device 'radio0' 2 | option type mac80211 3 | option path 'platform/ar933x_wmac' 4 | # option macaddr 'ec:88:8f:dc:c8:d4' 5 | option channel '10' 6 | # option country 'SP' 7 | option hwmode 'auto' 8 | option htmode 'HT40' 9 | option txpower '1' 10 | option noscan '1' 11 | # option distance '5000' 12 | list ht_capab 'SHORT-GI-20' 13 | list ht_capab 'SHORT-GI-40' 14 | list ht_capab 'RX-STBC1' 15 | list ht_capab 'DSSS_CCK-40' 16 | 17 | #config wifi-iface 'wlan0' 18 | config wifi-iface 19 | option device 'radio0' 20 | option mode 'adhoc' 21 | option ssid 'qMp' 22 | option bssid '02:CA:FF:EE:BA:BE' 23 | option network 'wmesh0' 24 | option ifname 'wlan0' 25 | 26 | -------------------------------------------------------------------------------- /openwrt-routing-package-ana/ana/files/etc/dropbear/authorized_keys.ana: -------------------------------------------------------------------------------- 1 | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCugTtoBCxRI86rqkz233Y6H2zcLPF/vrt41eQEDRpTewmLLCXDaS/qrxIdvLr2Ax1PsV/tUGC4pNkI4wDn8+ytEGvULgt6gVwr1kFX4gnlYFQwstwhcjSjBeicENrJAT1BqNh9N6KLzzYf3nWCmjmI8x5HiJdSl6qt++EhRcmnH2Knz66G7CQpEM8yPBqLnPARURdrr9E8xWWLnaAsNhHXv/tRpvhxi1CTGdFxEJOkL18hqlWXqBl43SD7g32oNq+sSdt7bpkM787N/TM+W+q1TmZp16Zjn0ViM9Whf5n2dBCjD+FW/k+dnAekJf1tssJVCMwKOmuFtixvIVUgBuI1 neumann@SED 2 | ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvbTSxpSlDBV7m+c0i1rUFpaasegLjRL+BZunrpKb1YFvJXwS2DD1WqnAypBk/AlgR9KQlXfHSpeRqxY0HbBnPWG79LQ2NlVlcvF7xokpw3eUeYKpJwx0ivNd/koKE3wvoFN158JseFhUBGcZdaFRGh6bFhrvvXYmAHjroHvaGgVR8YQI4DiKrBULQd75p/U3G2UjeZpMeTK+LaCkuWh0g+93LQPp21w6v8hOZtudJ2rhNHNYB0oFJF8Uf5q+uVjpbOzA/nPxs/qiF4zdg2oyj0eAi0Yfo+eSVI/zj3iyeC4rF5S8/s/cyet+XMXvLQ6X12XUYu7Qv/VEVwI5QkVqSw== neumann@smart 3 | 4 | 5 | -------------------------------------------------------------------------------- /openwrt-routing-package-ana/ana/files/etc/dropbear/dropbear_dss_host_key.ana: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/axn/mlc/aa2bba9a316b00cad3d6a51286a1b3ce2697e2e8/openwrt-routing-package-ana/ana/files/etc/dropbear/dropbear_dss_host_key.ana -------------------------------------------------------------------------------- /openwrt-routing-package-ana/ana/files/etc/dropbear/dropbear_rsa_host_key.ana: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/axn/mlc/aa2bba9a316b00cad3d6a51286a1b3ce2697e2e8/openwrt-routing-package-ana/ana/files/etc/dropbear/dropbear_rsa_host_key.ana -------------------------------------------------------------------------------- /openwrt-routing-package-ana/ana/files/etc/init.d/ana: -------------------------------------------------------------------------------- 1 | #!/bin/sh /etc/rc.common 2 | 3 | START=35 4 | STOP=85 5 | USE_PROCD=1 6 | 7 | start_service() { 8 | [ -f /etc/init.d/firewall ] && { 9 | /etc/init.d/firewall stop 10 | rm -f /etc/init.d/firewall 11 | } 12 | 13 | local IP4PREFIX="192.168" 14 | local IDX= 15 | local BMX= 16 | # local BMXCOMMONS="bmx7 plugin=bmx7_iwinfo.so plugin=bmx7_topology.so " 17 | local BMXCOMMONS="bmx7 plugin=bmx7_iwinfo.so plugin=bmx7_tun.so " 18 | ip link show dev eth0 | grep "link/ether" | grep "14:cf:92:52:0f:10" && { IDX=101; BMX="$BMXCOMMONS dev=wlan0.2 dev=br-lan"; FIRE="ip6tables -I INPUT -s fe80::ee88:8fff:fedc:c8d4 -i br-lan -j DROP"; } 19 | ip link show dev eth0 | grep "link/ether" | grep "14:cf:92:52:13:a6" && { IDX=102; BMX="$BMXCOMMONS dev=wlan0.2 dev=wlan0.3 dev=eth0_13"; FIRE=""; } 20 | ip link show dev eth0 | grep "link/ether" | grep "90:f6:52:7f:b9:b3" && { IDX=103; BMX="$BMXCOMMONS dev=wlan0.3 dev=wlan0.4"; FIRE=""; } 21 | ip link show dev eth0 | grep "link/ether" | grep "ec:88:8f:dc:c8:d4" && { IDX=104; BMX="$BMXCOMMONS dev=wlan0.4 dev=br-lan"; FIRE="ip6tables -I INPUT -s fe80::16cf:92ff:fe52:f10 -i br-lan -j DROP"; } 22 | 23 | uci set system.@system[0].hostname="o$IDX" 24 | uci commit system 25 | 26 | uci set network.lan.ipaddr="$IP4PREFIX.1.$IDX" 27 | uci set network.wmesh0_2.ipaddr="$IP4PREFIX.2.$IDX" 28 | uci set network.wmesh0_3.ipaddr="$IP4PREFIX.3.$IDX" 29 | uci set network.wmesh0_4.ipaddr="$IP4PREFIX.4.$IDX" 30 | uci commit network 31 | wifi 32 | 33 | # sleep 5 34 | # cat /proc/sys/kernel/hostname | grep "o$DIX" || reboot 35 | echo "o$IDX" > /proc/sys/kernel/hostname 36 | 37 | while killall bmx7; do timeout 0.2 sleep 1d; done 38 | echo 10 > /proc/sys/net/ipv6/icmp/ratelimit 39 | ps | grep "iperf -Vs" | grep -v grep || iperf -Vs & 40 | ip6tables --flush 41 | $FIRE 42 | $BMX 43 | } 44 | 45 | service_triggers() 46 | { 47 | echo 48 | } 49 | 50 | -------------------------------------------------------------------------------- /openwrt-routing-package-ana/ana/files/etc/uci-defaults/99_ana: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | cp /etc/dropbear/authorized_keys.ana /etc/dropbear/authorized_keys 4 | cp /etc/dropbear/dropbear_dss_host_key.ana /etc/dropbear/dropbear_dss_host_key 5 | cp /etc/dropbear/dropbear_rsa_host_key.ana /etc/dropbear/dropbear_rsa_host_key 6 | 7 | exit 0 8 | 9 | -------------------------------------------------------------------------------- /rootfs: -------------------------------------------------------------------------------- 1 | /var/lib/lxc/ --------------------------------------------------------------------------------