Changeset 4278

Show
Ignore:
Timestamp:
08/18/08 17:37:20 (6 years ago)
Author:
soohyunc
Message:

o now, video traffic is driven by TFWC's Ack

-- i.e., removed output(pb) method in Transmitter::send() method, and

moved it to SessionManager::parse_xr_records().

Location:
vic/branches/cc
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • vic/branches/cc/cc/tfwc_sndr.h

    r4277 r4278  
    8383        inline u_int16_t tfwc_sndr_get_aoa() { return aoa_; } 
    8484 
     85        // return just acked seqno 
     86        inline u_int16_t tfwc_sndr_just_acked() { return just_acked_; } 
     87 
    8588        // return tfwc controlled cwnd value 
    8689        inline u_int32_t tfwc_magic() { return cwnd_; }; 
  • vic/branches/cc/rtp/session.cpp

    r4276 r4278  
    11621162        UNUSED(addr); 
    11631163 
     1164        // XR block flags 
    11641165        u_int16_t flags = xr->xr_flags; 
    1165         u_int16_t ackofack = ntohs(xr->begin_seq); 
    1166         u_int16_t seqno = ntohs(xr->end_seq); 
     1166 
     1167        // ackofack and seqno 
     1168        ackofack_ = ntohs(xr->begin_seq); 
     1169        seqno_ = ntohs(xr->end_seq); 
    11671170 
    11681171        // we received seqno/ackofack, so do receiver stuffs here 
    1169         if (seqno != ackofack) { 
     1172        if (seqno_ != ackofack_) { 
    11701173                printf("RECEIVER RECEIVER!!\n"); 
    11711174                // parse seqno, ackofack, and timestamp from XR report block 
    11721175                if(flags == XR_BT_1) { 
    1173                         ackofack_ = ackofack; 
    1174                         seqno_ = seqno; 
    1175  
    11761176                        // this is XR conveys seqno and ackofack 
    11771177                        tfwc_rcvr_recv(flags, seqno_, ackofack_, 0); 
     
    12051205                } 
    12061206 
    1207                 // we need to call Transmitter::output(pb) here 
    1208                 //output(pb); 
     1207                // we need to call Transmitter::output(pb) here (make Ack driven) 
     1208                cc_output(); 
     1209        } 
     1210} 
     1211 
     1212void SessionManager::cc_output()  
     1213{ 
     1214        pktbuf* pb = get_packet_queue(); 
     1215        tfwc_sndr_send(pb); 
     1216 
     1217        // cwnd value 
     1218        int magic = (int) tfwc_magic(); 
     1219        // last acked seqno 
     1220        int jack = (int) tfwc_sndr_just_acked(); 
     1221        // current packet's seqno 
     1222        int seqno = (int) tfwc_sndr_get_seqno(); 
     1223 
     1224        // if the current packet seqno is within (cwnd + jack) 
     1225        // then send the packets 
     1226        if (seqno <= magic + jack) { 
     1227                while (seqno <= magic + jack) 
     1228                        output(pb);             // call Transmitter::output(pb) 
     1229        } 
     1230        // otherwise, just queue up the packets 
     1231        else { 
     1232                if (head_ != 0) { 
     1233                        tail_->next = pb; 
     1234                        tail_ = pb; 
     1235                } else 
     1236                        tail_ = head_ = pb; 
     1237                pb->next = 0; 
    12091238        } 
    12101239} 
     
    12411270        SourceManager& sm = SourceManager::instance(); 
    12421271        Source& s = *sm.localsrc(); 
    1243         rtcphdr* rh = (rtcphdr *)pktbuf_; 
     1272        rtcphdr* rh = (rtcphdr*)pktbuf_; 
    12441273        rh->rh_ssrc = s.srcid(); 
    1245         int flags = RTP_VERSION << 14; 
     1274        int flags = RTP_VERSION << 14;  // RTCP flags 
     1275        int layer = ch - ch_; //LLL 
     1276        Source::Layer& sl = s.layer(layer); 
     1277        timeval now = unixtime(); 
     1278        sl.lts_ctrl(now); 
    12461279 
    12471280        // set RTCP flag to  XR packet 
     
    12581291 
    12591292                // make 'begin_seq' equal to 'end_seq' 
    1260                 xr->begin_seq = htons(xr->end_seq); 
     1293                xr->begin_seq = htons(seqno_); 
     1294                xr->end_seq = htons(seqno_); 
    12611295 
    12621296                // get ackvec from TfwcRcvr 
  • vic/branches/cc/rtp/session.h

    r4262 r4278  
    133133        void build_ackv_pkt(CtrlHandler* ch, rtcp_xr* xr); 
    134134        void build_ts_echo_pkt(CtrlHandler* ch, rtcp_xr* xr); 
     135        void cc_output(); 
    135136 
    136137protected: 
  • vic/branches/cc/rtp/transmitter.cpp

    r4275 r4278  
    9292        loop_layer_(1000), 
    9393        loopback_(0), 
    94         is_cc_active_(1) 
     94        is_cc_active_(1), 
     95        is_first_(1) 
    9596{ 
    9697        memset((char*)&mh_, 0, sizeof(mh_)); 
     
    213214void Transmitter::send(pktbuf* pb) 
    214215{ 
     216        // CC is active, so just follow CC routines  
     217        // (i.e., not sending packets here) 
    215218        if (is_cc_active_) { 
    216                 // pass pktbuf to TfwcSndr 
    217                 tfwc_sndr_send(pb); 
    218  
    219                 // get CC'd cwnd value 
    220                 int magic = (int) tfwc_magic(); 
    221  
    222                 // pktbuf size 
    223                 int queue = 100;  
    224  
    225                 if (queue <= magic)  
     219                // if it is the very first packet, just send it. 
     220                if(is_first_) { 
     221                        tfwc_sndr_send(pb); 
    226222                        output(pb); 
     223                        is_first_ = false; 
     224                }  
     225                // if it is not, just queue up the packets. 
    227226                else { 
    228227                        if (head_ != 0) { 
     
    233232                        pb->next = 0; 
    234233                } 
    235         } else { 
     234 
     235                // record the local pb pointer to the global location 
     236                pb_ = pb; 
     237        }  
     238        // CC is not active, so just go for the normal operation 
     239        else { 
    236240                if (!busy_) { 
    237241                        double delay = txtime(pb); 
  • vic/branches/cc/rtp/transmitter.h

    r4244 r4278  
    8787        void send(pktbuf*); 
    8888        inline bool is_cc_on() { return is_cc_active_; } 
     89        inline pktbuf* get_packet_queue() { return pb_;} 
    8990        /* 
    9091         * Buffer allocation hooks. 
     
    116117        pktbuf* head_; 
    117118        pktbuf* tail_; 
     119        pktbuf* pb_; 
    118120 
    119121        int loop_layer_;        /* # of layers to loop back (for testing) */ 
     
    125127        /* Cc related variables */ 
    126128        bool is_cc_active_;             /* is Cc module activated?              */ 
     129        bool is_first_;         /* is this first CC'd data packet?      */ 
    127130 
    128131    private: