LINUX.ORG.RU

qos (tos) в программах на С под линуксом


0

0

Здравствуйте уважаемые коллеги!

Написал простую тестовую сетевую программу на C, отправляющую UDP пакет с заданным параметром TOS в заголовке пакета. TOS устанавливается командой setsockopt:
=========
int new_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (new_socket < 0) {
printf("Socket()- couldn't create socket!\n");
return -1;
}
int fval=160; // fval=0xA0
if (setsockopt(new_socket, IPPROTO_IP, IP_TOS, (void*) &fval, sizeof(fval)) < 0) {
printf("setsockopt()- can't set tos!\n");
return -1;
}
=========

Так вот, если программа запускается от непривилегированного пользователя, то командой setsockopt не получается устанавливить байт TOS больше чем 0x9F. От рута все работает нормально. Просветите пожалуйста, почему так? Что нужно поменять в системе, чтобы setsockopt заработала и от обычного пользователя? Линукс - рэдхат какойто, 7 или 8, не помню точно.
Заранее спасибо!
Алексей


linux/kernel26/net/ipv4/ip_sockglue.c
[...]
		case IP_TOS:    /* This sets both TOS and Precedence */
                        if (sk->sk_type == SOCK_STREAM) {
                                val &= ~3;
                                val |= inet->tos & 3;
                        }
                        if (IPTOS_PREC(val) >= IPTOS_PREC_CRITIC_ECP &&
                            !capable(CAP_NET_ADMIN)) {
                                err = -EPERM;
                                break;
                        }
                        if (inet->tos != val) {
                                inet->tos = val;
                                sk->sk_priority = rt_tos2priority(val);
                                sk_dst_reset(sk);
                        }
                        break;
[...]

У тебя два варианта:

1. дать процессу CAP_NET_ADMIN

2. Пересобрать ядро, изменивши linux/kernel26/include/linux/ip.h
#define IPTOS_PREC_CRITIC_ECP           0xa0

logIN
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.