5 #include <sys/socket.h>
6 #include <netinet/in.h>
17 #define BASE_PORT 5100
18 #define BUFFSIZE 65536
21 /* Turn on/off debugging */
24 const int prio_to_ac[8] = {2,3,3,2,1,1,0,0};
25 const unsigned int ac_to_tos[4] = {224,160,96,64};
26 int ac_sockfd[AC_QUEUES];
33 for (i = 0 ; i < AC_QUEUES; i++)
34 close(ac_sockfd[AC_QUEUES]);
39 int create_ac_socket(unsigned int ac)
41 struct sockaddr_in my_addr;
43 unsigned int yes=1, tos;
46 if ((sockfd = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
48 perror("Socket nelze otevrit");
52 if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {
53 perror("Chyba v nastaveni soketu");
57 // bzero(&my_addr, sizeof(my_addr));
58 memset(&my_addr,0, sizeof(my_addr));
59 my_addr.sin_family = AF_INET;
60 my_addr.sin_addr.s_addr = INADDR_ANY;
61 my_addr.sin_port = htons(BASE_PORT + ac);
63 if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(my_addr)) == -1) {
64 perror("Chyba v bind");
69 //tos = ((AC_QUEUES - ac) *2 - 1)*32;
71 if (setsockopt(sockfd, SOL_IP, IP_TOS, &tos, sizeof(tos))) {
72 perror("Unable to set TOS");
80 void* qhandler(void* queue)
83 struct sockaddr_in rem_addr;
85 unsigned int ac, rem_addr_length;
88 printf("AC= %d\n",ac);
89 rem_addr_length=sizeof(rem_addr);
91 while ((mlen = recvfrom(ac_sockfd[ac], buff, sizeof(buff) , 0, \
92 (struct sockaddr*)&rem_addr, &rem_addr_length)) < 0) {
93 if (errno == EINTR) continue;
94 perror("Chyba pri prijimani pozadavku");
102 while (sendto(ac_sockfd[ac], buff, mlen,0 ,(struct sockaddr*)&rem_addr, \
103 sizeof(rem_addr)) < 0){
104 if (errno == EINTR) continue;
105 perror("Chyba pri zapisu");
112 int main(int argc, char *argv[])
118 pthread_attr_init(&attr);
120 if (signal(SIGTERM, stopper) == SIG_ERR) {
121 perror("Signal handler registration error");
125 if (signal(SIGINT, stopper) == SIG_ERR) {
126 perror("Signal handler registration error");
130 for (i = 0; i < AC_QUEUES; i++) {
131 ac_sockfd[i] = create_ac_socket(i);
132 rc = pthread_create(&thread, &attr, qhandler, (void*) i);