• 沒有找到結果。

第三章 SIPv6 Translator系統實作原理

3.2 SIP-ALG實作方法二

為了提升 SIP-ALG 模組的運算速度,實作方法二是從輸入緩衝區讀入並解析 SIP 訊息結構,判斷是否該作轉換,再直接寫入輸出緩衝區。圖 3-3 詳列 SIP-ALG 方法二 實作的程式流程。

步驟○1 :程式從輸入緩衝區讀入 SIP 訊息起始行。

步驟○2:從 SIP 訊息起始行的前三個字元可以判斷是否為 Request Line。若前三個字元 並非“SIP”,則為 Request Line,並執行步驟○3。若前三個字元為 “SIP”,則為 Status Line,並執行步驟○4

步驟○3 :RequestLineHandler 函式找出 Request Line 中 Request-URI 的 IP 位址部分 進行轉換。最後,將轉換後的 Request Line 寫入輸出緩衝區。

步驟○4 :直接將 Status Line 寫入輸出緩衝區。

步驟○5 :從輸入緩衝區讀入下一行的 SIP 標頭欄位。

步驟○6:判斷此 SIP 標頭欄位名稱,若是 3.1 節步驟○4 所說明的特定標頭欄位,則執行 步驟○7 。若是其他的標頭名稱,則執行步驟○8 。若是 CRLF 則表示 SIP 標頭 已經結束,請跳到步驟○9

1. RequestLineHandler () 2. Write the modified Request Line into Output Buffer Start

1. Read Start Line from Input Buffer

Check SIP Header Field Name

Is Content-Type of

SIP Message Body SDP ? End

Yes

No

Is SIP Start Line Request Line ?

1. Write the Status Line into Output Buffer

1. Read SIP Header Field from Input Buffer

1. SIP Header Handler (e.g., ContactHandler ()) 2. Write the modified SIP Header Field into Output Buffer

1. Write the SIP Header Field into Output Buffer

1. Read SDP Field from Input Buffer

Check if read End of Input Buffer.

1. Write the SDP Field into Output Buffer

Check SDP Field Name

1. Write the SIP Body into Output Buffer

2. Return the modified Length to ALG Dispatcher

1. SDP Field Handler

(e.g., ConnectionFieldHandler ()) 2. Write the modified SDP Field into Output Buffer

Contact/From/To/

Via/Record-Route/Route Other

c /o

1. ContentLengthHandler () 2. Re-calculate Length field in IP header

(a) Process SIP Start Line

(b) Process SIP Message Header

(c) Process SIP Message Body

步驟○7 :針對此特定 SIP 標頭欄位(例如 Contact),呼叫對應的 SIP 標頭欄位處理函 式(例如 ContactHandler),對此 SIP 標頭欄位內的 IP 作轉換。最後,將 轉換後的 SIP 標頭欄位寫入輸出緩衝區。重複步驟○5

步驟○8 :直接將此 SIP 標頭欄位寫入輸出緩衝區。重複步驟○5

步驟○9:從 Content-Type 標頭欄位內容可以判斷 SIP 訊息主體是否為 SDP。若是 SDP,

則執行步驟○10至○15轉換 SDP 標頭中 c 與 o 欄位。若不是,則執行步驟○16結束 SIP-ALG 轉換。

步驟○10:從輸入緩衝區讀入下一行的 SDP 欄位。

步驟○11:依據 SIP 標頭中 Content-Lengh 欄位內的值,判斷是否已經從輸入緩衝區讀完 整個 SIP 訊息。若不是則跳到步驟○12進行轉換。若是,則執行步驟○15結束 SIP-ALG 之轉換。

步驟○12:判斷此 SDP 欄位名稱,若是 c 或 o 欄位,則執行步驟○13轉換欄位中 c 與 o 的 IP 位址。若是其他欄位則執行步驟○14直接複製。

步驟○13: 針對此 SDP 欄位(例如 c),呼叫對應的 SDP 欄位處理函式(例如

ConnectionFieldHandler)對此 SDP 欄位內的 IP 作轉換。最後,將轉換後

的 SDP 標頭欄位寫入輸出緩衝區。重複步驟○10

步驟○14:直接將此 SDP 欄位寫入輸出緩衝區。重複步驟○10

步驟○15:呼叫以 ContentLengthHandler 函式針對 SIP 標頭中 Content-Length 標頭欄 位內的 SIP 訊息主體長度值做修正。

步驟○16:直接將 SIP 訊息主體寫入輸出緩衝區。最後並回傳 SIP 訊息轉換後所改變的長 度。