rates :: AvailableRates(DEFAULT 12 18 24 36 48 72 96 108, 00:18:6E:C3:04:18 12 18 24 36 48 72 96 108); elementclass srcr_ett { $srcr_ip, $srcr_nm, $wireless_mac, $gateway, $probes| arp :: ARPTable(); lt :: LinkTable(IP $srcr_ip); gw :: GatewaySelector(ETHTYPE 0x092c, IP $srcr_ip, ETH $wireless_mac, LT lt, ARP arp, PERIOD 15, GW $gateway); gw -> SetSRChecksum -> [0] output; set_gw :: SetGateway(SEL gw); gw_reply :: SR1GatewayResponder(SEL gw, ETHTYPE 0x0945, IP $srcr_ip, ETH $wireless_mac, ARP arp, DEBUG false, LT lt, PERIOD 15); gw_reply -> SetSRChecksum -> [1] output; es :: ETTStat(ETHTYPE 0x0941, ETH $wireless_mac, IP $srcr_ip, PERIOD 30000, TAU 300000, ARP arp, PROBES $probes, ETT metric, DEBUG false, // JunPark RT rates); metric :: ETTMetric(LT lt); forwarder :: SRForwarder(ETHTYPE 0x0943, IP $srcr_ip, ETH $wireless_mac, ARP arp, LT lt); querier :: SRQuerier(ETH $wireless_mac, SR forwarder, LT lt, ROUTE_DAMPENING true, TIME_BEFORE_SWITCH 5, DEBUG false); query_forwarder :: MetricFlood(ETHTYPE 0x0944, IP $srcr_ip, ETH $wireless_mac, LT lt, ARP arp, DEBUG false); query_responder :: SRQueryResponder(ETHTYPE 0x0945, IP $srcr_ip, ETH $wireless_mac, LT lt, ARP arp, DEBUG false); query_responder -> SetSRChecksum -> [0] output; query_forwarder -> SetSRChecksum -> [0] output; query_forwarder [1] -> query_responder; data_ck :: SetSRChecksum() input [1] -> host_cl :: IPClassifier(dst net $srcr_ip mask $srcr_nm, -) -> querier -> data_ck; host_cl [1] -> [0] set_gw [0] -> querier; // JunPark: PVPMerger() //pvpmerger :: PVPMerger(ETHTYPE 0x0971, // IP $srcr_ip, // ETH $wireless_mac, // CAPACITY 10, // DEBUG false); // JunPark: PVPManager() before WifiEncap //pvpmanager :: PVPManager(ETHTYPE 0x0971, // IP $srcr_ip, // ETH $wireless_mac, // CAPACITY 10, // DEBUG false); forwarder[0] -> dt ::DecIPTTL -> data_ck // -> pvpmanager // JunPark -> [2] output; dt[1] -> ICMPError($srcr_ip, timeexceeded, 0) -> querier; // queries querier [1] -> [1] query_forwarder; es -> [1] output; forwarder[1] //ip packets to me -> StripSRHeader() -> CheckIPHeader(CHECKSUM false) -> from_gw_cl :: IPClassifier(src net $srcr_ip mask $srcr_nm, -) -> [3] output; from_gw_cl [1] -> [1] set_gw [1] -> [3] output; input [0] -> ncl :: Classifier( 12/0943 , //srcr_forwarder 12/0944 , //srcr 12/0945 , //replies 12/0941 , //srcr_es 12/092c , //srcr_gw 12/0971 , //pvp ); ncl[0] -> CheckSRHeader() -> [0] forwarder; ncl[1] -> CheckSRHeader() -> query_forwarder ncl[2] -> CheckSRHeader() -> query_responder; ncl[3] -> es; ncl[4] -> CheckSRHeader() -> gw; ncl[5] -> CheckSRHeader() -> [0] forwarder; //ncl[5] -> pvpmerger -> CheckSRHeader() -> [0] forwarder; } control :: ControlSocket("TCP", 7777); chatter :: ChatterSocket("TCP", 7778); // 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(ath2, 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(5.195.4.24, 255.0.0.0, 00:18:6E:C3:04:18, false, "12 60 12 1500 18 1500 24 1500 36 1500 48 1500 72 1500 96 1500 108 1500"); srcr1_host :: LinuxIPHost(srcr1, 5.195.4.24, 255.0.0.0) -> srcr1_cl :: IPClassifier(dst net 10.0.0.0/8, -); 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(00:18:6E:C3:04:18, 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;