發表文章

目前顯示的是 2009的文章

Warning: left-hand operand of comma expression has no effect!

首先來看看下面這隻 Macro: # define UTL_LIST_ALL_ELEMENTS_RO(list, node, data) \ ______ ( (node) = UTL_LIST_HEAD(list) ) ; \ ______ (node) != NULL && ( (data) = UTL_LIST_DATA(node) , 1 ) ; \ ______ ( (node) = UTL_LIST_NEXTNODE(node) ) 很簡單的 Macro,作用是 Link List 的 Traversal,給 For-Loop 使用。 那為甚麼要特別拿出來討論?? 重點在 ( (data) = UTL_LIST_DATA(node) , 1 ) 中的 ", 1" ,那到底有甚麼作用呢? 寫一個小程式來看看: #include #include int main() { @@ int a = 0, i = 10, j = 20; @@ printf( "a = %d\n", ( a = ( i, j ) ) ); @@ return 0; } 結果印出來的答案是 a = 20 事實上,在編譯的時候,如果是 gcc -Wall test.c 的話,我們會發現下面的警告: test.c: In function ‘main’: test.c:7: warning: left-hand operand of comma expression has no effect 也就是說,在 C 的語法裡面 (a,b,c,...,n) 的語法裡面,事實上就等於是 n ,逗號左邊的全部數值是沒有作用的!! 既然沒有作用,那為甚麼 Macro 會出現這樣的寫法?? 我們在看看下面的另一個小程式 test2.c #include #include int main() { @@ int a = 0, i = 10, j = 20; @@ printf( "a = %d\n", ( a = ( i=i+50, j ) ) ); @@ printf( "i = %d\n", i ); @@ return 0; } 最後會印出 a = 20 i = 60 所以, 即使在 ( a =

HOWTO: Linux Netfilter Hook Function Developement

圖片
我是從上研究所以後才開始接觸 Linux 的,那時候為了 強迫 自己盡速上手,把我家一台古董級電腦搬出來,按著「施銘威研究室」的 Linux 系列進行一個口令一個動作的學習(回首那段日子 ... 真是 ...)。而我第一個學的操作就是 iptables 的操作,理由很簡單,因為那時候我待在「Distributed Computing and Network Security Laboratory」,想說不會操作防火牆不是太丟臉了嗎?從此就開始接觸到 Linux Kernel 裡面很重要的一個封包處理機制 Netfilter。 Netfilter 是 Linux Kernel 2.4 和 2.6 的網路封包處理框架,下面是官網的介紹: netfilter is a set of hooks inside the Linux kernel that allows kernel modules to register callback functions with the network stack. A registered callback function is then called back for every packet that traverses the respective hook within the network stack. (from http://www.netfilter.org/ ) 簡單來說,我們可以把 Netfilter 的機制想成下面的圖: 圖中的五個橢圓形指的就是五個 Hook Points。而旁邊一串紅色的小圈圈代表的是在該 Kook Point 上的一串規則。凡是有網路封包經過一 Hook Point 時就會進入該 Hook Point 所掛載的所有規則。 我們利用 linux kernel 2.6.28.7 來搜尋一下 NF_HOOK 這個關鍵字: ip_forward.c: ip_forward, NF_INET_FORWARD ip_input.c: ip_local_deliver, NF_INET_LOCAL_IN ip_input.c: ip_rcv, NF_INET_PRE_ROUTING ip_output.c: ip_mc_output, NF_INET_POST_ROUTING ip_outpu

S.O.P. Standard Operating Procedure 標準作業程序?

從題目上的問號就知道本文作者對這東西到持著懷疑的態度 ... 先來看看兩則新聞(理論上引用是應該附上連結的,但因為時間久了就會找不到,所以大意描述之) 1. 「院長,快來救命!」 劉揆眼眶紅 對於夜宿高雄,新聞局長蘇俊賓解釋「這是前一晚就決定的。」他說「 災情超乎預期,不能沿用既定的SOP(標準作業程序) 」;據悉,九二一地震發生時,劉兆玄任副閣揆,第一時間也曾夜宿南投災區。 2. 英勇對抗搶匪是錯的? 銀行員遭開除! 27日當天,一名身形消瘦、頭戴便帽、穿黑色衣服和戴太陽眼鏡的29歲遊民,把一個黑色背包推過櫃台,要吉姆裝錢。當時,吉姆想確定這遊民是否真的持有武器,便衝向這名遊民,遊民隨即從大門逃跑,吉姆則緊追在後,並在路人的協助下,制伏這名搶匪,等待警察前來處理。 但銀行給行員的訓練和要求,是要遵行搶匪的要求、避免對抗,讓搶匪能儘快離開銀行,勿使危險情勢升高,因為這些錢已有聯邦保險。 警方和聯邦調查局也不鼓勵這種與搶匪對抗的行為,西雅圖警察巡官惠特康指出,當面對暴力犯罪時,最好要順從,貿然採取行動或予以對抗,可能導致本人或旁觀者受傷,於是吉姆就在30日被開除了。 好了,請問觀眾, 「標準作業程序」到底該不該讓使用者因時制宜的調整? 如果能調整,調整出了問題是誰的責任? 如果不能調整,既有的程序無法應付眼前的情況時,該怎麼辦呢?? 東方人和西方人對事情的看法有很本質上的差異(當然隨著西方教育的影響,越來越趨於一致)。東方人很少談到實用的方法論,往往都是講求原則性的東西,實務的部分看個人的領會、造化。舉例來說,孫子兵法一書裡面沒有任何實質的戰術,而是粗略的原則;孔子的教育方針也僅是概念性的,對不同學生的相同問題可以給出不一樣的答案。而西方呢?講求明確,一步一字都要詳細記錄,所以很強調「量化」的概念,因為唯有數字化了以後才可以進行統一的評量,但也因為數字化以後,缺乏的彈性而變的死板。用一句話來說, 東方是類比的思考方式、西方則是數位的想法。 這也造成東西方管理模式嚴重的差異。 那有什麼好處跟壞處呢? 以武俠小說作比喻,東方人的練功方式會按著個人的資質而有很大的高低落差;西方人的練功方式則比較容易產生出一批整齊畫一的好手,但很難產出一流的高手。 為什麼提到這個?回到最初的問題,S.O.P.到底能不能隨著使用者自己調整呢?請注意,我說的是使用者,而不是制訂 S.O.P. 的

仙劍賦

實在是太佩服某些遊戲玩家了,玩遊戲可以玩到寫出古文來... 坦白說,我不能評價出這篇賦的好壞,但單單能寫出來就很令人驚豔了。 Youtube 上還有歌唱 MV 版唷。 仙劍賦: 白蓮殞 桃落澗 仙靈洞天 (仙劍奇俠傳一: 趙靈兒 ) 蒼穹明月 茫茫無言 (仙劍奇俠傳一: 林月如 ) 笛音魂繞奴顏 (仙劍奇俠傳一: 阿奴 ) 媚影閃現水漣 (仙劍奇俠傳二: 蘇媚 ) 仙霞之綺 秀雲滿巔 (仙劍奇俠傳二: 沈欺霜 ) 還魂幽草誰憐 (仙劍奇俠傳三: 唐雪見 ) 劍魂等待千年 (仙劍奇俠傳三: 龍葵 ) 萱葉紅 幾許寂寞無人擷 (仙劍奇俠傳三: 紫萱 ) 飄絮染野 花蕊風中潛 (仙劍奇俠傳三外傳 問情篇: 王蓬絮 ) 室韋遠 麓疆鄉遣 (仙劍奇俠傳三外傳 問情篇: 溫慧 ) 琉璃碎 箜篌斷弦 (仙劍奇俠傳四: 柳夢璃 ) 硃砂點眉 菱花黯退嬌顏 (仙劍奇俠傳四: 韓菱紗 ) 輕嘆宿緣斷紅顏 青衣袂 形如飛 逍遙難解 (仙劍奇俠傳一: 李逍遙 ) 佩環獨缺 鯉魚錯願 (仙劍奇俠傳二: 王小虎 ) 渝州竹林語綿 (仙劍奇俠傳三: 景天 ) 蒼生連理堪選 (仙劍奇俠傳三: 徐長卿 ) 南宮之外 煌如火琰 (仙劍奇俠傳三外傳 問情篇: 南宮煌 ) 孤星流 白髮瀑懸 (仙劍奇俠傳三外傳 問情篇: 星璇 ) 望舒寒 墓邊誰言 (仙劍奇俠傳四: 雲天河 ) 紫晶湮 韶華轉瞬已百年 (仙劍奇俠傳四: 慕容紫英 ) 羲和曾見 鳳凰醉蔭間 (仙劍奇俠傳四: 玄霄 ) 仗劍行 憔悴紅顏 江湖夢 情仇難滅 君子如玉 劍勢揮灑如虹 空現悲 酌去思淚 尋仙音 償還前緣 終離別 怎料緣滅 盛世紛繁 曲終人散成幻 卻道是 此生不悔

symbol.sh ~~查詢 Symbol 的好用工具

先來看一下何謂 Symbol Table (以下來源: Wiki) In computer science, a symbol table is a data structure used by a language translator such as a compiler or interpreter , where each identifier in a program's source code is associated with information relating to its declaration or appearance in the source , such as its type, scope level and sometimes its location. 在 Linux 下,我們可以使用 nm 這個指令來列出 Object 裡面 Symbol Table 的內容。 下面這隻 Script 可以快速查出特定的 Symbol 出現在哪一個 Object 裡面 感謝原作者 parrot 大方提供。 #!/bin/bash if [ $# == 0 ]; then @@@@ echo "Usage: $0 " @@@@ echo " @@@@@ : $0 " @@@@ echo "" @@@@ exit fi dir=. if [ $# == 2 ]; then @@@@ dir=$2 fi echo "--------------------------------------------------------------------------------" echo "Processing ..." echo "" list=`find $dir -regex ".*\. o " -or -regex ".*\. a " -or -regex ".*\. sa " -or -regex ".*\. so " -or -regex ".*\. ko "` for x in $list do @@

Openswan Porting to Pronghorn-Metro 實務經驗分享 06

最後一回精彩大結局~ # ipsec --help 理論上來說,這個指令會 show 出所有支援的指令,但...沒 show 出來...。看了一下,show 指令的方式也夠奇特,居然事先用 ls 讀 /usr/local/libexec/ipsec/ 下面的檔案,然後在用 egrep 進行過濾的動作... 好傢伙。因為我懶的去安裝 egrep 了,就把 ipsec 這隻 script 稍微改寫一下,達到相同的目的(不過好像沒完全濾完,管他的,反正我也只用那幾個指令) 正當我把一切都準備好了以後,鼓起勇氣執行: # ipsec setup start 產生了下面的 Log: ipsec_setup: Starting Openswan IPsec U2.4.5/K2.6.17-uc1-adi3... ipsec_setup: modprobe: module ah4 not found. ipsec_setup: modprobe: failed to load module ah4 ipsec_setup: modprobe: module esp4 not found. ipsec_setup: modprobe: failed to load module esp4 ipsec_setup: modprobe: module ipcomp not found. ipsec_setup: modprobe: failed to load module ipcomp ipsec_setup: modprobe: module xfrm4_tunnel not found. ipsec_setup: modprobe: failed to load module xfrm4_tunnel ipsec_setup: modprobe: module xfrm_user not found. ipsec_setup: modprobe: failed to load module xfrm_user ipsec_setup: modprobe: module hw_random not found. ipsec_setup: modprobe: failed to load module hw_random ipsec_setup: modprobe: module pa

Openswan Porting to Pronghorn-Metro 實務經驗分享 05

在上一次的最後,我們總算將這隻難纏的天鵝給移植到版子上了,接下來,會一帆風順嗎??(我好希望這答案是肯定句唷 ... ) 首先,來參考一下官方網頁的設定步驟: http://wiki.openswan.org/index.php/Openswan/Configure 首先,來看看自己身上的金鑰 # ipsec showhostkey --left 結果,當然找不到金鑰囉,哼,那就自己產生吧。 # ipsec newhostkey --output /etc/ipsec.secrets 恩,好像有點久ㄟ,畢竟只是版子,運算能力差了點,RSA 又是很需要運算的動作,先去作其他事吧...。天真的我真的去處理其他工作上的事了。幾個小時以後... 「甚麼,還沒算完,到底怎麼了??」嵌入式系統在爛也不是這樣的吧!!於是一氣之下,去看看到底他程式是怎麼寫得... openswan/programs/rsasigkey/rsasigkey.c 33 #ifndef DEVICE 34 #define DEVICE " /dev/random " 35 #endif 恩... /dev/random ... 嗎... 思緒飄回過去。那年,我還是甚麼都不懂得研究生,一個叫做「小龍」的學長正在研究室完版子,那時候他正在 porting 一個叫做 dropbear 的 SSH Server (附帶一題,這是嵌入式系統常見的 SSH Server,跟常見的 Openssh 比起來輕巧多了) 小龍 :阿,總算搞定了 我 :不過就是 porting 一個伺服器上去啊,怎麼能讓學長這麼鬆了一口氣(我真是不知天高地厚) 小龍 :是早就上版子了啦,但一直不知道為甚麼會卡住,剛剛才解決。 我 :卡住? 小龍 :對啊,就是程式執行就會停在那邊。找到理由就很簡單了。聽好了, Linux 底下是透過 /dev/random 去取得 random number,而 /dev/random 會收集系統的 interrupt 來作為產生亂數的 seed。你想想看之前你用 putty key gen 來產生憑證的時候,他是不是有要你敲鍵盤嗎?那也是同樣的意思。而在 Linux 底下,如果他覺得他無法產生「 數學上夠完美 」的亂數,整個系統就會停在那裡,等到收集到足夠的熵。 我 :如果是這樣的話

Openswan Porting to Pronghorn-Metro 實務經驗分享 04

上次處理到 Openswan 的編譯,最後停在了 endian 的問題,這次能不能順利解決呢? 在使用 GCC 的編譯上,預設為 little-endian,如果要特別編譯成 big-endian 的話,要加上一個 -mbig-endian 的參數,所以,我們再來一遍。 編譯 GMP ./configure --host=arm-linux CC="arm-linux-gcc" CXX="ucfront-g++ arm-linux-uclibc-g++" --prefix=/usr/local/arm-linux CFLAGS= -mbig-endian make make install 然後,在 openswan/Makefile.inc 加上 CFLAGS += -mbig-endian 編譯 Openswan make KERNELSRC=../../ADI/linux-2.6.x ARCH=arm OSDEP=linux USE_NETKEY=yes CC="arm-linux-gcc -L../ADI/romfs/lib" LD=arm-linux-ld RANLIB=arm-linux-ranlib AR=arm-linux-ar AS=arm-linux-as STRIP=arm-linux-strip programs make DESTDIR=../../ADI/romfs install 過了嗎??沒有!!怎麼可能... 我發現在 make 的時候,回報的信息告訴我說要 編譯 little-endian 的執行檔卻使用 big-endian 的 library 。How could it be?? 我不是連 CFLAGS 都設定好了嗎? 正當一籌莫展的時候,幸好辦公室的同事(Hidding)即時出手相救。他很有耐心的去觀看編譯的過程,發現 在編譯那幾隻程式的時候根本沒有吃到 -mbig-endian! 於是我在打開 Makefile (openswan/program/pluto/Makefile) 來看 ... 天啊... 在編譯的時候根本沒有使用 CFLAGS 嘛(你前面的 CFLAGS 是寫好玩得就是了) 罪魁禍首是下面幾個~ alg_info_test: $(BINNAMEPL

Openswan Porting to Pronghorn-Metro 實務經驗分享 03

圖片
很好,下一步是編譯 「開放天鵝」OpenSwan 了~ 應該不會有甚麼難度吧(假設語氣)。首先,來乖乖看看安裝文件怎麼說: To use the native (aka, Netkey) stack: 0) Please use at least version kernel version 2.6.6, as prior versions of the kernel have serious bugs in the IPsec stack. 1) From the openswan source directory: make programs 2) As root, install the userland tools: make install 哼,簡單來說,就是 make programs, make install 嘛 (再提醒一下,因為我們沒有使用 KLIPS ... 所以不要去理會 make module 的部份了),編譯的過程並不十分順利,有少部份要進行修改,但都是簡單的修改,所以把修改的地方列在下面而不列出錯誤信息: openswan/programs/pluto/server.c:780 LIST_INSERT_HEAD(&interface_dev, id, id_entry) => LIST_INSERT_HEAD(&interface_dev, id, id_entry) ; openswan/programs/pluto/foodgroups.c: 22 #include => #include < linux/ limits.h> 順利的 make 過了,之後就要 install 囉。因為要特別指定安裝路徑,所以指令如下: make DESTDIR=../ADI/romfs install 簡單啊~之後在製作新的 ramdisk,下 make image 的指令... 結果... 它跟我抱怨 romfs 太大?? 奇怪了,這隻開放天鵝是有多肥啊,我看看 ... 天啊... 它把 man/docs 全都放進去了 ... 難怪啊,好吧,那我再把那些 manual, documents 砍掉總可以了吧~ 成功!很高興的開機進去執行 rsasigkey 看看 ... canno

Openswan Porting to Pronghorn-Metro 實務經驗分享 02

首先,先編出一個可以動的系統吧~ 這部份倒是很簡單,按照下面的步驟即可: 1. tar zxvf ADILinuxDistribution-adi3.tgz 2. Get the cross compiler tool chain (http://www.snapgear.org/snapgear/downloads.html) 3. Intel Access Library Integration 4. make menuconfig ... 4.1 Vendor/Product Selection -> ADI, PronghornMetro ... 4.2 Kernel/Library/Defaults Selection -> linux-2.6.x, uClibc 5. make 6. 將編出來的 image 和 ramdisk 放到版子上 ( 於 boot loader 執行下面的 command ) ... 6.1 ip_address -l 192.168.8.234 -h 192.168.8.239 ... 6.2 load -r -v -b 0x01600000 zImage ... 6.3 load -r -v -b 0x00800000 ramdisk.gz ... 6.4 go -n 0x01600000 這樣就完成了~ 那接下來,要開始進入重頭戲了(或是說,我的一連串搞笑演出),也就是將 OpenSwan 放到版子上。 首先,理所當然的, IPSec 會動到 Linux 本身的 IP Stack,這也意味著,一定有不少的 Kernel Option 會需要進行選擇。在我 印象 中( 這兩個字真是害慘我了,以後記得要多看看官方文件才是 ),kernel 2.4 並不支援 IPsec ,或是說要加上一些 Patch 才能支援,kernel 2.6 則是天生就支援 IPSec,這也是為甚麼前面我編得時候, kernel 選擇 2.6 的理由。所以,我就很勇敢的進入 Kernel 的 menuconfig 畫面,開始選擇我所需要的模組。 一進去就直接來到 Networking --> Networking options 底下,很快的就找到了幾個 Option: IPsec user configuration interfa

Openswan Porting to Pronghorn-Metro 實務經驗分享 01

緣由: 不知道為甚麼,Femtocell 突然之間變成一個很 Hot 的題目 (我到現在還是搞不懂為甚麼有人想把基地台放在室內 ...)。Femtocell 的概念很簡單,將為型基地台放入用戶的家裡面,透過用戶家裡現有的寬頻網路,將資料(包含語音,反正現在都講 IP 網路了嘛)傳到後端的 Access Network。整個架構看起來會像下面的樣子: User --- Femto AP --- Broadband Provider --- Access Service Provider --- Connectivity Service Provider 然而,對電信業者來說,資料經過 Broadband Provider 才回到自己的手上當然很不放心(擔心被搞鬼就是了),所以他們採用了現成的解決方案,IPSec Tunnel。由 Femto AP 建一條 IPSec Tunnel 到 Access Service Provider 來保護資料的傳送。 這就是所有故事的由來囉~ 系統環境: Platform: ADI Pronghorn-Metro x 2 OS: uclinux (2.6.17-uc1-adi3) Src: ADILinuxDistribution-adi3.tgz Openswan: Version 2.4.5 目標: 讓 IPSec 在 Pronghorn-Metro 執行起來,並且運作 OK。 限制: ADILinuxDistribution-adi3.tgz 是一套很棒的架構,坦白說,要把 OpenSwan 編起來很容易,只要 Follow 下面的步驟: 1. make menuconfig; 2. 選取 Customize Kernel Settings & Customize Vendor/User Settings 3. 選取適當的 Kernel Module 4. 選取 OpenSwan 的套件 5. make 簡單吧~但這次我們不這樣處理,理由很簡單,因為 Access Provider 那一端雖然是 ADI Pronghorn-Metro 的版子,但是,FAP 那一端卻是我們自製的 Picochip HDP203,沒有這一套架構。所以,為了將來在一次的 Porting,我們還是按照正規的作法來處理,至於其他的部份,我們依舊是

/dev/random v.s. /dev/urandom

之前在 Openswan Porting 的時候,遇到一個問題: 為甚麼無法順利產生 RSA 所需要的 Key ? 整個程式看起來毫無反應?? 其實理由很簡單,因為在產生金鑰的過程,Linux 是透過 /dev/random 去產生所需要的亂數。但是當系統覺得「無法產生夠亂的數」時,應用程式就會被 /dev/random 鎖在那個地方,直到能提供亂數為止。 下面是關於 /dev/random 的介紹: In Unix-like operating systems, /dev/random is a special file that serves as a true random number generator or as a pseudorandom number generator. Random number generator from kernel space was first time implemented for Linux[1] in 1994 by Theodore Ts'o. The implementation uses secure hashes rather than ciphers. The implementation was also designed with the assumption that any given hash or cipher might eventually be found to be weak, and so the design is durable in the face of any such weaknesses. Fast recovery from pool compromise is not considered a requirement , because the requirements for pool compromise are sufficient for much easier and more direct attacks on unrelated parts of the operating system. In this implementation, the generator keeps an estimate of the number of bi

Linux Library Inroduction

節錄自 http://www.linux.org/docs/ldp/howto/Program-Library-HOWTO/ What is the static library ? Static libraries are simply a collection of ordinary object files; conventionally, static libraries end with the .a suffix. This collection is created using the ar (archiver) program, like: ar rcs my_library.a file1.o file2.o In theory, code in static ELF libraries that is linked into an executable should run slightly faster (by 1-5%) than a shared library or a dynamically loaded library, but in practice this rarely seems to be the case due to other confounding factors. Once you've created a static library, you'll want to use it. You can use a static library by invoking it as part of the compilation and linking process when creating a program executable. If you're using gcc(1) to generate your executable, you can use the -l option to specify the library. Be careful about the order of the parameters when using gcc; the -l option is a linker option, and thus needs to be placed AFT

ies4linux in Ubuntu

ies4linux 是一套在 Linux 底下執行 IE 的軟體(沒辦法,有些網頁就是要用 IE 來開 ... ),概念就是透過 wine 來進行模擬。在 Ubuntu Linux 底下(不確定其他的 Distribution 會不會碰到一樣的問題)安裝時必須要作相關的調整(中文語系的關係),紀錄在下面: ies4linux-latest/lib/messages.txt : tw . zhtw TW --> zh tw zhtw TW ies4linux-latest/lib/functions.sh : pid=(wget ...) --> pid=( LANG=C wget ...) 下一個遇到的問題是字型的問題。本來我以為既然 ies4linux 是透過 wine 來模擬的,那應該會跟 wine 吃同樣的設定檔,但我發現我錯了~ ies4linux 有自己的設定檔,紀錄在下面: ~/.ies4linux/ie6/drive_c/windows/win.ini 要改變字型大小,請加上: [Desktop] menufontsize=14 messagefontsize=14 statusfontsize=14 IconTitleSize=14 要改變字型,請放到: ~/.ies4linux/ie6/drive_c/windows/fonts 要停用字體反鋸齒,請: ~/.ies4linux/ie6/user.reg [ SoftwareWineX11 Driver ] "ClientSideAntiAliasWithRender"="N"

論文笑話~

幾年前看過的笑話,來源已不可考,在這邊記錄一下。 ============================================ 1.剛進入碩士班時,會期許自己要寫出曠世鉅作 2.在翻閱文獻的過程中,發現這些大師的文獻用字艱澀,不好消化 3.好不容易建立模型,結果發現將輸入因子套用之後,產生的結果很難看 4.不斷調整模型也無效 5.開始培養第二專長,如煮咖啡、養魚......來逃避現實 6.畢業在即,翻以前的碩士論文開始一大抄 7.數據隨便亂帶得到還ok的結果 8.口試當天被問得冷汗直流,如果教授本來就不會留人還沒關係,如果會就......

ZIM ~ A good desktop wiki

一直在找一個個人使用的 Wiki 系統,對這個系統的要求如下: 簡單易用,不要太多花俏的功能。 能夠貼圖。 免費,最好是自由軟體。 當初就是因為這樣的東西很不好找,所以才會開始使用 Blog,但現在找到一個不錯的軟體了。 ZIM: http://zim-wiki.org/ Wiin32 的平台: http://code.google.com/p/zimdesktopwiki-windows/

skb_copy v.s. skb_clone

skb_clone 和 skb_copy 有甚麼不一樣? 從字面上來看,差不多啊,但實際上就是有差,先來看看 Man 吧~ struct sk_buff * skb_clone (struct sk_buff * skb, int gfp_mask); Duplicate an &sk_buff. The new one is not owned by a socket. Both copies share the same packet data but not structure. The new buffer has a reference count of 1. If the allocation fails the function returns NULL otherwise the new buffer is returned. If this function is called from an interrupt gfp_mask must be GFP_ATOMIC. struct sk_buff * skb_copy (const struct sk_buff * skb, int gfp_mask); Make a copy of both an &sk_buff and its data. This is used when the caller wishes to modify the data and needs a private copy of the data to alter. Returns NULL on failure or the pointer to the buffer on success. The returned buffer has a reference count of 1. As by-product this function converts non-linear &sk_buff to linear one, so that &sk_buff becomes completely private and caller is allowed to modify all the data of returned buffer. This means that t

Netfilter 的 Hook 方式初探

圖片
Netfilier,Linux 核心裡面的封包處理子系統。這篇文章唯一時心血來潮,看了一小段 code 以後所作的整理。 kernel: 2.6.23.14 下圖是 Linux 核心的網路封包處理流程: 讓我們到 ip_rcv 這隻函式來看一下,ip_rcv 是處理 IP 封包的主要進入函式。 net/ipv4/ip_input.c: /* * Main IP Receive routine. */ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev) { .... struct iphdr *iph; .... u32 len; .... /* When the interface is in promisc. mode, drop all the crap .... * that it receives, do not try to analyse it. .... */ .... if (skb->pkt_type == PACKET_OTHERHOST) .... .... goto drop; .... IP_INC_STATS_BH(IPSTATS_MIB_INRECEIVES); .... if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) { .... .... IP_INC_STATS_BH(IPSTATS_MIB_INDISCARDS); .... .... goto out; .... } .... if (!pskb_may_pull(skb, sizeof(struct iphdr))) .... .... goto inhdr_error; .... iph = ip_hdr(skb); .... /* .... * RFC1122: 3.1.2.2 MUST silently discard

if ( x == 0 ) 和 if ( 0 == x ) 的差異

今天找到一本很不錯的書 C Programming FAQs: Frequently Asked Questions 看到其中一個問題,覺得很有意思,就把它記錄下來。 為什麼有人要寫 if ( 0 == x ) 而不是 if ( x == 0 )? 就程式語法上來看,這兩個是完全等義的, 而從一般人解讀的理解來說,if ( x == 0 ) 又比較好理解, 那位甚麼會有人故意寫成 if ( 0 == x )呢? 答案是:「 防呆 」 基本上寫程式的人大概都會犯上一個錯誤, == 和 = 的誤用。 新手可能是稿不清楚狀況,老手則可能是不小心犯下了這個錯誤(寫字都會有筆誤了)。 這個 Bug 是很難找出來的,因為對 Compiler 來說, x = 0 仍然可以當作判斷條件, 而且是 成立 的條件式。 這代表在測試的情況下非常有可能測不出來!! 可是如果寫成 if ( 0 == x ),當不小心寫錯的時候, if ( 0 = x )是可以被判斷出來的, 以 gcc 來說,錯誤信息如下: Error: lvalue required as left operand of assignment 這樣程式設計師就可以很容易的發現這個問題而加以修正。 看來也許我要開始改變自己的寫法了~

靈修分享~提前5:20

如果覺得有弟兄姊妹作錯事情該如何處理呢? 最近靈修到一處經文 提前5:20 犯罪的人,當 在眾人面前責備他 ,叫其餘的人也可以懼怕。 本來這經節是沒什麼問題啦 可是看看耶穌怎麼說呢? 太18:15~17 倘若你的弟兄得罪你,你就去,趁著 只有他和你在一處的時候,指出他的錯來 。他若聽你,你 便得了你的弟兄;他若不聽,你就另外帶一兩個人同去,要憑兩三個人的口作見證,句句都可定準。若是不聽他們,就告訴教會;若是不聽教會,就看他像外邦人和稅吏一樣。 怎麼感覺處理的方法不太一樣呢?耶穌的作法感覺親切多了,還給人保留面子;相較之下,保羅就嚴格多了。到底應該怎麼來看這幾處經文呢? 有一些神學家認為,提前5:20是指著教會的長老說的,因為是教會的長老,應該用更嚴格的標準來審查,配合上前一節(已經有兩三個以上的見證人了),所以才會用這麼嚴格的標準。 這樣的解釋蠻合理的。但其實也不能肯定一定是指長老,畢竟下一節開始,又在談到提摩太治理的心態,感覺已經離開「長老」這個題目。 對我來說,當有人作錯事的時候,第一步絕對是私下溝通。但要是不聽的話呢?銀英傳楊威利的邏輯是:「說了三遍還不聽的人就可以不用在理他了」(當然這裡指的是建議,而不一定是犯罪),但我的心態也還蠻像是這樣的,這樣是好是壞?也許值得我再深思下去吧... 附帶一提,新譯本的翻譯如下: 常常 犯罪的,你要當眾責備他們,使其餘的人也有所懼怕。 只是不知道「常常」這兩個字是哪來的~

聖經目錄歌

這篇算不上是什麼信仰反思啦 充其量只是記錄一首自己覺得很不錯的「工具歌」 一般在主日學教聖經目錄歌是為了記憶聖經目錄 除此以外幾乎沒有其他功能 所以特別記錄下面這首歌 除了聖經目錄以外,也多記錄了每卷書的精義(當然是非常精簡的精義) 作者是新加坡某間神學院的某任院長,曲調用的是「 耶穌恩友 」 舊約 1. 創世記載萬物開始,選民救贖出埃及。 利未顯明聖潔事主,曠野靈程民數記。 申命記強調須遵命,約書亞記得基業。 士師記神選立領袖,路得記贖回一切。 2. 撒母耳上民要立王,撒母耳下顯神權。 列王紀上兩國分裂,列王紀下罪惡顯。 歷代志上聖殿預備,歷代志下殿成功。 以斯拉記被擄歸回,尼希米記建聖殿。 3. 以斯帖記民蒙奇恩,約伯記載在試煉。 詩篇重在向神敬拜,尋求智慧是箴言。 傳道書論日下虛空,雅歌大旨是愛情。 以賽亞乃舊約福音,耶利米拆毀栽植。 4. 哀歌因罪國破家亡,以西結書重盼望。 但以理書真是奧祕,何西阿主施恩愛。 約珥書上是論主日,阿摩司講神公義。 懲治以東俄巴底亞,外邦蒙恩是約拿。 5. 彌迦全書多論救法,拿鴻審判一大城。 哈巴谷書因信得生,西番雅書神權能。 哈該鼓吹重建聖殿,撒迦利亞言未來。 瑪拉基書律法總結,三十九卷為預備。 新約   1. 馬太福音設立天國,馬可福音論服事。 路加記主人子模樣,約翰論主為神子。 使徒行傳聖靈見證,羅馬救恩有滋味。 哥林多前屬靈智慧,哥林多後重安慰。 2. 加拉太書注重信心,以弗所書講合一。 腓立比書喜樂為要,注重豐滿歌羅西。 帖前專題耶穌降臨,帖後勸言忍耐多。 提摩太前重在榜樣,提摩太後論工作。 3. 提多書上多有勸戒,腓利門書重收納。 希伯來書多講更美,雅各書論善行佳。 彼得前書大旨寶貴,彼得後書美德顯。 約翰壹書愛的結合,約翰貳書命令傳。 4. 約翰三書大旨同工,專論保守猶大書。 啟示錄書重在得勝,主得勝門徒亦勝。 二十七卷新約全書,引人歸主得救恩。 共宣真理完成使命,得建天國候主臨。

Fork 炸彈

一個簡單的小問題,請問下面一行命令代表甚麼意思 :() { :|:& };: 這是我在「開源」電子雜誌上看到的問題 還挺有意思的 拿去問我同事,結果他聯想都不想, 就直接執行下去 ... (不干我的事啊,我只是想要分享一下,沒人要他執行啊) 上面那行指令可以拆解如下: :() { :|: & } ; : 紅色部份是一個函數,而綠色的部份是執行這個函數,然後系統就會開始進行「指數」方式成長的 Fork,想當然爾,系統的資源就... 掰掰囉~連 kill 的時間都沒有。 (所以我同事現在非常小心我丟給他的東西 :p ) 解決方法: ulimit (但平常有人會用這個嗎?)