Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> netmap, где грабли ? 
:(
    Опции темы
box
Дата 11.9.2013, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



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

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 (когда как) сеть подвисает, пакеты перестают обрабатываться интерфейсом.
подскажите куда копать .

PM MAIL   Вверх
box
Дата 12.9.2013, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



вообщем так тоже виснет :
Код

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;
    }
    }

я зашел в тупик, что я делаю не так ?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0392 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.