99 lines
1.9 KiB
C
99 lines
1.9 KiB
C
|
|
#include "conn.h"
|
|
#include "capwap.h"
|
|
#include "log.h"
|
|
#include "sock.h"
|
|
|
|
|
|
int conn_send_msg(struct conn * conn, uint8_t *rawmsg)
|
|
{
|
|
|
|
int packetlen = cw_get_hdr_msg_total_len(rawmsg);
|
|
|
|
uint8_t * msgptr = rawmsg + cw_get_hdr_msg_offset(rawmsg);
|
|
|
|
|
|
/* Zyxel doesn't count msg element length from
|
|
behind seqnum */
|
|
if (conn->capwap_mode == CWMODE_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 );
|
|
|
|
|
|
{
|
|
char h[200];
|
|
hdr_print(h,ptr,mtu);
|
|
cw_dbg(DBG_CW_PKT_OUT,"Sending capwap packet to %s:\n%s",sock_addr2str(&conn->addr),h);
|
|
}
|
|
cw_dbg_dmp(DBG_CW_PKT_DMP,ptr,mtu,"Sending packet ...");
|
|
|
|
|
|
if (conn->write(conn,ptr,mtu)<0)
|
|
return -1;
|
|
|
|
ptr +=mtu-hlen;
|
|
fragoffset+=(mtu-hlen)/8;
|
|
|
|
packetlen-=mtu-hlen;
|
|
|
|
//XXX if (hlen>8)
|
|
// memcpy(ptr+8,cwmsg->ctrlhdr+8,hlen-8);
|
|
|
|
}
|
|
|
|
// val = (preamble << 24) | ((hlen/4)<<19) | (cwmsg->rid<<14) |(wbid<<9) |
|
|
/*CWTH_FLAGS_T|*/ //cwmsg->flags;
|
|
|
|
|
|
//printf("VAL = %08x, %08x\n",val,cwmsg->flags);
|
|
|
|
//printf("FRag offset :::::::::::::::::::::::::::: %d\n",fragoffset);
|
|
|
|
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);
|
|
|
|
|
|
// printf("Setting first byte %08X\n",val);
|
|
// *((uint32_t*)ptr)=htonl(val);
|
|
|
|
|
|
// val = conn->fragid<<16 | fragoffset<<3;
|
|
// *((uint32_t*)(ptr+4))=htonl(val);
|
|
|
|
cw_put_dword(ptr+4, conn->fragid<<16 | fragoffset<<3 );
|
|
|
|
|
|
{
|
|
// char h[1024];
|
|
// hdr_print(h,ptr,msglen-fragoffset*8+hlen);
|
|
// cw_dbg(DBG_CW_PKT_OUT,"Sending capwap packet to %s:\n%s",sock_addr2str(&conn->addr),h);
|
|
}
|
|
|
|
|
|
cw_dbg_dmp(DBG_CW_PKT_DMP,ptr,packetlen,"Sending packet ...");
|
|
//return conn->write(conn,ptr,msglen-fragoffset*8+hlen);
|
|
|
|
|
|
|
|
printf("Send packet len %p %d\n",ptr,packetlen);
|
|
|
|
return conn->write(conn,ptr,packetlen);
|
|
}
|
|
|