Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > netmap, где грабли ?


Автор: box 11.9.2013, 20:22
всем привет!
пытаюсь дропнуть, не нужный пакет из кольцевого буфера нетмап:
Код

while (limit-- > 0) {
struct netmap_slot *rs = &rxring->slot[j];
struct netmap_slot *ts = &txring->slot[k];
uint32_t pkt;

/* swap packets */
if (ts->buf_idx < 2 || rs->buf_idx < 2) {D("wrong index rx[%d] = %d  -> tx[%d] = %d", j, rs->buf_idx, k, ts->buf_idx);sleep(2);}

char *rxbuf = NETMAP_BUF(rxring, rs->buf_idx);
int    res = check_(rxbuf, rs->len);

if(res == 0){          
drop_count++;
cout << drop_count << endl;
memset(rxbuf, 0, rs->len);
}
                    
pkt = ts->buf_idx;
ts->buf_idx = rs->buf_idx;
rs->buf_idx = pkt;

/* copy the packet length.*/
if (rs->len < 14 || rs->len > 2048)D("wrong len %d rx[%d] -> tx[%d]", rs->len, j, k);else if (verbose > 1)D("%s send len %d rx[%d] -> tx[%d]", msg, rs->len, j, k);
ts->len = rs->len;
          

ts->flags |= NS_BUF_CHANGED;
rs->flags |= NS_BUF_CHANGED;
        
        
j = NETMAP_RING_NEXT(rxring, j);
k = NETMAP_RING_NEXT(txring, k);

rxring->avail--;
txring->avail--;
rxring->cur = j;
txring->cur = k;
    
    }

функция int res = check_(rxbuf, rs->len); чекает пакет и если возвращает 0 то дропаем пакет 
решил сделать с наименьщими кодо затратами: 
           memset((char *)&rxbuf, 0, rs->len);
тобиш когда надо дропнуть пакет мы просто заполняем текущий буфер пакета нулями и отправляем его в стек 
проблема в том что когда кол-во дропнутых пакетов превышает 500-2500 (когда как) сеть подвисает, пакеты перестают обрабатываться интерфейсом.
подскажите куда копать .

Автор: box 12.9.2013, 18:32
вообщем так тоже виснет :
Код

while (limit-- > 0) {
struct netmap_slot *rs = &rxring->slot[j];
struct netmap_slot *ts = &txring->slot[k];
uint32_t pkt;
/* swap packets */
if (ts->buf_idx < 2 || rs->buf_idx < 2) {D("wrong index rx[%d] = %d  -> tx[%d] = %d", j, rs->buf_idx, k, ts->buf_idx);sleep(2);}
char *rxbuf = NETMAP_BUF(rxring, rs->buf_idx);
int    res = check_(rxbuf, rs->len);
if(res == 0){          
drop_count++;
cout << drop_count << endl;

j = NETMAP_RING_NEXT(rxring, j);
rxring->avail--;
rxring->cur = j;

}else{
                    
pkt = ts->buf_idx;
ts->buf_idx = rs->buf_idx;
rs->buf_idx = pkt;
/* copy the packet length.*/
if (rs->len < 14 || rs->len > 2048)D("wrong len %d rx[%d] -> tx[%d]", rs->len, j, k);else if (verbose > 1)D("%s send len %d rx[%d] -> tx[%d]", msg, rs->len, j, k);
ts->len = rs->len;
          
ts->flags |= NS_BUF_CHANGED;
rs->flags |= NS_BUF_CHANGED;
        
        
j = NETMAP_RING_NEXT(rxring, j);
k = NETMAP_RING_NEXT(txring, k);
rxring->avail--;
txring->avail--;
rxring->cur = j;
txring->cur = k;
    }
    }

я зашел в тупик, что я делаю не так ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)