diff --git a/src/cw/conn_send_msg.c b/src/cw/conn_send_msg.c index 72d0c3a4..1fbb7466 100644 --- a/src/cw/conn_send_msg.c +++ b/src/cw/conn_send_msg.c @@ -53,10 +53,10 @@ int conn_send_msg(struct cw_Conn * conn, uint8_t *rawmsg) - /* Zyxel doesn't count msg element length from - behind seqnum */ + // Zyxel doesn't count msg element length from +// behind seqnum * / // if (conn->capwap_mode == CW_MODE_ZYXEL){ -/* // XXX val-=3; */ +// * // XXX val-=3; * / // } @@ -75,7 +75,7 @@ mtu = 9440; 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 ); @@ -103,7 +103,7 @@ mtu = 9440; if (conn->write(conn,ptr,mtu)<0) return -1; -/* // XXX Fragmentation stuff.. */ +/ * // XXX Fragmentation stuff.. * / ptr +=mtu-hlen; fragoffset+=(mtu-hlen)/8; @@ -122,6 +122,6 @@ mtu = 9440; cw_dbg_pkt(DBG_PKT_OUT,conn,ptr,packetlen,(struct sockaddr*)&conn->addr); - return conn->write(conn,ptr,packetlen-0); + return conn->write(conn,ptr,packetlen-0); */ } diff --git a/src/cw/cw.h b/src/cw/cw.h index cf28afab..fce80c8e 100644 --- a/src/cw/cw.h +++ b/src/cw/cw.h @@ -219,7 +219,7 @@ void cw_set_hdr_rid(uint8_t * th, int rid); * @see #cw_is_request */ -#define cw_is_response(msg_id) (!is_response(msg_id)) +#define cw_is_response(msg_id) (!cw_is_resquest(msg_id)) uint8_t *cw_get_hdr_msg_elems_ptr(uint8_t * m); diff --git a/src/cw/cw_inline.c b/src/cw/cw_inline.c index 1cb560fb..21a1d93e 100644 --- a/src/cw/cw_inline.c +++ b/src/cw/cw_inline.c @@ -136,7 +136,7 @@ int cw_set_hdr_rmac(uint8_t * th, bstr_t rmac) hlen++; } cw_set_hdr_hlen(th, hlen); - return 1; + return rmac_len; } diff --git a/src/cw/dbg.c b/src/cw/dbg.c index e44b14e8..82dfba0b 100644 --- a/src/cw/dbg.c +++ b/src/cw/dbg.c @@ -679,7 +679,7 @@ void cw_dbg_dot11_elems(const uint8_t *src,int len) uint8_t id,l; int p; char str[1024]; - + for(p=0; pmtu; + mtu &= ~3; + + fragoffset = 0; + + + while (len + hlen > mtu){ + memcpy(buf+hlen,data+(fragoffset*8),mtu-hlen); + len -= (mtu - hlen); + + cw_set_hdr_flags(buf,CAPWAP_FLAG_HDR_F,1); + cw_set_dword(buf+4, conn->fragid<<16 | fragoffset<<3 ); + + cw_dbg_pkt(DBG_PKT_OUT,conn,buf,mtu,(struct sockaddr*)&conn->addr); + if (conn->write(conn,buf,mtu)<0) + return -1; + + fragoffset+=(mtu-hlen)/8; + cw_set_hdr_flags(buf,CAPWAP_FLAG_HDR_M,0); + cw_set_hdr_flags(buf,CAPWAP_FLAG_HDR_W,0); + hlen = 8; + cw_set_hdr_hlen(buf,hlen/4); + + } + + if (fragoffset) + cw_set_hdr_flags(buf,CAPWAP_FLAG_HDR_F | CAPWAP_FLAG_HDR_L,1); + else + cw_set_hdr_flags(buf,CAPWAP_FLAG_HDR_F,0); + + memcpy(buf+hlen,data+(fragoffset*8),mtu-hlen); + + cw_set_dword(buf+4, conn->fragid<<16 | fragoffset<<3 ); + + + cw_dbg_pkt(DBG_PKT_OUT,conn,buf,len+hlen,(struct sockaddr*)&conn->addr); + + return conn->write(conn,buf,len + hlen); + +} + int cw_send_msg( struct cw_Conn * conn, uint8_t *msg) +{ + uint8_t buf[MAX_MTU]; + int hlen,msglen; + + hlen = cw_init_capwap_packet(buf,1,0,NULL,NULL); + msglen = cw_get_msg_elems_len(msg) + 8; + return cw_send_capwap_packet(conn,buf,hlen,msg,msglen); +} + + + + + +int +cw_send_msg_old( struct cw_Conn * conn, uint8_t *msg) { uint8_t buf[MAX_MTU]; int fragoffset,hlen,mtu;