|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Q1 = EX_(loc(1.2.3.4)) Q1 : ExtractField loc dip Q1 : ListBounded 10 loc dip Q2 = Q1 and loc(2.0.0.0,8) Q2 : list loc dip |
|
|
|
| Basic reachability | |
| Q1: | (src=a1 Ù dest=a2 Ù loc(a1)) ® AF( src=a1 Ù dest=a2 Ù loc(a2)) |
| Given a starting location and a flow, does packets of this flow eventually reach the destination? | |
| Reachability Soundness | |
| Q2: | [loc(a1) Ù src(a1) Ù dst(a2) Ù EF(loc(a2))] ® Pconnect(a1,a2) |
| If the src can reach the destination in configuration then it must be allowed in CRP. | |
| Reachability Completeness | |
| Q3: | Pconnect(a1,a2) ® [loc(a1) Ù src(a1) Ù dst(a2) ® EF(loc(a2))] |
| if CRP allows a1 to reach a2, then there must a path in the configuration that eventually allows a1 to reach a2. | |
| Discovering routing loops | |
| Q4: | loc(a1) Ù EX(EF(loc(a1)) |
| Is there a node that can reach a1 and for the same flow it is the next hop of a1? | |
| Shadow or Bogus routing entries | |
| Q5: | EX(true) ÙØEX_(true) Ù (loc(router1)Úloc(router2) ¼) |
| Given all routers, does any have a decision for traffic will never reach it from its previous hop? | |
| End-to-end integrity of single/nested or cascaded IPSec encrypted tunnel | |
| Q6: | (src=a1 Ùdest=a2 Ùloc(a1) Ù IPSec(encT)) ® AU((IPSec(encT)Úloc®G),loc(a2)) |
| If the traffic is encrypted in a tunnel from the src then it will appear decrypted only at the destination or at intermediate authorized gateways (G) that allow for cascaded tunnels. If G=false, then there are no intermediate gateways and the traffic must travel through a single tunnel. | |
| Comparing configuration for backdoors or broken flows after route changes | |
| Q7a: | Corg \triangleq [Ømultiroute Ùsrc=a1 Ùdest=a2 Ùloc(a1) ® AF(loc(a2) Ùsrc=a1 Ùdest=a2)] |
| Q7b: | Cnew \triangleq [multiroute Ùsrc=a1 Ùdest=a2 Ùloc(a1) ® AF(loc(a2) Ùsrc=a1 Ùdest=a2)] |
| Q7: | Backdoors: ØCorg ÙCnew, Broken flows: ØCnew ÙCorg |
| what is different in the new configuration as compared with the ordinary original one. Is there any backdoor? | |
| 2 Comparing configuration for backdoors or broken flows after route changes | |
| Q8a: | T \triangleq [src=a1 Ùdest=a2 Ùloc(a1) ® AF(loc(a2) Ùsrc=a1 Ùdest=a2)] |
| Q8: | Backdoors: T|multiroute ÙØT|Ømultiroute , Broken flows: ØT|multiroute ÙT|Ømultiroute |
| what is different in the new configuration as compared with the ordinary original one. Is there any backdoor? | |
| Compare configuration for Backdoor after route changes - WHY NOT THIS ONE | |
| Q8a: | Tn \triangleq [multiroute Ù(src=a1 Ùdest=a2 Ùloc(a1)) ® EF((loc(a2) Ùsrc=a1 Ùdest=a2)) Ù ØÚn-1i=0 Ti] |
| Sub-Optimal routing | |
| Q8: | EX_(loc(a1)) ÙAFn(loc(2),length(EX_(loc(a1)),loc(a2))-T) |
| Given two routers, is it possible to reach the second in less steps than that provided by routing tables? | |
| Spuriousness | |
| Q9: | (loc(a1) Ù EX(true)) ® EF(dest Û loc) |
| From any node, if there is a next-hope (not default route) then there must be packet that will eventually reaches the destination. | |
| Intermediate Sink nodes | |
| Q10: | EX_(true) ÙØEX(true) ÙØ(loc Û dest) |
| Sink Nodes: What are the nodes and the associated traffic that have a previous state but not next state? |
|
|
|
|
|
|
|
|
|
|
| Levels | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| Variables | 282 | 500 | 718 | 936 | 1154 | 1372 | 1590 | 1808 | 2026 |
| Copier | 327 | 654 | 981 | 1308 | 1635 | 1962 | 2289 | 2616 | 2943 |
| Push Copy | 0 | 327 | 981 | 1635 | 2289 | 2943 | 3597 | 4251 | 4905 |
| Pop Copy | 0 | 327 | 654 | 981 | 1308 | 1635 | 1962 | 2289 | 2616 |
void CTL::Init(bdd TransRel) {
T = TransRel;
Initialized = true;
NewVars = GetAllVarList(1) & GetVarList(fldLocationNew);
OldVars = GetAllVarList(0) & GetVarList(fldLocation);
EXtrue = EX(bddtrue);
EX_true = EX_(bddtrue);
};
bdd CTL::next(bdd f){
return bdd_replace(f,newOldPairs);
};
bdd CTL::prev(bdd f){
return bdd_replace(f,oldNewPairs);
};
bdd CTL::EX(bdd f){
if (!Initialized) throw CTLException();
return bdd_exist(next(f) & T,NewVars);
};
bdd CTL::AX(bdd f){
if (!Initialized) throw CTLException();
return bdd_forall(EXtrue & bdd_imp(T,next(f)) ,NewVars);
};
bdd CTL::EU(bdd f, bdd g){
if (!Initialized) throw CTLException();
bdd Y= bddfalse;
bdd oldY = bddtrue;
while (Y != oldY){
oldY = Y;
Y = g | (f & EX(Y));
}
return Y;
};
bdd CTL::EUn(bdd f, bdd g, int bound){
if (!Initialized) throw CTLException();
bdd Y= bddfalse;
bdd oldY = bddtrue;
int counting=0;
while ((Y != oldY) && (counting<bound)){
oldY = Y;
Y = g | (f & EX(Y));
}
return Y;
};
bdd CTL::AU(bdd f, bdd g){
if (!Initialized) throw CTLException();
bdd Y= bddfalse;
bdd oldY = bddtrue;
while (Y != oldY){
oldY = Y;
Y = g | (f & AX(Y));
}
return Y;
};
bdd CTL::AUn(bdd f, bdd g, int bound){
if (!Initialized) throw CTLException();
bdd Y= bddfalse;
bdd oldY = bddtrue;
int counting=0;
while ((Y != oldY) && (counting<bound)){
oldY = Y;
Y = g | (f & AX(Y));
}
return Y;
};
bdd CTL::EG(bdd f){
if (!Initialized) throw CTLException();
bdd Y = bddtrue;
bdd oldY = bddfalse;
while (Y != oldY){
oldY = Y;
Y = f & EX(Y);
};
return Y;
};
bdd CTL::AG(bdd f){
if (!Initialized) throw CTLException();
bdd Y = bddtrue;
bdd oldY = bddfalse;
while (Y != oldY){
oldY = Y;
Y = f & AX(Y);
};
return Y;
};
bdd CTL::EF(bdd f){
if (!Initialized) throw CTLException();
return EU(bddtrue, f);
};
bdd CTL::EFn(bdd f, int bound){
if (!Initialized) throw CTLException();
return EUn(bddtrue, f, bound);
};
bdd CTL::AF(bdd f){
if (!Initialized) throw CTLException();
return AU(bddtrue, f);
};
bdd CTL::AFn(bdd f, int bound){
if (!Initialized) throw CTLException();
return AUn(bddtrue, f, bound);
};
bdd CTL::EX_(bdd f){
return prev(bdd_exist(f & T, OldVars));
};
bdd CTL::AX_(bdd f){
return prev(bdd_forall( bdd_imp(T,f) ,OldVars)) & EX_(bddtrue);
};
bdd CTL::EU_(bdd f, bdd g){
if (!Initialized) throw CTLException();
bdd Y= bddfalse;
bdd oldY = bddtrue;
while (Y != oldY){
oldY = Y;
Y = g | (f & EX_(Y));
}
return Y;
};
bdd CTL::EUn_(bdd f, bdd g, int bound){
if (!Initialized) throw CTLException();
bdd Y= bddfalse;
bdd oldY = bddtrue;
int counting=0;
while ((Y != oldY) && (counting<bound)){
oldY = Y;
Y = g | (f & EX_(Y));
}
return Y;
};
bdd CTL::AU_(bdd f, bdd g){
if (!Initialized) throw CTLException();
bdd Y= bddfalse;
bdd oldY = bddtrue;
while (Y != oldY){
oldY = Y;
Y = g | (f & AX_(Y));
}
return Y;
};
bdd CTL::AUn_(bdd f, bdd g, int bound){
if (!Initialized) throw CTLException();
bdd Y= bddfalse;
bdd oldY = bddtrue;
int counting=0;
while ((Y != oldY) && (counting<bound)){
oldY = Y;
Y = g | (f & AX_(Y));
}
return Y;
};
bdd CTL::EG_(bdd f){
if (!Initialized) throw CTLException();
bdd Y = bddtrue;
bdd oldY = bddfalse;
while (Y != oldY){
oldY = Y;
Y = f & EX_(Y);
};
return Y;
};
bdd CTL::AG_(bdd f){
if (!Initialized) throw CTLException();
bdd Y = bddtrue;
bdd oldY = bddfalse;
while (Y != oldY){
oldY = Y;
Y = f & AX_(Y);
};
return Y;
};
bdd CTL::EF_(bdd f){
if (!Initialized) throw CTLException();
return EU_(bddtrue, f);
};
bdd CTL::EFn_(bdd f, int bound){
if (!Initialized) throw CTLException();
return EUn_(bddtrue, f, bound);
};
bdd CTL::AF_(bdd f){
if (!Initialized) throw CTLException();
return AU_(bddtrue, f);
};
int CTL::length(bdd s, bdd t){
if (!Initialized) throw CTLException();
int c=0;
bdd oldS=bddfalse;
while (((s&t)==bddfalse)){
if ((oldS==s) || (s==bddfalse))
return 1e7;
s=EX_(s);
c++;
}
return c;
};