diff --git a/src/cw/send.c b/src/cw/send.c index 4ee7ecc1..65c2535e 100644 --- a/src/cw/send.c +++ b/src/cw/send.c @@ -65,7 +65,53 @@ int conn_send_msg(struct conn * conn, uint8_t *rawmsg) } +int conn_send_data_msg(struct conn * conn, uint8_t *rawmsg,int len) +{ + int packetlen = len; + cw_dbg_msg(DBG_MSG_OUT, conn,rawmsg, packetlen,(struct sockaddr*)&conn->addr); + + + uint8_t * ptr = rawmsg; + + int fragoffset = 0; + + int hlen = cw_get_hdr_hlen(rawmsg)*4; + + int mtu = conn->mtu; + + while (packetlen>mtu){ + cw_set_hdr_flags(rawmsg,CW_FLAG_HDR_F,1); + cw_put_dword(ptr+4, conn->fragid<<16 | fragoffset<<3 ); + + cw_dbg_pkt(DBG_PKT_OUT,conn,ptr,mtu,(struct sockaddr*)&conn->addr); + + if (conn->write_data(conn,ptr,mtu)<0) + return -1; + + // XXX Fragmentation stuff.. + ptr +=mtu-hlen; + fragoffset+=(mtu-hlen)/8; + + packetlen-=mtu-hlen; + + } + + + if (fragoffset) + cw_set_hdr_flags(rawmsg,CW_FLAG_HDR_F | CW_FLAG_HDR_L,1); + else + cw_set_hdr_flags(rawmsg,CW_FLAG_HDR_F,0); + + cw_put_dword(ptr+4, conn->fragid<<16 | fragoffset<<3 ); + + + cw_dbg_pkt(DBG_PKT_OUT,conn,ptr,packetlen,(struct sockaddr*)&conn->addr); + + return conn->write_data(conn,ptr,packetlen-0); + + +}