diff --git a/src/cw/conn_send_msg.c b/src/cw/conn_send_msg.c index 6f18cf56..8e2fffa8 100644 --- a/src/cw/conn_send_msg.c +++ b/src/cw/conn_send_msg.c @@ -3,6 +3,7 @@ #include "dbg.h" #define CW_MODE_ZYXEL 7 +extern cw_send_msg(struct conn * conn,uint8_t * msg); int conn_send_msg(struct conn * conn, uint8_t *rawmsg) { @@ -14,6 +15,7 @@ int conn_send_msg(struct conn * conn, uint8_t *rawmsg) cw_dbg_msg(DBG_MSG_OUT, conn,rawmsg, packetlen,(struct sockaddr*)&conn->addr); + /* Zyxel doesn't count msg element length from behind seqnum */ if (conn->capwap_mode == CW_MODE_ZYXEL){ @@ -28,7 +30,31 @@ int conn_send_msg(struct conn * conn, uint8_t *rawmsg) hlen = cw_get_hdr_hlen(rawmsg)*4; mtu = conn->mtu; -mtu = 800; +mtu = 440; + mtu = mtu >> 3; + mtu = mtu << 3; + + printf("packetlenX = %d (%d)\n",packetlen,hlen); + int offset = cw_get_hdr_msg_offset(rawmsg); + return cw_send_msg(conn,rawmsg+offset); + + + if (packetlen>mtu){ + cw_set_hdr_flags(ptr,CAPWAP_FLAG_HDR_F,1); + cw_set_dword(ptr+4, conn->fragid<<16 | fragoffset<<3 ); + cw_dbg_pkt(DBG_PKT_OUT,conn,ptr,mtu,(struct sockaddr*)&conn->addr); + if (conn->write(conn,ptr,mtu)<0) + return -1; + cw_set_hdr_flags(ptr,CAPWAP_FLAG_HDR_M,0); + cw_set_hdr_flags(ptr,CAPWAP_FLAG_HDR_W,0); + + fragoffset+=(mtu-hlen)/8; + hlen = 8; + ptr += mtu-hlen; + packetlen-=mtu-hlen; + memcpy(ptr,rawmsg,hlen); + + } while (packetlen>mtu){