The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Ограничение пропускной способности"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Ограничение пропускной способности"  
Сообщение от Sergey (??) on 19-Май-06, 12:11 
Есть задача, не могу решить полностью.

Нужно написать фильтр, который ограничивает поток данных N байт в секунду. Есть два типа действия над пакетом, если превышен трафик за секунду: sleep – спим нужное кол-во времени, чтобы протолкнуть пакет, учитывая ограничение на скорость, refuse – просто не разрешаем его дальше передавать.

Может кто-нибудь решал уже подобное?

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Ограничение пропускной способности"  
Сообщение от Resident email on 19-Май-06, 15:14 
Что-нить подобное -- это что? Работал кто-нить с потоком или со слипами? :)

А вообще нетграф решает, даже не представляю себе где там можно найти проблему для решеня этой задачи, всё прозрачно и надёжно будет.


Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

2. "Ограничение пропускной способности"  
Сообщение от Sergey (??) on 19-Май-06, 15:27 
>Что-нить подобное -- это что? Работал кто-нить с потоком или со слипами?
>:)
>
>А вообще нетграф решает, даже не представляю себе где там можно найти
>проблему для решеня этой задачи, всё прозрачно и надёжно будет.

Я имею в виду написание приложения (драйвера, фильтра) на некотором языке программирования, которое ограничивает поток данных. Т.е. на входе ему посылаются пакеты, а он либо разрешает их дальше роутить, либо отбрасывает, роутинг заканчивается.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

3. "Ограничение пропускной способности"  
Сообщение от chip email(ok) on 19-Май-06, 16:59 
>>Что-нить подобное -- это что? Работал кто-нить с потоком или со слипами?
>>:)
>>
>>А вообще нетграф решает, даже не представляю себе где там можно найти
>>проблему для решеня этой задачи, всё прозрачно и надёжно будет.
>
>Я имею в виду написание приложения (драйвера, фильтра) на некотором языке программирования,
>которое ограничивает поток данных. Т.е. на входе ему посылаются пакеты, а
>он либо разрешает их дальше роутить, либо отбрасывает, роутинг заканчивается.

man 4 dummynet

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

4. "Ограничение пропускной способности"  
Сообщение от vvvua email(ok) on 22-Май-06, 15:32 
Уже написал полгода назад ;-)
Работает совместно с iptables.
Выкладываю.

EN:
In order to run this software you have to build your kernel with
ip_queue support and packet iptables-dev installed with libipq lib.

To compile:
   ./mk

To add filter:

  iptables -I OUTPUT -d 10.0.0.1 -p icmp --icmp-type ping -j QUEUE

To view filter:

  iptables -L -v -n -x

RU:
Для запуска этого ПО необходима поддержка ядром функции ip_queue и пакетом iptables-dev
с библиотекой libipq;

Для компиляции:
   ./mk

Для добавления фильтра:

  iptables -I OUTPUT -d 10.0.0.1 -p icmp --icmp-type ping -j QUEUE

Для просмотра фильтра:

  iptables -L -v -n -x

/*
Packet delayer.
(c) Volodymyr Skrypka. vmskrypkaATyandexDOTruREMOVETHIS
Based on libpq example code and code from book "Advanced Linux Programming" ( Mark Mitchel, ...)

*/
#include <linux/netfilter.h>
#include <libipq.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>


#define TIME 10000

#define BUFSIZE 2048

int nsleep (double sleep_time)
{

  struct timespec tv;
  
  tv.tv_sec = (time_t) sleep_time;
  tv.tv_nsec= (long) ((sleep_time -tv.tv_sec)*1e+9);
  printf("\nDelaying packet for %d sec %d nsec\n", tv.tv_sec,tv.tv_nsec);
  while(1)
  {
    int rval = nanosleep(&tv,&tv);
    if(rval == 0)
      return 0;    //sleep ok
    else
      if (errno=EINTR)
        continue;
      else
        return rval; //unknown error
  }
  return 0;
  
  /*
  tv.tv_sec = 0;
  tv.tv_nsec= TIME;
  printf("\nDelaying packet for %d sec %d nsec\n", tv.tv_sec,tv.tv_nsec);
  nanosleep(&tv,&tv);
*/
}
  

static void die(struct ipq_handle *h)
{
        ipq_perror("passer");
        ipq_destroy_handle(h);
        exit(1);
}

int main(int argc, char **argv)
{
        int status;
        unsigned char buf[BUFSIZE];
    double delay=0;
        struct ipq_handle *h;
        if(argc<2)
    {
      printf("\nUsage: \n%s DELAY_VALUE_IN_SECONDS\nExample:\n%s 0.1\n",argv[0],argv[0]);
      exit(0);
    }
    delay = atof(argv[1]);
    if(delay==0.0)
    {
      printf("\nConversion error\n");
      exit(1);
    }
        h = ipq_create_handle(0, PF_INET);
        if (!h)
                die(h);
                
        status = ipq_set_mode(h, IPQ_COPY_PACKET, BUFSIZE);
        if (status < 0)
                die(h);
                
        do{
                status = ipq_read(h, buf, BUFSIZE, 0);
                if (status < 0)
                        die(h);
                        
                switch (ipq_message_type(buf)) {
                        case NLMSG_ERROR:
                                fprintf(stderr, "Received error message %d\n",
                                        ipq_get_msgerr(buf));
                                break;
                                
                        case IPQM_PACKET: {
                                ipq_packet_msg_t *m = ipq_get_packet(buf);
                
                nsleep(delay);
                                
                                status = ipq_set_verdict(h, m->packet_id,
                                                         NF_ACCEPT, 0, NULL);
                            
                                if (status < 0)
                                        die(h);
                    
                
                
                                break;
                        }
                        
                        default:
                                fprintf(stderr, "Unknown message type!\n");
                                break;
                }
        } while (1);
        
        ipq_destroy_handle(h);
        return 0;
}

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

5. "Ограничение пропускной способности"  
Сообщение от Sergey (??) on 22-Май-06, 16:24 
Всем большое спасибо.
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру