Brn master 20051115.click
Jump to navigation
Jump to search
// // 802.11b access point // // needs INTERFACE (interface for the ap), SSID (name of the network), CHANNEL (operating channel), BEACON_INTERVAL // (interval for sending beacons in milliseconds) // input[0] from device with decap and so on, only management frames ???? filtering necessary (only packets for me?) // output[0] to device without encap, settx and so on elementclass AccessPoint { DSR $DSR, INTERFACE $device, SSID $ssid, CHANNEL $channel, BEACON_INTERVAL $beacon_interval | AddressInfo(ether_address $device:eth); winfo :: WirelessInfo(SSID $ssid, BSSID ether_address, CHANNEL $channel, INTERVAL $beacon_interval); rates :: AvailableRates(DEFAULT 2 4 11 12 18 22); input[0] -> mgt_cl :: Classifier(0/00%f0, //assoc req 0/10%f0, //assoc resp 0/40%f0, //probe req 0/50%f0, //probe resp 0/80%f0, //beacon 0/a0%f0, //disassoc 0/b0%f0, //disassoc ); mgt_cl[0] //-> PrintWifi("assoc_req") //-> AssociationResponder(WIRELESS_INFO winfo, RT rates) -> BRNAssocResponder(DEBUG false, WIRELESS_INFO winfo, RT rates, AssocList client_lst) //-> PrintWifi("assoc_reply") -> [0]output; mgt_cl[1] //-> PrintWifi("assoc_resp") -> Discard; mgt_cl[2] -> BeaconSource(WIRELESS_INFO winfo, RT rates) -> [0]output; mgt_cl[3] //-> PrintWifi("probe_resp") -> Discard; mgt_cl[4] -> BeaconScanner(RT rates) -> Discard; mgt_cl[5] //-> PrintWifi("disassoc") -> Discard; mgt_cl[6] //-> PrintWifi("auth") -> OpenAuthResponder(WIRELESS_INFO winfo) //-> PrintWifi("auth_reply") -> [0]output; } // // BRN Dynamic Source Routing // // input[0] - ethernet (802.3) frames from external nodes (no BRN protocol) // input[1] - BRN DSR packets from internal nodes // input[2] - failed transmission of a BRN DSR packet (broken link) from ds // [0]output - ethernet (802.3) frames to external nodes/clients or me (no BRN protocol) // [1]output - BRN DSR packets to internal nodes (BRN DSR protocol) elementclass DSR {$DEVICE_1, $DEVICE_2, $DEVICE_3 | // // definitions // rc :: BrnRouteCache(ACTIVE false, DROP /* 1/20 = 5% */ 0, SLICE /* 100ms */ 0, TTL /* 4*100ms */4); lt :: BrnLinkTable(rc); id :: NodeIdentity($DEVICE_1, $DEVICE_2, $DEVICE_3, lt); brn_encap :: BRNEncap; dsr_decap :: DSRDecap(id, lt); dsr_encap :: DSREncap(id, lt); nb :: DstClassifier(id, client_lst); querier :: RouteQuerier(lt, dsr_encap, brn_encap, dsr_decap); req_forwarder :: RequestForwarder(id, lt, dsr_decap, dsr_encap, brn_encap, querier, client_lst); rep_forwarder :: ReplyForwarder(id, dsr_decap, querier, client_lst, dsr_encap, lt); src_forwarder :: SrcForwarder(id, client_lst, dsr_encap, dsr_decap, lt); err_forwarder :: ErrorForwarder(id, lt, client_lst, dsr_encap, dsr_decap, querier, brn_encap); // ------------------ // external packets // ------------------ input[0] //-> Print(XXXXX) -> clf_bcast :: Classifier(0/ffffffffffff, -); // broadcast & unicast packets clf_bcast[0] -> Discard; clf_bcast[1] //-> Print(from_ext_node) -> nb; nb[0] // packet is for me -> [0]output; nb[1] // packet for associated client (external) -> [0]output; nb[2] // packet for internal nodes //-> Print(dest_far_away) -> querier; querier[0]-> [1]output; // rreq packets (broadcast) querier[1]-> [0]src_forwarder; // src routed packets (unicast) src_forwarder[0] //-> Print(forward_packet) -> [1]output; src_forwarder[1] //-> Print(for_me_or_assoc_client) -> [0]output; // ------------------ // internal packets // ------------------ input[1] //-> $NB_LST // collect information about neighbors //-> NeighborList($NB_LST) -> dsrclf :: Classifier(6/01, //DSR_RREQ 6/02, //DSR_RREP 6/03, //DSR_RERR 6/04, //DSR_SRC ); dsrclf[0] //-> Print(rreq) -> req_forwarder[0] -> [1]output; req_forwarder[1] //-> BRNPrint(to_replier) -> [0]rep_forwarder -> [1]output; dsrclf[1] //-> Print(reply) -> [1]rep_forwarder; dsrclf[2] //-> Print(error) -> [1]err_forwarder -> [1]output; dsrclf[3] //-> Print(dsr_src) -> [1]src_forwarder; // ------------------ // undeliverable packets // ------------------ input[2] -> [0]err_forwarder; } // // BRN DHCP // // input - broadcast packets (no arp, no brn) // output - dhcp packets (to wireless queue) elementclass DHCP { server :: DHCPServerLeases(10.9.0.1 , 10.9.0.0); input // check for dhcp //-> Print(Check_for_dhcp) -> EtherDecap() -> Align(4, 0) -> ip_check :: CheckIPHeader(CHECKSUM true) -> udp_check::CheckUDPHeader -> ipclass :: IPClassifier(icmp type echo-reply, -); ipclass[0] //-> Print("ICMP ECHO REPLY") -> [1]serverOffer :: DHCPServerOffer(server); ipclass[1] -> CheckDHCPMsg(request) -> class :: DHCPClassifier( discover, request, release, -); class[0] //-> Print(DISCOVER) -> [0]serverOffer; class[1] //-> Print(REQUEST) -> DHCPServerACKorNAK(server) -> UDPIPEncap( 10.9.0.1, 67, 255.255.255.255, 68 ) -> EtherEncap( 0x0800, my_wlan, ff:ff:ff:ff:ff:ff) -> output; class[2] //-> Print(RELEASE) -> DHCPServerRelease(server); class[3] //-> Print(OTHER_drop) -> Discard; serverOffer[0] -> UDPIPEncap( 10.9.0.1, 67, 255.255.255.255, 68 ) -> EtherEncap( 0x0800, my_wlan, ff:ff:ff:ff:ff:ff) -> output; serverOffer[1] -> icmpEncap::ICMPPingEncap(10.9.0.1, 255.255.255.255) -> DHCP_ICMP_Encap(serverOffer.dhcp_icmp_ping_src, serverOffer.dhcp_icmp_ping_dst) -> output; class[4] -> Discard(); class[5] -> Discard(); class[6] -> Discard(); class[7] -> Discard(); class[8] -> Discard(); } out_q_0 :: Null(); //wifi_out_queue does the job // ---------------------------------------------------------------------------- // Integration of DSR // ---------------------------------------------------------------------------- AddressInfo(my_wlan ath0:eth); AddressInfo(my_vlan eth0:eth); //me :: NodeIdentity(my_wlan, my_vlan); nb_lst :: NeighborList(); // collect information about neighbors dsr :: DSR(ath0, eth0, eth0); // using DSR ds :: BRNDS(dsr/id, nb_lst); client_lst :: AssocList(); client_ds :: ClientDS(ath0, eth0, vlan2, vlan0, client_lst); // ---------------------------------------------------------------------------- // AP-Functionality // ---------------------------------------------------------------------------- // TODO: BEACON_INTERVAL 100 ap :: AccessPoint(DSR dsr, INTERFACE ath0, SSID ##brn2##, CHANNEL 1, BEACON_INTERVAL 100); // ---------------------------------------------------------------------------- // Link Metric // ---------------------------------------------------------------------------- //ett_metric :: BRNETTMetric(LT dsr/lt); etx_metric :: BRNETXMetric(LT dsr/lt); link_stat :: BRNLinkStat(ETHTYPE 0x0a04, NODEIDENTITY dsr/id, PERIOD 300 /* .3 sec */, TAU 30000, ##PROBES##, //ETT ett_metric, ETX etx_metric, RT ap/rates, LOGGING true); // ---------------------------------------------------------------------------- // ARP-Table required for gateway functionality // ---------------------------------------------------------------------------- arp :: ARPTable(); // ---------------------------------------------------------------------------- // Handling ath0-device // ---------------------------------------------------------------------------- FromDevice(ath0) //, PROMISC true -> Prism2Decap() -> ExtraDecap() -> FilterPhyErr() -> filter :: FilterTX(); filter[0] -> WifiDupeFilter() -> mgm_clf :: Classifier(0/00%0f, -); // management frames mgm_clf[0] //handle mgmt frames -> ap -> SetTXRate(22) // ap beacons send at constant bitrate -> wlan_out_queue :: NotifierQueue(50); mgm_clf[1] //handle other frames (data) -> WifiDecap() //-> rxstats :: RXStats() -> clf_bcast :: Classifier(0/ffffffffffff, -); // broadcast & unicast packets clf_bcast[0] // -> ToDump(from.dat, ENCAP ETHER) -> arp_clf :: Classifier (12/0806, 12/8086, -); // ---------------------------------------------------------------------------- // Handling DHCP queries // ---------------------------------------------------------------------------- //TODO dhcp :: DHCP(); arp_clf[2] // check for dhcp //-> Discard; //Idle() -> dhcp -> WifiEncap(0x02, WIRELESS_INFO ap/winfo) //to station -> SetTXRate(22) // currently bitrate with clients no adopted -> wlan_out_queue; clf_bcast[1] -> protoclf :: Classifier(12/8086, //brn-protocoll -); arp_clf[0] -> Discard; arp_clf[1] // brn broadcasts -> protoclf; protoclf[1] //simple packets (no brn) //-> PrintWifi(from_dev) -> Classifier(12/0800) // ip packet -> host_cl :: IPClassifier(dst net 10.9.1.1 mask 255.255.255.0, -); host_cl[0] // for other brn clients or internal nodes -> [0]dsr; //AddressInfo(gw 00:0F:B5:3F:21:60); //AddressInfo(gw 00:0F:B5:3F:1B:BF); //AddressInfo(gw 00:0F:B5:3F:1E:EA); //AddressInfo(gw 00:0F:B5:3F:20:D6); host_cl[1] // packet for the outside world //-> Print(set_brn_gw) //-> BRNGateway(gw) // prefered gw -> [0]dsr; protoclf[0] //brn packets //-> Print(brn, 128) -> EtherDecap() -> nb_lst //know your neighbor -> brnclf :: Classifier(0/01, //BrnSDP 0/02, //BrnTFTP 0/03, //BrnDSR 0/04, //BrnBcast 0/06, //LinkProbe - //other ); brnclf[0] // sdp -> Discard; brnclf[1] // tftp -> Discard; brnclf[2] //dsr -> [1]dsr; brnclf[3] //bcast -> Discard; brnclf[4] //linkprobe //-> Print(linkprobe) -> link_stat -> SetTimestamp() -> EtherEncap(0x8086, my_wlan, ff:ff:ff:ff:ff:ff) //-> Print(link_probe_to_dev) -> WifiEncap(0x00, 0:0:0:0:0:0) // packet to brn peer node -> wlan_out_queue; brnclf[5] //other -> Discard; //Idle() //-> [1]udt dsr[0] //for an assoc client //-> Print(from_dsr0) -> dst_clf :: DstClassifier(dsr/id, client_lst); //udt[0] // -> Print(UDT_0) // -> dst_clf; dst_clf[1] // for assoc client //-> Print(packet_assoc_client_raw) -> client_ds; client_ds[0] //-> Print(wireless_client) -> WifiEncap(0x02, WIRELESS_INFO ap/winfo) //to station -> SetTXRate(22) // no bitrate selection to client nodes! -> wlan_out_queue; client_ds[1] -> dev_eth0_q :: Queue -> dev_eth0 :: ToDevice(eth0); //eth0 client_ds[2] -> Discard; //vlan2 client_ds[3] -> Discard; //vlan0 (debug) dst_clf[0] //-> Print(packet_for_me) -> Classifier(12/0800) // ip packet -> CheckIPHeader(14) //-> IPPrint(xxx) -> tohost_cl :: IPClassifier(dst net 10.9.1.1 mask 255.255.255.0, -); dst_clf[2] //-> Print(Unknown) -> Discard; tohost_cl[0] //-> Print(to_ping) -> EtherDecap() -> CheckIPHeader -> ICMPPingResponder -> BRNEtherEncap //-> Print(ping_resp) -> [0]dsr; // back on route tohost_cl[1] // for the tun device //-> Print(ToHost) // -> IPPrint(ToHost) // -> ToHost(ath0); -> SetEtherAnno() -> MarkIPHeader(14) -> rewriter2 :: EtherIpAddrRewriter(ACTIVE false) //-> IPPrint(before) -> Print(before) -> dev_eth0_q; // -> Print(to_tun) // -> Strip(14) // -> MarkIPHeader(0) //-> StoreIPEthernet(arp) // store ip mac combination //-> EtherDecap() // -> CheckIPHeader(0) // -> IPPrint(to_fake) // replace the real destination address with the fake address // -> StoreIPAddress(192.168.3.22, 12) //src // -> SetPacketType(HOST) // -> SetIPChecksum // -> IPPrint(to_fake2) // -> EtherEncap(0x0800, my_vlan, my_vlan) // -> Print(to_fake2) // -> ToHost(eth0); dsr[1] //for an other internal node; make use of ds //-> Print(from_dsr1) -> ds; ds[0] -> out_q_0; ds[1] -> Discard; ds[2] -> Discard; out_q_0 -> WifiEncap(0x00, 0:0:0:0:0:0) // sollte das WDS Packet erzeugen mit Hilfe eines Parameters -> SetTXRate(22) -> wlan_out_queue //-> SetTXRate(22) -> SetTXPower(63) //-> PrintWifi(to_wlan) //-> ToDump(todev_node5, ENCAP 802_11) -> ExtraEncap() -> ToDevice(ath0); filter[1] //take a closer look at tx-annotated packets -> failures :: FilterFailures(); failures[0] -> Discard; failures[1] -> WifiDupeFilter() -> mgm_clf2 :: Classifier(0/00%0f, -); // management frames mgm_clf2[0] //handle mgmt frames -> Discard; mgm_clf2[1] //other frames //-> PrintWifi(failure) -> WifiDecap() -> Classifier(12/8086) //handle only brn protocol //-> Print(failure) -> EtherDecap() -> [2]dsr; // ------------------------------------------------ // Test Area // ------------------------------------------------ AddressInfo(peer_client 00:11:11:3E:B8:79); chan_setter :: SetChannel(ath0); ch :: CompoundHandler( debug, "ds dsr/id dsr/lt dsr/dsr_encap dsr/brn_encap dsr/dsr_decap client_lst nb_lst dsr/querier dsr/req_forwarder dsr/rep_forwarder dsr/src_forwarder dsr/err_forwarder", false ); poki :: PokeHandlers(//write client_lst.insert 00:0e:35:a2:e4:31 ath0, //associate client with node1 // write madwifi_rate.debug true, // write dhcp/server.dhcpd_conf // subnet 10.9.1.0 netmask 255.255.255.0{ // option routers 10.9.1.1 // option subnet-mask 255.255.255.0 // option domain-name brn // option domain-name-servers 141.20.20.50 // range dynamic-bootp 10.9.1.2 10.9.1.30 // default-lease-time 3000 // max-lease-time 6000 // }, wait 1, // read dhcp/server.read_free_leases, // write dsr/querier.fixed_route // 00:0f:b5:3f:21:60 // 00:0f:b5:3f:20:d6 // 00:0f:b5:3f:1e:ea // 00:0f:b5:0b:95:29 // 00:0f:b5:3f:1b:bf // 00:0e:35:a2:e4:31 );