www.pudn.com > kRtspProxyd.zip > dataswitching.c
/* * * KrtspProxyd * * for data switching between the content server and the client * */ #include#include #include #include #include #include #include #include #include #include "structure.h" #include "prototypes.h" extern int errno; int DataSwitching(const int CPUNR) { struct shok *cur; char *buf; struct sockaddr_in sin; int addr_len = sizeof(sin); int count = 0; EnterFunction("DataSwitching"); cur = threadinfo[CPUNR].gShokQueue; if((buf = kmalloc((size_t)2048, GFP_KERNEL))==NULL) { KRTSPROXYD_OUT(KERN_ERR "not enough MEMORY!\n"); return count; } while (cur) { do_routine doit; int ret = 0; unsigned int fromIP = (unsigned int)0xFFFFFFFF; unsigned short fromPort = (unsigned short)0xFFFF; again: doit = NULL; if(!skb_queue_empty(&(cur->socket->sk->receive_queue)))//have we gotten data till now? { ret = UdpReceiveBuffer(cur->socket, buf, 2048, 0, (struct sockaddr *)&sin, &addr_len); if (ret > 0) { ipList *ipl = NULL; KRTSPROXYD_OUT(KERN_INFO "success in RECV data from UDP socket!!and the data length is %d\n", ret); count++; //net byte order!! fromIP = sin.sin_addr.s_addr; fromPort = ntohs(sin.sin_port); ipl = find_ip_in_list(cur->ips, fromIP); if (ipl) doit = ipl->what_to_do; if (doit && ipl) { ret = (*doit)(ipl->what_to_do_it_with, buf, ret); //send out data if ( ret == -1) { // what to do about termination, etc. KRTSPROXYD_OUT(KERN_ERR "put returns error %d\n", errno); count--; } else if (ret == 0) { // client or server whatever died if (((trans_pb*)(ipl->what_to_do_it_with))->status) *(((trans_pb*)(ipl->what_to_do_it_with))->status) = 1; KRTSPROXYD_OUT(KERN_INFO "client/server died\n"); count--; } // what to do about incomplete packet transmission } goto again; } else if (ret< 0) { if (errno != 11) //not eagain KRTSPROXYD_OUT(KERN_ERR "recv_udp returns errno %d\n", errno); } cur = cur->next; } else cur = cur->next; } kfree(buf); LeaveFunction("DataSwitching"); return count; }