FossilOrigin-Name: 968d10c26f0cd7ba32e00b75d6af37d689aade5c2098caa9e2113bc3df285fb1
This commit is contained in:
7u83@mail.ru
2015-04-14 05:42:23 +00:00
parent 2adfefefaa
commit 3c831ae8b1
22 changed files with 288 additions and 90 deletions

View File

@ -3,9 +3,76 @@
#include "conn.h"
#include "capwap.h"
#include "log.h"
#include "dbg.h"
#include "sock.h"
#include "timer.h"
int conn_send_msg(struct conn * conn, uint8_t *rawmsg)
{
int packetlen = cw_get_hdr_msg_total_len(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){
// XXX val-=3;
}
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(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(conn,ptr,packetlen-0);
}
int cw_send_request(struct conn *conn,int msg_id)
{
cw_init_request(conn, msg_id);
@ -13,8 +80,6 @@ int cw_send_request(struct conn *conn,int msg_id)
return 0;
conn_send_msg(conn, conn->req_buffer);
int i;
int rc=-1;