2016-11-25 56 views
1

假設我必須定義一組防火牆規則。序言中的結構

struct rules { 
int sourceL; 
int sourceU; 
int destL; 
int destU; 
char *proto; 
char *action; 
} r1,r2; 

r1.sourceL=10; 
r1.sourceU=20; 
r1.destL=30; 
r1.destU=40; 
r1.proto="tcp"; 
r1.action="accept"; 

r2.sourceL=10; 
r2.sourceU=10; 
r2.destL=30; 
r2.destU=30; 
r2.proto="tcp"; 
r2.action="deny"; 

其中sourceL和sourceU是源IP地址的上限和下限,對於目標IP地址也是一樣。例如[10,20,30,40,tcp,allow]意味着[10,20]是源的子網,[30,40]是目標的子網。

下列表達是否正確?

rule(
r1, 
sourceL(10), 
sourceU(20), 
destL(30), 
destU(40), 
proto(tcp), 
action(accept) 
). 

rule(
r2, 
sourceL(10), 
sourceU(10), 
destL(30), 
destU(30), 
proto(tcp), 
action(deny) 
). 

如果不是,我該如何在prolog中表示它? 規則是靜態的,在運行時不會改變。 基本上我想檢查定義的規則之間的衝突,例如,如果有兩條規則[10,20,30,40,tcp,allow]和[10,10,30,30,tcp,deny],這會導致衝突。 如何才能比較結構的不同變量,以便我可以檢測規則中的衝突?

+0

您需要提供更具體的用例。這真的取決於你需要怎麼處理這些規則:它們是靜態的,在編譯時是否已知?或者當程序運行時你會改變它們嗎?你打算如何使用這些規則中的數據?有太多不同的,有用的方式可以表示這樣的表格數據。 – 2016-11-25 07:20:55

+0

所有數據都是靜態的。它們在運行時不會被改變。基本上,源和目的地都有一個上限和下限(在上面的代碼中沒有提到,爲了簡單起見)表示源和目的地的範圍。我必須檢查防火牆規則中是否存在衝突。 所以如果有規則[10,20,30,40,tcp,allow],這意味着[10,20]是源的子網,[30,40]是目標的子網。那麼如果我有另一個[10,10,30,30,tcp,否認]這是一個衝突。 –

+0

你可以用你在評論中提供的細節來編輯你的問題嗎? – 2016-11-25 08:48:23

回答

0

我認爲你可以避免結構中的額外名稱換行。

我的意思是......你可以寫

rule(r1, sourceL(10), sourceU(20), destL(30), destU(40), proto(tcp), action(accept)). 

但我懷疑是足夠的,更簡單的

rule(r1, 10, 20, 30, 40, tcp, accept). 

進行檢查重疊的可能(和高度可改進)條款的範例(我semplified規則)在同一原可

detectConflicts(N1, N2) :- 
    rule(N1, SL1, SU1, DL1, DU1, PR, _), 
    rule(N2, SL2, SU2, DL2, DU2, PR, _), 
    N1 @< N2, 
    ( (SL1 =< SL2, SL2 =< SU1) 
    ; (SL2 =< SL1, SL1 =< SU2) 
    ; (DL1 =< DL2, DL2 =< DU1) 
    ; (DL2 =< DL1, DL1 =< DU2)). 

如果你的事實是

rule(r1, 10, 20, 30, 40, tcp, accept). 
rule(r2, 10, 10, 30, 30, tcp, deny). 

調用detectConflicts(N1, N2)回報四次(檢測主要矛盾)與N1統一到r1N2統一爲r2

四次因爲事實在源範圍內衝突2次,在目標範圍內衝突2次。

+0

這有助於,多謝max66 :) –