<div dir="ltr"><div>Hi, Ivan</div>
<div> </div>
<div>1) First pls fix the following critical bug, readIndex  is modified by readField cause delivered by reference, so every not first iteration it'll have a bad value :</div>
<div> </div>
<div>*** ./DCCHDispatch.bug.cpp 2012-11-01 12:33:43.000000000 +0200<br>--- ./DCCHDispatch.cpp 2012-11-01 16:48:29.000000000 +0200<br>***************<br>*** 469,474 ****<br>--- 469,475 ----<br>      }<br>      L3Frame *l3 = new L3Frame(msg->tail(8), UNIT_DATA);<br>
      COUT("RX: [ BTS <- PCU ] AGCH: " << *l3);<br>+     readIndex = 0; //vr, fix<br>      l2Len = msg->readField(readIndex, len);<br>      l3->L2Length(l2Len);<br>      AGCH->send(l3);</div>
<div> </div>
<div><br>or ( I like it more )</div>
<div> </div>
<div>*** ./DCCHDispatch.bug.cpp 2012-11-01 12:33:43.000000000 +0200<br>--- ./DCCHDispatch.fix0.cpp 2012-11-01 17:58:15.000000000 +0200<br>***************<br>*** 431,438 ****<br>  <br>   char buf[MAX_UDP_LENGTH];<br>  <br>
-  unsigned len = 6;<br>-  size_t readIndex = 0;<br>   size_t l2Len = 0;<br>  <br>   // Send to PCU PhConnectInd primitive.<br>--- 431,436 ----<br>***************<br>*** 469,475 ****<br>      }<br>      L3Frame *l3 = new L3Frame(msg->tail(8), UNIT_DATA);<br>
      COUT("RX: [ BTS <- PCU ] AGCH: " << *l3);<br>!     l2Len = msg->readField(readIndex, len);<br>      l3->L2Length(l2Len);<br>      AGCH->send(l3);<br>      txPhDataIndCnf(*msg, gBTS.time());<br>
--- 467,473 ----<br>      }<br>      L3Frame *l3 = new L3Frame(msg->tail(8), UNIT_DATA);<br>      COUT("RX: [ BTS <- PCU ] AGCH: " << *l3);<br>!     l2Len = msg->peekField(0, 6);<br>      l3->L2Length(l2Len);<br>
      AGCH->send(l3);<br>      txPhDataIndCnf(*msg, gBTS.time());<br>***************<br>*** 479,486 ****<br>      L3Frame *msg1 = new L3Frame(msg->tail(8*4), UNIT_DATA);<br>      L3Frame *msg2 = new L3Frame(msg->tail(8*4), UNIT_DATA);<br>
      COUT("RX: [ BTS <- PCU ] PCH: " << *msg1);<br>!     readIndex = 24;<br>!     l2Len = msg->readField(readIndex, len);<br>      msg1->L2Length(l2Len);<br>      msg2->L2Length(l2Len);<br>      // HACK -- We send every page twice.<br>
--- 477,483 ----<br>      L3Frame *msg1 = new L3Frame(msg->tail(8*4), UNIT_DATA);<br>      L3Frame *msg2 = new L3Frame(msg->tail(8*4), UNIT_DATA);<br>      COUT("RX: [ BTS <- PCU ] PCH: " << *msg1);<br>
!     l2Len = msg->peekField(8*3, 6);<br>      msg1->L2Length(l2Len);<br>      msg2->L2Length(l2Len);<br>      // HACK -- We send every page twice.</div>
<div> </div>
<div> </div>
<div>I would reccomend also to fix BitVector.cpp known bug:</div>
<div>void BitVector::unpack(const unsigned char* src)<br>{<br> // Assumes MSB-first packing.<br> unsigned bytes = size()/8;<br> for (unsigned i=0; i<bytes; i++) {<br>  fillField(i*8,src[i],8);<br> }<br> unsigned whole = bytes*8;<br>
 unsigned rem = size() - whole;<br> if (rem==0) return;<br>        fillField(whole,src[bytes] >> (8-rem),rem); //here<br>}</div>
<div> </div>
<div>USRPDevice.cpp known bug:</div>
<div>double USRPDevice::setTxGain(double dB) {<br> <br>   writeLock.lock();<br>   if (dB > maxTxGain()) dB = maxTxGain();<br>   if (dB < minTxGain()) dB = minTxGain();</div>
<div>   LOG(NOTICE) << "Setting TX gain to " << dB << " dB.";</div>
<div>   if (!m_dbTx->set_gain(dB)) // here<br>     LOG(ERR) << "Error setting TX gain";</div>
<div>   writeLock.unlock();<br>  <br>   return dB;<br>}</div>
<div><br>BSIC calculation:</div>
<div> </div>
<div>prim->u.info_ind.bsic = (gConfig.getNum("GSM.Identity.BSIC.NCC") << 3) | gConfig.getNum("GSM.Identity.BSIC.BCC");</div>
<div> </div>
<div> </div>
<div> </div>
<div>2) With up to date OpenBTS pulled from git today and critical fix only I've got the results identical to session 2 and 3 I've recorded yesterday. I attach the file with problematic scenario. I think you may recreate the problem with every SonyErricson supporting 3G and GSM (my env is Suse 11.4 or Ubuntu 11.10, libusb_1_0 and libusrp-3.4.2).</div>

<div> </div>
<div>Regards,</div>
<div>Vladimir</div>
<div> </div></div>