Vic-2.8-cqcam Ohjelman rakenne verkko-osan kohdalta Yritys selvittää vicin rakenne verkko-osan kannalta, jotta voitaisiin muuttaa vicin käynnistys *ilman* vastapään verkko-osoitetta toimivaksi. Muutamia relevantteja tiedostoja: ** main.cc - Pääohjelman sisältävä C++ -tiedosto, jossa aloitusparametrit luetaan ja defaultHostSpec-muuttuja, jossa on komentorivillä annettu vastapään osoite. ** cf-main.tcl - tcl-pääohjelma, jossa alustetaan muut ohjelmakomponentit Siellä erityisesti init_network. ** cf-network.tcl - tcl-verkonalustuskoodi. Koodi verkon avaamiselle IP:llä tai ATM:llä. Seuraavassa koodi ATM-yhteyden avaamiselle vastapäähän. Sisällä kommentit kohdissa, joihin pitäisi tehdä muutoksia, jotta saataisiin jostain vastapään ATM-osoite selville ilman sen antoa komentorivillä. # # $dst is an "atm-host" # proc net_open_atm { sessionType session dst } { global V set dataSAP 57 set ctrlSAP 59 #ToveATM -luokasta varmaankin uusi instanssi? set dn [new network atm] if { $dn == "" } { warn "not compiled with ATM support" exit 1 } #XXX should be able to configure qos parameters #Seuraavat rivit #Client-osassa OK, mutta serverissä ei tiedetä vielä tässä vaiheessa #mitään osoitteesta. #vat_net-atm.cc:ssä on luokka ToveATM. Metodien command ja sitten open #avulla suoritetaan data ja kontrollikanavan avaus #eli ToveATM :: command ajetaan alla olevan tcl-openin yhteydessä #commandissa vertaillaan onko kyseessä client (open) vai palvelin (listen) if { [$dn open $dst $dataSAP 256 64 128 128 2 1] < 0 } { warn "cannot open atm connection to $dst" exit 1 } $session data-net $dn set cn [new network atm] if { [$cn open $dst $ctrlSAP 128 64 24 24 2 1] < 0 } { warn "cannot open atm control connection to $dst" exit 1 } $session ctrl-net $cn set V(ctrl-net) $cn set V(data-net) $dn } #saman tiedoston init_network proc init_network {} { #resource network on komentorivillä annettu parametri -n set netType [resource network] if { [info procs net_open_$netType] == "" } { warn "$netType not a recognized network type" exit 1 } set sessionType [resource sessionType] if { $sessionType == "rtpv2" || $sessionType == "vic" } { set sessionType rtp } global V set V(sessionType) $sessionType set V(session) [new session $V(media)/$sessionType] if { $V(session) == "" } { warn "'$sessionType' not a recognized session type" exit 1 } #ajetaan net_open_atm. Parametrinä väliteään komentorivillä annettu #defaultHostSpec net_open_$netType $sessionType $V(session) [resource defaultHostSpec] $V(session) max-bandwidth [resource maxbw] set key [resource sessionKey] if { $key != "" } { crypt_set $key } } ** vat_net-atm.cc rakenne (client) * normaalit proseduurit sokettiyhteyden avaamiselle socket() setsockopt() text2atm() connect() kaikki metodissa ToveATM :: atmconnect vat_net-atms.cc rakenne (serveri) * normaalit proseduurit sokettiyhteden kuuntelulle socket() setsockopt() bind() listen() accept() // tähän vaiheeseen pitäisi saada getpeername toimimaan tai jotain Huom ei käytetä parametrina välitettyä osoitetta ATMNumber phoneno_ * atmconnect()-metodista kutsutaan atmlisten():iä. Johtuu alkuperäisestä vicin ForeATM-kortille tehdystä toteutuksesta, joka oli hieman hassu. Siinä oli toteutusideana seuraava: vicciä käynnistettäessä ensimmäiseksi käynnistetty vic omaksuu *automaat- tisesti* palvelimen roolin ja seuraava saa connectin läpi sitten. Eli atmconnect()-metodissa on connect()-kutsu, joka epäonnistuessaan (eli en- simmäisen kerran) ajaa läpi sekvenssin bind(), listen(), accept() ja näin pystyttää kuuntelevan puolen. Toisella kerralla connect menee läpi ja client-puoli nousee seuraavaksi. Muutokset koodiin, jotta osoitetta ei serverille tarvitsisi antaa komentorivillä: ** main.cc: Muuta seuraavasta defaultHostSpec joksikin muuksi (ei NULL). const char* dst; if (optind < argc && argc > 1) { dst = argv[optind]; if (argc - optind > 1) { fprintf(stderr, "vic: extra arguments (starting with `%s')\n", argv[optind + 1]); exit(1); } } else if ((dst = tcl.attr("defaultHostSpec")) == 0) { fprintf(stderr, "vic: destination address required\n"); exit(1); } tcl.add_option("defaultHostSpec", dst); ** cf-network.tcl: dst tulee muuttumattomana tänne asti. proc net_open_atm { sessionType session dst } { global V set dataSAP 60 set ctrlSAP 59 set dn [new network atm] if { $dn == "" } { warn "not compiled with ATM support" exit 1 } #XXX should be able to configure qos parameters if { [$dn open $dst $dataSAP 256 64 128 128 2 1] < 0 } { warn "cannot open atm connection to $dst" exit 1 } $session data-net $dn set cn [new network atm] if { [$cn open $dst $ctrlSAP 128 64 24 24 2 1] < 0 } { warn "cannot open atm control connection to $dst" exit 1 } $session ctrl-net $cn set V(ctrl-net) $cn set V(data-net) $dn } Tämän jälkeen osoitetta ei enää käytetä, joten tässä tietysti voisi yrittää asettaa osoitteen varmuuden vuoksi johonkin arvoon. Esim. getpeername() ja atm2text() avulla. Kaiken kaikkiaan serveripuolen muuntaminen osoitteettoman käyttöön pitäisi olla varsin yksinkertainen homma :) Makefileen muutokset objektifilen kohdalle main-cl.cc ja main-sv.cc ja muutoksia tuohon main-sv.cc:hen em. kohdille. *** Vicin lopettaminen Quit-näppäimen painalluksesta. ui-main.tcl: proc build.bar w { ... button $w.bar.quit -text Quit -relief raised \ -font [smallfont] -command adios \ -highlightthickness 1 command adios on löytyy session.cc:stä void adios() { if (SourceManager::instance().localsrc() != 0) manager->send_bye(); exit(0); } send_bye videosessioon löytyy myös session.cc:stä kuten myös send_reportkin void SessionManager::send_bye() { send_report(1); } void SessionManager::send_report(int bye) { ... if (bye) len += build_bye((rtcphdr*)rr, s); ... } ****************************************************** SAP:n välitys komentoriviltä tai muuten cf-network.tcl: proc init_network ja proc net_open_atm init_network ei anna parametreina SAP:a net_open_atm:lle sitä kutsuessaan. SAP:n voisi määritellä annettavaksi komentorvillä tms. Se välitettäisiin net_open:lle ja täten muutettaisiin ei kiinteäksi arvoksi. Tämän jälkeen voisi yrittää vaihtaa vat_net-atm(s).cc:ssä olevaa atmlisten:ä select():ä käyttäväksi.