FossilOrigin-Name: 3747732055809fd587f96cff65c389a0878a09a197947c1e68a76f605bdb44a0bsdmakefiles
parent
27869b8c11
commit
d6133e0434
@ -0,0 +1,60 @@ |
||||
#include "conn.h" |
||||
#include "cw.h" |
||||
#include "dbg.h" |
||||
|
||||
int conn_send_msg(struct conn * conn, uint8_t *rawmsg) |
||||
{ |
||||
uint8_t * ptr;
|
||||
int packetlen; |
||||
int fragoffset,hlen,mtu; |
||||
|
||||
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; */ |
||||
} |
||||
|
||||
|
||||
ptr = rawmsg; |
||||
|
||||
fragoffset = 0; |
||||
|
||||
hlen = cw_get_hdr_hlen(rawmsg)*4; |
||||
|
||||
mtu = conn->mtu; |
||||
|
||||
while (packetlen>mtu){ |
||||
cw_set_hdr_flags(rawmsg,CAPWAP_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,CAPWAP_FLAG_HDR_F | CAPWAP_FLAG_HDR_L,1); |
||||
else |
||||
cw_set_hdr_flags(rawmsg,CAPWAP_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); |
||||
} |
||||
|
@ -1,3 +0,0 @@ |
||||
|
||||
|
||||
|
@ -1,13 +1,13 @@ |
||||
#include "kvt.h" |
||||
#include "ktv.h" |
||||
#include "cw.h" |
||||
|
||||
#include "log.h" |
||||
#include "dbg.h" |
||||
|
||||
const char * cw_kvt_add(mavl_t kvtstore, const char *key, const struct cw_Type *type, |
||||
const char * cw_ktv_add(mavl_t kvtstore, const char *key, const struct cw_Type *type, |
||||
const uint8_t * data, int len) |
||||
{ |
||||
cw_KVT_t mdata, *mresult; |
||||
cw_KTV_t mdata, *mresult; |
||||
int exists; |
||||
|
||||
/* cw_dbg(DBG_ELEM,"KVStore (%p,%d) add elem (%s): %s", kvstore, kvstore->count,
|
@ -0,0 +1,6 @@ |
||||
#include "ktv.h" |
||||
|
||||
int cw_ktv_mavlcmp(const void *v1, const void *v2) |
||||
{ |
||||
return strcmp(((cw_KTV_t *) v1)->key, ((cw_KTV_t *) v2)->key); |
||||
} |
@ -0,0 +1,8 @@ |
||||
|
||||
#include "ktv.h" |
||||
|
||||
int cw_ktv_mavlcmp_type_by_name (const void *v1, const void *v2) |
||||
{ |
||||
return strcmp ( (*((struct cw_Type**) v1))->name,
|
||||
(*((struct cw_Type**) v2))->name); |
||||
} |
@ -0,0 +1,8 @@ |
||||
|
||||
#include "ktv.h" |
||||
|
||||
cw_kvt_read_file(mavl_t ktv, mavl_t types) |
||||
{ |
||||
|
||||
|
||||
} |
@ -0,0 +1,229 @@ |
||||
#include <ctype.h> |
||||
|
||||
#include "ktv.h" |
||||
|
||||
struct parser { |
||||
int line; |
||||
int pos; |
||||
int prevpos; |
||||
char error[256]; |
||||
}; |
||||
|
||||
static int get_char(FILE * f, struct parser *p) |
||||
{ |
||||
int c; |
||||
c = fgetc (f); |
||||
p->pos++; |
||||
if (c=='\n'){ |
||||
p->prevpos=p->pos; |
||||
p->line ++; |
||||
p->pos=0; |
||||
} |
||||
return c; |
||||
} |
||||
|
||||
static void unget_char(int c, FILE *f, struct parser *p){ |
||||
ungetc(c,f); |
||||
if (c=='\n'){ |
||||
p->line--; |
||||
p->pos=p->prevpos; |
||||
} |
||||
else |
||||
p->pos--; |
||||
} |
||||
|
||||
static int skip_chars (FILE *f, const char * chars, struct parser * p ) |
||||
{ |
||||
int c; |
||||
|
||||
while ( (c = get_char (f, p)) != EOF) { |
||||
if (strchr (chars, c)) |
||||
continue; |
||||
return c; |
||||
} |
||||
return c; |
||||
} |
||||
|
||||
static int skip_to_chars (FILE *f, const char *chars, struct parser * p) |
||||
{ |
||||
int c; |
||||
|
||||
while ( (c = get_char (f, p)) != EOF) { |
||||
if (strchr (chars, c)) |
||||
return c; |
||||
} |
||||
return c; |
||||
} |
||||
|
||||
|
||||
|
||||
static int read_key (FILE *f, char *key, int max_len, struct parser * p) |
||||
{ |
||||
int c,n; |
||||
|
||||
do { |
||||
c = skip_chars (f, " \t\n\a\v", p); |
||||
if (c == '#') { |
||||
c = skip_to_chars (f, "\n\a",p); |
||||
|
||||
} else { |
||||
break; |
||||
} |
||||
} while (c != EOF); |
||||
|
||||
|
||||
n=0; |
||||
while(c!=EOF && n<max_len){ |
||||
if (!isalnum(c) && !strchr("_/-()@#|{}[]",c)/*strchr(": \t\n\a",c)*/){ |
||||
unget_char(c,f,p); |
||||
break; |
||||
} |
||||
|
||||
key[n]=c; |
||||
c=get_char(f,p); |
||||
n++; |
||||
|
||||
} |
||||
key[n]=0; |
||||
return n; |
||||
} |
||||
|
||||
|
||||
static int skip_to_colon(FILE *f,struct parser * p) |
||||
{ |
||||
int c; |
||||
c = skip_chars (f, " \t", p); |
||||
if (c!=':'){ |
||||
if (c=='\n'){ |
||||
unget_char(c,f,p); |
||||
sprintf(p->error,"Error at line %d, pos %d: Unexpected EOL, collon expected.", p->line, p->pos); |
||||
return 0; |
||||
} |
||||
sprintf(p->error,"Error at line %d, pos %d: Collon expected.", p->line, p->pos); |
||||
return 0; |
||||
} |
||||
return 1; |
||||
} |
||||
|
||||
|
||||
static int read_type(FILE *f, char *type, int max_len, struct parser *p) |
||||
{ |
||||
int c,n; |
||||
|
||||
if (!skip_to_colon(f,p)) |
||||
return -1; |
||||
|
||||
c = skip_chars (f, " \t", p); |
||||
|
||||
if (c==':'){ |
||||
unget_char(c,f,p); |
||||
sprintf(type,""); |
||||
return 0; |
||||
} |
||||
|
||||
if (!isalpha(c)){ |
||||
if (c=='\n'){ |
||||
unget_char(c,f,p); |
||||
sprintf(p->error,"Error at line %d, pos %d: Unexpected EOL.", p->line, p->pos); |
||||
return -1; |
||||
} |
||||
|
||||
sprintf(p->error,"Error at line %d, pos %d: Letter expected.", p->line, p->pos); |
||||
return -1; |
||||
} |
||||
|
||||
n=0; |
||||
while(c!=EOF && n<max_len){ |
||||
if (!isalnum(c) && !strchr("_/-.()@#|{}[]",c)/*strchr(": \t\n\a",c)*/){ |
||||
unget_char(c,f,p); |
||||
break; |
||||
} |
||||
|
||||
type[n]=c; |
||||
c=get_char(f,p); |
||||
n++; |
||||
} |
||||
type[n]=0; |
||||
return n; |
||||
} |
||||
|
||||
static int read_val(FILE *f, char *val, int max_len, struct parser *p){ |
||||
int c,n,quote; |
||||
if (!skip_to_colon(f,p)) |
||||
return -1; |
||||
c = skip_chars (f, " \t", p); |
||||
if (c=='"'){ |
||||
quote=1; |
||||
c=get_char(f,p); |
||||
} |
||||
else{ |
||||
quote=0; |
||||
} |
||||
n=0; |
||||
while(c!=EOF && n<max_len){ |
||||
if (quote && c=='"'){ |
||||
break; |
||||
} |
||||
if (c=='\n'){ |
||||
break; |
||||
} |
||||
if (quote){ |
||||
if (c=='\\'){ |
||||
c = get_char(f,p); |
||||
switch(c){ |
||||
case 'n': |
||||
c='\n'; |
||||
break; |
||||
case '\\': |
||||
break; |
||||
case '"': |
||||
break; |
||||
default: |
||||
unget_char(c,f,p); |
||||
c='\\'; |
||||
} |
||||
} |
||||
} |
||||
val[n++]=c; |
||||
c=get_char(f,p); |
||||
} |
||||
|
||||
|
||||
if(!quote && n>0){ |
||||
while(n>0){ |
||||
if (isspace(val[n-1])) |
||||
n--; |
||||
else |
||||
break; |
||||
} |
||||
} |
||||
|
||||
val[n]=0; |
||||
|
||||
return n; |
||||
|
||||
} |
||||
|
||||
|
||||
|
||||
int cw_ktv_read_line (FILE *f, char * key, char * type, char *val) |
||||
{ |
||||
int n; |
||||
|
||||
struct parser p; |
||||
p.line=1; |
||||
p.pos=0; |
||||
p.prevpos=0; |
||||
|
||||
n = read_key (f,key,CW_KTV_MAX_KEY_LEN,&p); |
||||
n = read_type (f,type,CW_KTV_MAX_KEY_LEN,&p); |
||||
if (n==-1){ |
||||
return -1; |
||||
} |
||||
|
||||
n = read_val (f,val,CW_KTV_MAX_KEY_LEN,&p); |
||||
if (n==-1){ |
||||
return -1; |
||||
} |
||||
return 0; |
||||
} |
@ -1,6 +0,0 @@ |
||||
#include "kvt.h" |
||||
|
||||
int cw_kvt_mavlcmp(const void *v1, const void *v2) |
||||
{ |
||||
return strcmp(((cw_KVT_t *) v1)->key, ((cw_KVT_t *) v2)->key); |
||||
} |