#!/bin/sh # # Generate a roofnet config file for click # Jun Cheol Park: # Mostly borrowed from Jonh Bicket's roofnet code # # Oct 2007 # The main differences are: # i) PVPmanager is added. # ii) PVPmerger is added. # iii) Packet feedback is restored for autorate just like the original roofnet. # Some exsting modules are modified, so in order to use this config # should use modified version of click by Jun Cheol Park at Utah. if [ $# -ne 1 ]; then echo echo 1>&2 Usage: $0 1, For kernel echo 1>&2 Usage: $0 0, For userlevel echo exit 127 fi KERNEL=$1 DEV="ath2" GATEWAY="false" if [ -f /tmp/is_gateway ]; then GATEWAY="true" fi mac=$(ifconfig ath0 | sed -n 's/^.*HWaddr \([0-9A-Za-z:]*\).*/\1/p') # extract the bottom three octects to use as IP hi_hex=$(echo $mac | sed -n 's/.*:.*:.*:\([0-9A-Za-z:]*\):.*:.*.*/\1/p') mid_hex=$(echo $mac | sed -n 's/.*:.*:.*:.*:\([0-9A-Za-z:]*\):.*.*/\1/p') lo_hex=$(echo $mac | sed -n 's/.*:.*:.*:.*:.*:\([0-9A-Za-z:]*\).*/\1/p') hi="0x$hi_hex"; mid="0x$mid_hex"; lo="0x$lo_hex"; SUFFIX=$(printf "%d.%d.%d" $hi $mid $lo) WIRELESS_MAC=$mac SRCR_IP="5.$SUFFIX" SRCR_NM="255.0.0.0" SRCR_NET="5.0.0.0" SRCR_BCAST="5.255.255.255" WLANCONFIG=/usr/local/bin/wlanconfig $WLANCONFIG $DEV destroy > /dev/null 2>&1 $WLANCONFIG $DEV create wlandev wifi0 wlanmode monitor > /dev/null /sbin/ifconfig $DEV mtu 1900 /sbin/ifconfig $DEV txqueuelen 5 /sbin/ifconfig $DEV up echo '804' > /proc/sys/net/$DEV/dev_type /sbin/modprobe tun > /dev/null 2>&1 MODE="a" # PROBES="2 60 2 1500 4 1500 11 1500 22 1500" PROBES="12 60 12 1500 18 1500 24 1500 36 1500 48 1500 72 1500 96 1500 108 1500"; # $probes = "2 60 12 60 2 1500 4 1500 11 1500 22 1500 12 1500 18 1500 24 1500 36 1500 48 1500 72 1500 96 1500"; echo "rates :: AvailableRates(DEFAULT 12 18 24 36 48 72 96 108, $WIRELESS_MAC 12 18 24 36 48 72 96 108); "; SRCR_FILE="srcr_pvp.click" if [ ! -f $SRCR_FILE ]; then SRCR_FILE="/home/roofnet/click/conf/wifi/srcr.click" if [ ! -f $SRCR_FILE ]; then SRCR_FILE="/tmp/srcr.click" if [ ! -f $SRCR_FILE ]; then SRCR_FILE="/tmp/srcr.click" fi fi fi if [ ! -f $SRCR_FILE ]; then echo "couldn't find srcr.click"; exit 1; fi cat $SRCR_FILE if [ $KERNEL -eq 0 ]; then echo " control :: ControlSocket(\"TCP\", 7777); chatter :: ChatterSocket(\"TCP\", 7778); "; fi echo " // has one input and one output // takes and spits out ip packets elementclass LinuxHost { \$dev, \$ip, \$nm, \$mac | input -> ToHost(\$dev); FromHost(\$dev, \$ip/\$nm, ETHER \$mac) -> output; } // has one input and one output // takes and spits out ip packets elementclass LinuxIPHost { \$dev, \$ip, \$nm | input -> KernelTun(\$ip/\$nm, MTU 1500, DEV_NAME \$dev) -> MarkIPHeader(0) -> CheckIPHeader(CHECKSUM false) -> output; } elementclass SniffDevice { \$device, \$promisc| // we only want txf for NODS packets // ether[2:2] == 0x1200 means it has an ath_rx_radiotap header (it is 18 bytes long) // ether[2:2] == 0x1000 means it has an ath_tx_radiotap header (it is 16 bytes long) // ether[18] == 0x08 means NODS from_dev :: FromDevice(\$device, PROMISC \$promisc) -> output; input -> to_dev :: ToDevice(\$device); } sniff_dev :: SniffDevice($DEV, false); wifisplit :: WifiSplit(DEBUG false, MAX_LEN 500); // JunPark sched :: PrioSched() -> set_power :: SetTXPower(POWER 15) -> athdesc_encap :: AthdescEncap(AUTORATE false) //-> radiotap_encap :: RadiotapEncap() -> sniff_dev; route_q :: FullNoteQueue(10) -> [0] sched; // JunPark: remove FullNoteQueue() // No, use it with a bigger size of queue data_q :: FullNoteQueue(100) data_static_rate :: SetTXRate(RATE 108) //-> data_madwifi_rate :: MadwifiRate(OFFSET 4, //-> data_pvpwifi_rate :: PVPwifiRate(OFFSET 4, -> data_samplewifi_rate :: SamplewifiRate(OFFSET 4, ALT_RATE true, RT rates, WIFISPLIT wifisplit, // JunPark DEBUG true, // JunPark PERIOD 100, // JunPark ACTIVE true) -> data_arf_rate :: AutoRateFallback(OFFSET 4, STEPUP 25, RT rates, ACTIVE false) -> data_probe_rate :: ProbeTXRate(OFFSET 4, WINDOW 5000, RT rates, ACTIVE false) -> [1] sched; // Idle -> [1] data_madwifi_rate; Idle -> [1] data_arf_rate; Idle -> [1] data_probe_rate; route_encap :: WifiEncap(0x0, 00:00:00:00:00:00) -> route_q; data_encap :: WifiEncap(0x0, 00:00:00:00:00:00) // JunPark -> wifisplit // JunPark -> data_q -> data_static_rate; srcr1 :: srcr_ett($SRCR_IP, $SRCR_NM, $WIRELESS_MAC, $GATEWAY, \"$PROBES\"); "; if [ $KERNEL -eq 1 ]; then echo " srcr1_host :: LinuxHost(srcr1, $SRCR_IP, $SRCR_NM, $WIRELESS_MAC) -> srcr1_cl :: IPClassifier(dst net 10.0.0.0/8, -); "; else echo " srcr1_host :: LinuxIPHost(srcr1, $SRCR_IP, $SRCR_NM) -> srcr1_cl :: IPClassifier(dst net 10.0.0.0/8, -); "; fi #srcr1_host :: LinuxIPHost(srcr1, $SRCR_IP, $SRCR_NM) #-> srcr1_cl :: IPClassifier(dst net 10.0.0.0/8, -); echo " ap_to_srcr1 :: SRDestCache(); srcr1_cl [0] -> [0] ap_to_srcr1 [0] -> [1] srcr1; srcr1_cl [1] -> [1] srcr1; srcr1 [0] -> route_encap; // queries, replies srcr1 [1] -> route_encap; // bcast_stats srcr1 [2] -> data_encap; // data srcr1 [3] -> srcr1_cl2 :: IPClassifier(src net 10.0.0.0/8, -); //data to me srcr1_cl2 [0] -> [1] ap_to_srcr1 [1] -> srcr1_host; srcr1_cl2 [1] -> srcr1_host; // data to me sniff_dev -> athdesc_decap :: AthdescDecap(DEBUG false) -> phyerr_filter :: FilterPhyErr() -> extra_decap :: ExtraDecap(DEBUG false) // JunPark: For click_wifi_extra //-> PrintWifi() // JunPark -> Classifier(0/08%0c) //data -> tx_filter :: FilterTX(DEBUG false) -> dupe :: WifiDupeFilter() // JunPark -> WifiMerge(DEBUG false) -> WifiDecap() -> HostEtherFilter($WIRELESS_MAC, DROP_OTHER true, DROP_OWN true) //-> ncl :: Classifier(12/09??, 12/06??); -> ncl :: Classifier(12/09??, -); ncl[0] -> srcr1; ncl[1] -> Discard; //tx_filter[1] -> Discard; tx_filter [1] //-> PrintTXFeedback(OFFSET 4) // JunPark -> [1] data_samplewifi_rate; ";