int wfaSetSockMcastRecvOpt(int sockfd, char *mcastgroup) { struct ip_mreq mcreq; int so; mcreq.imr_multiaddr.s_addr = inet_addr(mcastgroup); mcreq.imr_interface.s_addr = htonl(INADDR_ANY); so = wSETSOCKOPT(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void *)&mcreq, sizeof(mcreq)); return so; }
/* * wfaCreateTCPServSock(): initially create a TCP socket * intput: port -- TCP socket port to listen * return: socket id; */ int wfaCreateTCPServSock(unsigned short port) { int sock; /* socket to create */ struct sockaddr_in servAddr; /* Local address */ const int on = 1; /* Create socket for incoming connections */ if ((sock = wSOCKET(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { DPRINT_ERR(WFA_ERR, "createTCPServSock socket() failed"); return WFA_FAILURE; } /* Construct local address structure */ wMEMSET(&servAddr, 0, sizeof(servAddr)); wfaGetifAddr(gnetIf, &servAddr); servAddr.sin_family = AF_INET; /* Internet address family */ //servAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */ servAddr.sin_port = htons(port); /* Local port */ wSETSOCKOPT(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); /* Bind to the local address */ if (wBIND(sock, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0) { DPRINT_ERR(WFA_ERR, "bind() failed"); return WFA_FAILURE; } /* Mark the socket so it will listen for incoming connections */ if (wLISTEN(sock, MAXPENDING) < 0) { DPRINT_ERR(WFA_ERR, "listen() failed"); return WFA_FAILURE; } return sock; }
int wfaSetSockMcastSendOpt(int sockfd) { unsigned char ttlval = 1; return wSETSOCKOPT(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &ttlval, sizeof(ttlval)); }
/* * wfaTGSetPrio(): This depends on the network interface card. * So you might want to remap according to the driver * provided. * The current implementation is to set the TOS/DSCP bits * in the IP header */ int wfaTGSetPrio(int sockfd, int tgUserPriority) { int tosval; socklen_t size = sizeof(tosval); wGETSOFD(sockfd, IPPROTO_IP, IP_TOS, &tosval, &size); switch(tgUserPriority) { case TG_WMM_AC_BK: // user priority "1" /*Change this value to the ported device*/ tosval = TOS_BK; break; case TG_WMM_AC_VI: // user priority "5" /*Change this value to the ported device*/ tosval = TOS_VI; break; case TG_WMM_AC_UAPSD: tosval = 0x88; break; case TG_WMM_AC_VO: // user priority "6" /*Change this value to the ported device*/ tosval = TOS_VO; break; case TG_WMM_AC_BE: // user priority "0" tosval = TOS_BE; break; /* For WMM-AC Program User Priority Defintions */ case TG_WMM_AC_UP0: tosval = 0x00; break; case TG_WMM_AC_UP1: tosval = 0x20; break; case TG_WMM_AC_UP2: tosval = 0x40; break; case TG_WMM_AC_UP3: tosval = 0x60; break; case TG_WMM_AC_UP4: tosval = 0x80; break; case TG_WMM_AC_UP5: tosval = 0xa0; break; case TG_WMM_AC_UP6: tosval = 0xc0; break; case TG_WMM_AC_UP7: tosval = 0xe0; break; default: tosval = 0x00; /* default */ ; } #ifdef WFA_WMM_PS_EXT psTxMsg[1] = tosval; #endif if ( sockfd > 0) { if(wSETSOCKOPT ( sockfd, IPPROTO_IP, IP_TOS, &tosval, sizeof(tosval)) != 0) { DPRINT_ERR(WFA_ERR, "wfaTGSetPrio: Failed to set IP_TOS\n"); } } else { DPRINT_INFO(WFA_OUT, "wfaTGSetPrio::socket closed\n"); } return (tosval == 0xE0)?0xD8:tosval; }