📄 spdb.c
字号:
static struct db_prop espnull_compress_pc[] = { { PROTO_IPSEC_ESP, AD(espnull_trans) }, { PROTO_IPCOMP, AD(ipcomp_trans) }, };#endif /* SUPPORT_ESP_NULL */static struct db_prop esp_compress_pc[] = { { PROTO_IPSEC_ESP, AD(espa_trans) }, { PROTO_IPCOMP, AD(ipcomp_trans) }, };static struct db_prop ah_esp_compress_pc[] = { { PROTO_IPSEC_AH, AD(ah_trans) }, { PROTO_IPSEC_ESP, AD(esp_trans) }, { PROTO_IPCOMP, AD(ipcomp_trans) }, };/* arrays of proposal alternatives (each element is a conjunction) */static struct db_prop_conj ah_props[] = { { AD(ah_pc) },#ifdef SUPPORT_ESP_NULL { AD(espnull_pc) }#endif };static struct db_prop_conj esp_props[] = { { AD(esp_pc) } };static struct db_prop_conj ah_esp_props[] = { { AD(ah_esp_pc) } };static struct db_prop_conj compress_props[] = { { AD(compress_pc) }, };static struct db_prop_conj ah_compress_props[] = { { AD(ah_compress_pc) },#ifdef SUPPORT_ESP_NULL { AD(espnull_compress_pc) }#endif };static struct db_prop_conj esp_compress_props[] = { { AD(esp_compress_pc) } };static struct db_prop_conj ah_esp_compress_props[] = { { AD(ah_esp_compress_pc) } };/* The IPsec sadb is subscripted by a bitset (subset of policy) * with members from { POLICY_ENCRYPT, POLICY_AUTHENTICATE, POLICY_COMPRESS } * shifted right by POLICY_IPSEC_SHIFT. */struct db_sa ipsec_sadb[1 << 3] = { { AD_NULL }, /* none */ { AD(esp_props) }, /* POLICY_ENCRYPT */ { AD(ah_props) }, /* POLICY_AUTHENTICATE */ { AD(ah_esp_props) }, /* POLICY_ENCRYPT+POLICY_AUTHENTICATE */ { AD(compress_props) }, /* POLICY_COMPRESS */ { AD(esp_compress_props) }, /* POLICY_ENCRYPT+POLICY_COMPRESS */ { AD(ah_compress_props) }, /* POLICY_AUTHENTICATE+POLICY_COMPRESS */ { AD(ah_esp_compress_props) }, /* POLICY_ENCRYPT+POLICY_AUTHENTICATE+POLICY_COMPRESS */ };#undef AD#undef AD_NULLvoidfree_sa_trans(struct db_trans *tr){ if(tr->attrs) { pfree(tr->attrs); }}voidfree_sa_prop(struct db_prop *dp){ int i; for(i=0; i<dp->trans_cnt; i++) { free_sa_trans(&dp->trans[i]); } if(dp->trans) { pfree(dp->trans); }}voidfree_sa_prop_conj(struct db_prop_conj *pc){ int i; for(i=0; i<pc->prop_cnt; i++) { free_sa_prop(&pc->props[i]); } if(pc->props) { pfree(pc->props); }}voidfree_sa(struct db_sa *f){ int i; for(i=0; i<f->prop_conj_cnt; i++) { free_sa_prop_conj(&f->prop_conjs[i]); } if(f->prop_conjs) { pfree(f->prop_conjs); } if(f) { pfree(f); }}void clone_trans(struct db_trans *tr){ tr->attrs = clone_bytes(tr->attrs , tr->attr_cnt*sizeof(tr->attrs[0]) , "sa copy attrs array");}void clone_prop(struct db_prop *p, int extra){ int i; p->trans = clone_bytes(p->trans , (p->trans_cnt+extra)*sizeof(p->trans[0]) , "sa copy trans array"); for(i=0; i<p->trans_cnt; i++) { clone_trans(&p->trans[i]); }}void clone_propconj(struct db_prop_conj *pc, int extra){ int i; pc->props = clone_bytes(pc->props , (pc->prop_cnt+extra)*sizeof(pc->props[0]) , "sa copy prop array"); for(i=0; i<pc->prop_cnt; i++) { clone_prop(&pc->props[i], 0); }}struct db_sa *sa_copy_sa(struct db_sa *sa, int extra){ int i; struct db_sa *nsa; nsa = clone_thing(*sa, "sa copy prop_conj"); nsa->prop_conjs = clone_bytes(nsa->prop_conjs , (nsa->prop_conj_cnt+extra)*sizeof(nsa->prop_conjs[0]) , "sa copy prop conj array"); for(i=0; i<nsa->prop_conj_cnt; i++) { clone_propconj(&nsa->prop_conjs[i], 0); } return nsa;}/* * clone the sa, but keep only the first proposal */struct db_sa *sa_copy_sa_first(struct db_sa *sa){ struct db_sa *nsa; struct db_prop_conj *pc; struct db_prop *p; nsa = clone_thing(*sa, "sa copy prop_conj"); if(nsa->prop_conj_cnt == 0) { return nsa; } nsa->prop_conj_cnt = 1; nsa->prop_conjs = clone_bytes(nsa->prop_conjs , sizeof(nsa->prop_conjs[0]) , "sa copy 1 prop conj array"); pc = &nsa->prop_conjs[0]; if(pc->prop_cnt == 0) { return nsa; } pc->prop_cnt = 1; pc->props = clone_bytes(pc->props , sizeof(pc->props[0]) , "sa copy 1 prop array"); p = &pc->props[0]; if(p->trans_cnt == 0) { return nsa; } p->trans_cnt = 1; p->trans = clone_bytes(p->trans , sizeof(p->trans[0]) , "sa copy 1 trans array"); clone_trans(&p->trans[0]); return nsa;}/* * this routine takes two proposals and conjoins them (or) * * */struct db_sa *sa_merge_proposals(struct db_sa *a, struct db_sa *b){ struct db_sa *n; int i,j,k; if(a == NULL || a->prop_conj_cnt == 0) { return sa_copy_sa(b, 0); } if(b == NULL || b->prop_conj_cnt == 0) { return sa_copy_sa(a, 0); } n = clone_thing(*a, "conjoin sa"); passert(a->prop_conj_cnt == b->prop_conj_cnt); passert(a->prop_conj_cnt == 1); n->prop_conjs = clone_bytes(n->prop_conjs , n->prop_conj_cnt*sizeof(n->prop_conjs[0]) , "sa copy prop conj array"); for(i=0; i<n->prop_conj_cnt; i++) { struct db_prop_conj *pca= &n->prop_conjs[i]; struct db_prop_conj *pcb= &b->prop_conjs[i]; passert(pca->prop_cnt == pcb->prop_cnt); passert(pca->prop_cnt == 1); pca->props = clone_bytes(pca->props , pca->prop_cnt*sizeof(pca->props[0]) , "sa copy prop array"); for(j=0; j<pca->prop_cnt; j++) { struct db_prop *pa = &pca->props[j]; struct db_prop *pb = &pcb->props[j]; struct db_trans *t; int t_cnt = (pa->trans_cnt+pb->trans_cnt); t = alloc_bytes(t_cnt*sizeof(pa->trans[0]) , "sa copy trans array"); memcpy(t, pa->trans, (pa->trans_cnt)*sizeof(pa->trans[0])); memcpy(t+(pa->trans_cnt) , pb->trans , (pb->trans_cnt)*sizeof(pa->trans[0])); pa->trans = t; pa->trans_cnt = t_cnt; for(k=0; k<pa->trans_cnt; k++) { clone_trans(&pa->trans[k]); } } } return n;}#ifdef PRINT_SA_DEBUGvoidprint_sa_attr(struct db_attr *at){ if(at->type == 0) { return; } printf(" type: %u val: %d\n", at->type, at->val);}voidprint_sa_trans(struct db_trans *tr){ int i; printf(" transform: %d cnt: %d\n", tr->transid, tr->attr_cnt); for(i=0; i<tr->attr_cnt; i++) { print_sa_attr(&tr->attrs[i]); }}voidprint_sa_prop(struct db_prop *dp){ int i; printf(" protoid: %d cnt: %d\n", dp->protoid, dp->trans_cnt); for(i=0; i<dp->trans_cnt; i++) { print_sa_trans(&dp->trans[i]); }}voidprint_sa_prop_conj(struct db_prop_conj *pc){ int i; printf(" conjunctions cnt: %d\n", pc->prop_cnt); for(i=0; i<pc->prop_cnt; i++) { print_sa_prop(&pc->props[i]); }}voidsa_print(struct db_sa *f){ int i; printf("sa disjunct cnt: %d\n", f->prop_conj_cnt); for(i=0; i<f->prop_conj_cnt; i++) { print_sa_prop_conj(&f->prop_conjs[i]); }}#endif/* * Local Variables: * c-style: pluto * c-basic-offset: 4 * End: */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -