int Socket_DispatchUDPRecvData( u8 *pData, int varlen, int messagelen, struct sockaddr_t addr, socklen_t addrLen) { int ret; u8 Udp_ReDiscover[200] = {0}; char Udp_ReOnBoarding[8] = {0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x02}; if( pData[7]==0x01 )//OnBoarding { GAgent_Printf(GAGENT_INFO,"OnBoarding"); Udp_Onboarding(pData,messagelen); Socket_sendto(g_UDPServerFd, Udp_ReOnBoarding, 8, &addr, sizeof(struct sockaddr_t)); DRV_GAgent_Reset(); return 0; } if( pData[7]==0x03 ) //Ondiscover { GAgent_Printf(GAGENT_INFO,"Ondiscover"); Build_BroadCastPacket( 0, Udp_ReDiscover ); ret = Socket_sendto(g_UDPServerFd, Udp_ReDiscover,Udp_ReDiscover[4]+5, &addr, sizeof(struct sockaddr_t)); if(ret != Udp_ReDiscover[4]+5) { GAgent_Printf(GAGENT_ERROR,"send discover response fail.ret:0x%x", ret); } return 0; } GAgent_Printf(GAGENT_WARNING,"invalid udp packet [%d]", pData[7]); return -1; }
/**************************************************************** * FunctionName : send_broadCastPacket * Description : Send BroadCast data. * Add by Frank Liu --2015-04-14 ****************************************************************/ void send_broadCastPacket(pgcontext pgc,uint8* ptxBuf,uint16 cmdWord) { int32 ret = 0; int32 len = 0; struct sockaddr_t addr; memset(&addr,0,sizeof(addr)); resetPacket(pgc->rtinfo.Rxbuf); addr = pgc->ls.addr; if(NULL == ptxBuf) { return; } ret = combination_broadcast_packet(pgc,ptxBuf,cmdWord); if((RET_SUCCESS == ret) && (INVALID_SOCKET != pgc->ls.udpBroadCastServerFd)) { len = ptxBuf[4] + LAN_PROTOCOL_HEAD_LEN + 1; ret = Socket_sendto(pgc->ls.udpBroadCastServerFd,ptxBuf,len,&addr,sizeof(addr)); GAgent_Printf( GAGENT_INFO,"Send BroadCast datalen=%d cmd=%04X ret :%d",len,cmdWord,ret ); } return ; }
static uint8_t sendMessage(struct Message* message, struct Interface* iface) { struct UDPAddrInterface_pvt* context = Identity_cast((struct UDPAddrInterface_pvt*) iface->senderContext); struct Sockaddr_storage addrStore; Message_pop(message, &addrStore, context->pub.addr->addrLen); Assert_true(addrStore.addr.addrLen == context->pub.addr->addrLen); if (Socket_sendto(context->socket, message->bytes, message->length, 0, &addrStore.addr) < 0) { switch (Errno_get()) { case Errno_EMSGSIZE: return Error_OVERSIZE_MESSAGE; case Errno_ENOBUFS: case Errno_EAGAIN: return Error_LINK_LIMIT_EXCEEDED; default:; Log_info(context->logger, "Got error sending to socket [%s]", Errno_getString()); } } return 0; }
/***************************************** * * time : send broadcast time * *******************************************/ void Socket_SendBroadCastPacket( int time ) { int i; int ret; u8 Udp_Broadcast[200]; if (g_UDPBroadcastServerFd == -1) { return; } Build_BroadCastPacket( 1,Udp_Broadcast ); for( i=0;i<time;i++) { if(g_UDPBroadcastServerFd>-1) { ret = Socket_sendto(g_UDPBroadcastServerFd, Udp_Broadcast,Udp_Broadcast[4]+5, &g_stUDPBroadcastAddr, sizeof(g_stUDPBroadcastAddr)); GAgent_Printf(GAGENT_DEBUG, "Socket_SendBroadCastPacket, sendto ret %d", ret); } } return; }
/**************************************************************** * FunctionName : send_broadCastPacket * Description : Send BroadCast data. * Add by Frank Liu --2015-04-14 ****************************************************************/ void send_broadCastPacket(pgcontext pgc,uint8* ptxBuf,uint16 cmdWord) { int32 ret = 0; int32 len = 0; struct sockaddr_t addr; memset(&addr,0,sizeof(addr)); addr = pgc->ls.addr; if(NULL == ptxBuf) { return; } ret = combination_broadcast_packet(pgc,ptxBuf,cmdWord); if((RET_SUCCESS == ret) && (INVALID_SOCKET != pgc->ls.udpBroadCastServerFd)) { len = ptxBuf[4] + LAN_PROTOCOL_HEAD_LEN + 1; Socket_sendto(pgc->ls.udpBroadCastServerFd,ptxBuf,len,&addr,sizeof(addr)); } return ; }