📄 lcm_eiadrv.c
字号:
#ifdef __cplusplusextern "C"{#endif #include "syscfg.h"#if( CONFIG_BOARD_GMPU == TRUE || CONFIG_BOARD_EIA == TRUE )#include "aos.h"#include "p2p_include.h"#include "ip/ip_pub.h" #include "socket/sock_pub.h" #include "socket/sock_err.h"#if( CONFIG_BOARD_EIA == TRUE )#include "cfm/cfm_pub.h"#endif#include "../ker/ssp_msg.h"#include "lcm_q921.h"#include "lcm_udpdrv.h"#define DRV_EIA_DEBUG( fmt, eiano, p1, p2, p3 )void drv_eia_send_auth( MSG_S *pMsg, SOCKADDRIN_S *pTo, U32 tcpflag, U32 tcpSeq, U32 tcpAck );VOID drv_eia_send( U32 eia_no, struct msg_blk *mb ){ EIA_TABLE_S *pEia; if( NULL == mb || NULL == mb->data ) { if( NULL != mb ) { msg_free( mb ); } return ; } pEia = drv_get_eia_cb(eia_no); if( (NULL == pEia) || (FALSE == pEia->status) ) { goto err_ret; } drv_udp_send( pEia, eia_no, mb ); return;err_ret: aos_dmem_free( (VOID*)mb->head ); msg_free( mb );}void drv_eia_send_auth_ack( U16 eia_no, MSG_S *pMsg, SOCKADDRIN_S *pFrom, U32 tcpflag ){ EIA_TABLE_S *pEia; pEia = drv_get_eia_cb(eia_no); if( (NULL == pEia) || (FALSE == pEia->status) ) { goto err_ret; } drv_eia_send_auth( pMsg, pFrom, tcpflag, pEia->tcpSeq, pEia->tcpAck ); if(tcpflag) { pEia->tcpSeq += pMsg->ulSize + sizeof(struct eia_msg_hdr); } return;err_ret: aos_msg_free( pMsg->pvMsgBuf );}void drv_eia_send_auth_req( MSG_S *pMsg, SOCKADDRIN_S *pTo, U32 tcpflag ){ EIA_TABLE_S *pEia; pEia = &eia_table[0]; if( tcpflag ) { AOS_ASSERT(0); aos_dmem_free( mem_obj_head(pMsg->pvMsgBuf) ); return; } drv_eia_send_auth( pMsg, pTo, tcpflag, pEia->tcpSeq, pEia->tcpAck );}void drv_eia_send_auth( MSG_S *pMsg, SOCKADDRIN_S *pTo, U32 tcpflag, U32 tcpSeq, U32 tcpAck ){ struct eia_msg_hdr *headp; MSG_HEAD_S *pMsgHead; struct msg_blk *newmb; if( NULL == pMsg || NULL == pMsg->pvMsgBuf ) { return; } pMsgHead = (MSG_HEAD_S*)((U32)pMsg->pvMsgBuf - ELEMENT_OFFSET(MSG_HEAD_S,msg)); if( NULL == pTo ) { aos_dmem_free( (VOID*)pMsgHead ); return; } if( (LOCAL_PROCESSOR_ID != pMsg->srcProcessorId) || (MPE_DEV != pMsg->srcMpe) || (MPE_DEV != pMsg->dstMpe) ) { aos_dmem_free( (VOID*)pMsgHead ); return; } newmb = msg_alloc(); if( NULL == newmb ) { aos_dmem_free( (VOID*)pMsgHead ); return; } newmb->head = (U8*)pMsgHead; newmb->truelen = (U32)pMsg->ulSize + ELEMENT_OFFSET( MSG_HEAD_S, msg ); newmb->end = newmb->head + newmb->truelen; newmb->data = (U8*)pMsg->pvMsgBuf; newmb->len = pMsg->ulSize; newmb->tail = newmb->data + newmb->len; headp = (struct eia_msg_hdr*)msg_push(newmb,sizeof(struct eia_msg_hdr) ); headp->msg_type = EIA_AUTHEN; headp->not_ordered = 1; headp->is_new_ver = 1; headp->is_siptrunk = 0; headp->eia_no_hi = 0x0F; headp->eia_no_lo = U8_BUTT; headp->timestamp = 0; headp->tx_serialno= 0; #if CONFIG_BOARD_GMPU == TRUE if( tcpflag ) { lcm_tcp_rapid_send_to_eth( g_lcm_rel_udp_port, tcpSeq, tcpAck, newmb, pTo ); } else { lcm_rapid_send_to_eth( g_lcm_rel_udp_port, newmb, pTo ); }#else lcm_rapid_send_to_eth( g_lcm_rel_udp_port, newmb, pTo );#endif}void drv_eia_add( U16 eiano, SOCKADDRIN_S *pFrom, U32 tcpflag, U32 tcpSeq, U32 tcpAck, U32 new_lcm_ver ){ EIA_TABLE_S *pEia; DRV_EIA_DEBUG( "add eia %d", eiano, 0, 0, 0 ); if( NULL == pFrom ) { return; } pEia = drv_get_eia_cb(eiano); if( NULL == pEia ) { return; } tcpAck += sizeof(struct eia_msg_hdr);#if( CONFIG_BOARD_EIA == TRUE ) if( (S32)(pEia->tcpSeq - tcpSeq) > 0 ) { tcpSeq = pEia->tcpSeq; } if( (S32)(pEia->tcpAck - tcpAck) > 0 ) { tcpAck = pEia->tcpAck; }#endif drv_udp_add( pEia, pFrom, tcpflag, tcpSeq, tcpAck, new_lcm_ver );}void drv_eia_delete( U16 eiano ){ EIA_TABLE_S *pEia; DRV_EIA_DEBUG( "deleate eia %d", eiano, 0, 0, 0 ); pEia = drv_get_eia_cb(eiano); if( NULL == pEia ) { return; } drv_udp_delete( pEia );}U16 drv_eia_get_peer_port( U16 eiano ){ EIA_TABLE_S *pEia; pEia = drv_get_eia_cb(eiano); if( NULL == pEia || FALSE == pEia->status ) { return U16_BUTT; } return AOS_NTOHS(pEia->addr.sin_usPort);}U32 drv_eia_get_peer_ip( U16 eiano ){ EIA_TABLE_S *pEia; pEia = drv_get_eia_cb(eiano); if( NULL == pEia || FALSE == pEia->status ) { return U16_BUTT; } return pEia->addr.sin_stAddr.s_ulAddr;}U32 drv_eia_is_tcp_mode( U16 eiano ){ EIA_TABLE_S *pEia; pEia = drv_get_eia_cb(eiano); if( NULL == pEia || FALSE == pEia->status ) { return 0; } return pEia->is_tcp_mode;}#endif#ifdef __cplusplus}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -