2011年12月30日 星期五

GPIO (General Purpose I/O)

以CPU而言,上面有密密麻麻的線路外主要就是會有很多的PIN腳,PIN腳可以看做是CPU跟外面溝通的通道。至於有幾隻腳根據不同的CPU規格有所不同。其中每隻PIN腳都會定義它的功能,其中GPIO可以算是其中的一種功能。GPIO就是General Purpose I/O的縮寫。I/O就是input/output。主要為CPU輸入以及CPU輸出的功能。

所謂的input mode就是當CPU想從外面收資料/signal進來的話,就會把這個PIN腳定義為input mode; 反之如果CPU去推資料出去就會把這個PIN腳定義為output mode。
簡單的output mode的例子就如同版子上的LED。好比推1就會亮,推0就會暗,這是最簡單的output mode。input mode通常需要搭配timer去定時polling PIN腳上的訊號是1還是0決定狀態改變了沒有。而這樣其實會增加CPU的負擔

為了解決上面這個問題,但又要能達到相同的事情,我們就會看接PIN腳上的device有沒有support Interrupt。
Interrupt代表CPU不用定時去polling PIN腳上的訊號,而是外部元件「主動」發訊號給CPU而這發訊號給CPU稱之為Interrupt。
這個優點就是CPU不用去做一個timer去polling PIN腳上的訊號,減低CPU Loading也增加了效率。Interrupt可以算是GPIO裡面一個很好用也頗重要的function

Interrupt有分好幾種mode,可以分成Edge Trigger以及Level Trigger
Edge Trigger包括了Rising and Falling Edge Trigger;Level Trigger可以分成High and Low Level。我們可以用下面的圖形來表示。
Note:
1:Rising
2:Falling
3:High
4:Low

Edge Trigger主要是靠波形的變化;Level Trigger則是看絕對的準位。舉個例子,當你設定Interrupt High Level Trigger時,所以當高電位的時候就會發Interrupt給CPU

Interrupt不只是只能用GPIO來做,有些CPU會直接規定某些CPU PIN腳就是Interrupt,而有些為了省PIN腳會跟GPIO共用。這都要看CPU的spec.而定。

2011年12月28日 星期三

DLF (Destination Lookup Failure)

DLF (Destination Lookup Failure)
也就是目的地位置查詢失敗的封包,會在同一個VLAN裡面做flooding

為了預防大量的flooding packet把device打死,所以有Broadcast Storm Control這個feature。不過這feature也可以限制multicast、一般broadcast每秒通過的數量,是per port的設定。


DLF...之前常聽到這名字,但現在終於知道是指什麼

2011年12月27日 星期二

Port authenticator

Port authenticator
IEEE 802.1X有規範。per port的設定。認證過的合法使用者(PC、NB,...etc)可以透過這個port來存取網路。
透過使用者輸入的帳號密碼可以動態決定這個port要加入哪個VLAN(edgeBOX, ex. RADIUS server. 回的packet會帶有這個帳號密碼給它多少VLAN ID的information)

反之如果是認證失敗的話,則會丟入Guest VLAN(至於Guest VLAN是多少可以per port去做個別設定)

至於Guest VLAN有兩種mode可以做設定。分別是port-base還有mac-based mode。port-based mode是指當這個port有第一個人認證成功後,所有經過這個port的packet都assign給它edgeBOX回的VLAN ID(Multi-host);
mac-based mode的話則是per host來看(Multi-secure),當有不同的MAC的裝置連上都個別需要去做認證。


Note:
port authenticator是指認證pass的user可以透過這個port來存取「網路」;AAA的第一個A, Authentication則是透過認證後看user可不可以存取「Switch」。兩者用途跟意義不同。

2011年10月12日 星期三

Flow-control

Flow-control use pause packet in full-duplex operation; back-pressure in half-duplex

/* pause packet */
00 00 00 00 00 02 00 00 00 00
00 01 88 08 00 01 03 E8 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00

Reference:
[1]IEEE-802.3x
[2]http://www.pcdvd.com.tw/showthread.php?t=582735

2011年10月6日 星期四

Reserved Multicast MAC Address

From IEEE 802.1ad-2005

spanning tree's reserved multicast address為01-80-C2-00-00-00
LACP為採用slow-protocol的一種feature,故其reserved multicast address為01-80-C2-00-00-02


延伸閱讀:
IEEE Std 802.1D and IEEE Std 802.1Q Reserved Addresses

Reference: IEEE 802.1ad-2005

2011年9月29日 星期四

L2PT (Layer 2 Protocol Tunneling)

L2PT

Layer 2 Protocol Tunneling

這其實是為了解決edge端switch在跑Layer 2 protocol時候發出很多BPDU的同時,在Service Provider的core-network也會有對應的Layer 2 protocol在run,為了不讓彼此互相干擾所衍生的tunneling feature
Layer 2 Protocol Tunneling Network Configuration, from Reference[1]
以這圖而言,Switch 1 2 3 以及4 5 的Layer 2 protocol就可以互通,然後不影響Service Provider的Layer 2 protocol

port role可分成access port以及tunnel port

access port代表接edge switch的port,當這個port收到特定BPDU時會把它封裝成帶特定MAC(user可自己設定)然後送往tunnel port往core-network丟

tunnel port代表接core-network的port,當這個port收到帶特定MAC的packet會把它解封裝然後丟回access port


目前常見support的Layer 2 feature有STP, CDP, VTP, PAgP, and UDLD
扣除STP (Spanning Tree Protocol)外,CDP (Cisco Discovery Protocol), VTP (VLAN Trunking Protocol), PAgP (Port Aggregation Protocol), UDLD (Uni-Directional Link Direction)都是CISCO自己提出的protocol

2011年9月14日 星期三

Snooping

在switch上另個常見的功能就是Snooping
Snooping的定義是「偷看」,switch偷看後記下來,然後有個別的應用,但重點是不影響原本的行為,意即是if沒開Snooping也可以正常運作
開啟Snooping後在switch上會「自動學習」跟他有關的infomation
這樣之後有packet進來的時候switch就可以直接把Packet送到適合的port

常見的包含IGMP SnoopingDHCP Snooping

2011年9月9日 星期五

GVRP

GVRP
VLAN的port可以手動也可以自動學習,手動設定的可以稱作Static VLAN;自動學習的可以稱作Dynamic VLAN。
其中自動學習的VLAN是使用GVRP, 也是個送出特定的BPDU(dst MAC = 0180C2000021)來完成的功能

GVRP的BPDU會夾帶VLAN的information,接收到後會自動"建立起"這個對應的VLAN



Here is an example of GVRP BPDU with JoinIn event for VID=100.
GVRP BPDU  /* VLAN 100 */
01 80 C2 00 00 21 00 00 00 00 00 02 00 0C 42 42 03
00 01 01 04 02 00 64 00 00

04: Length
02: JoinIn
00 64: VID 100
GVRP BPDU


Reference:
[1]http://support.dell.com/support/edocs/network/pc5212/tc/ug/pc5212ce.htm
[2]http://www.furukawa.com.br/pls/portal/docs/PAGE/PORTAL/DRTECH/PRODUTOS%20FORA%20DE%20LINHA/SWITCH/SW_5109/MANU_GERENCIAM_5109.PDF
[3]http://guiderworld.blogspot.com/2008/11/8021q-vlan.html


2011年9月8日 星期四

sFlow

sFlow, defined in RFC 3176。提供一個monitor整個network的solution,讓網管人員可以了解到目前整個網路環境的資訊(好比port上統計資料、收送的packets)
sFlow,s是sampled的意思,我認為叫做「取樣」還蠻恰當的

sFlow的架構中主要有兩個角色:Collector以及Agent。如下圖
sFlow架構圖
一般的switch/router大多扮演Agent角色。Agent在間隔一段時間後取得sample的data或者counter去傳送sFlow packet給Collector,Collector再根據收到的sFlow packet去做些分析,sFlow packet採用UDP的方式來送

sFlow sampling包含了兩部份:Flow sample以及counter sample;Flow sample就是 packet,counter sample就是port上的counter統計資料。這兩種都可以被包含在sFlow的datagram中。在sFlow的datagram中最多可以一次夾帶4個sample的data,包含了3個counter sample以及1個flow sample


在switch端扮演Agent的角色,設定包含了Collector的IP位置,UDP socket number,counter sample的interval(20~120秒)以及sample rate(每隔幾個packet sample一次)

Reference:
sFlow verion 5

switch....

/* 工作快兩年,我想我該整理一下碰到的東西跟自己的想法,持續update這篇, 2011-09-08 */


先了解一下hub vs switch的差別

Switch
不外乎就是當有packet從一個port進去的時候要forward到正確的port,至於如何正確的forward就是一門很大的學問


Switch在網路傳輸過程不外乎做幾件事情
其中最主要的減少流量增加網路效能 (這也是為什麼要用Switch不用hub的主因)

其中,為了減少一些不必要的資料在網路上傳送
於是產生了切割網段的方式,也就是所謂的VLAN(IEEE 802.1Q)

VLAN Tag format

而也因為有切割不同的VLAN,在packet就會因此受到限制,so 會為了解決VLAN跨domain的問題去做出相對應的feature


以Virtual LAN而言依據不同的切割方式衍生了幾種VLAN:
Protocol based VLAN (根據protocol來切VLAN)
Port based VLAN (根據對應的port來區分traffic)
Subnet based VLAN (根據IP range來切VLAN)



以Subnet based VLAN而言,使用者可以設定packet的source-ip + mask-bits來判斷符合條件的packet就送到哪個VLAN去。另外也可以根據不同的VLAN設定不同的priority,值越大代表權限越高

Protocol based VLAN則是去parse 進來packet的protocol 欄位是什麼(ex. IP、IPX、ARP、RARP、Apple Talk、DECNet),然後使用這自己決定符合這條件的packet要送到哪個VLAN去。

特別一提的是,上述兩種VLAN環境中,在進來的packet是有帶VLAN tag的時候還是按照原本的VLAN去forward;上述提的兩種進階的VLAN都是適用於進來的packet不帶VLAN tag的情況

最後,Port based VLAN 就是以port當VLAN切割的依據,可以設定哪些port是在同個VLAN底下。

802.1p除了define優先權的概念,包含八種不同的priority外,另外定義了GARP-Generic Attribute Registration Protocol。GARP定義了Ethernet switch間交換不同特性訊息的方法,定義了Multicast(GMRP)、和VLAN(GVRP, in 802.1q)等的屬性。GARP定義了這些如何發送/處理feature的封包等

在VLAN中......可探討幾個常見的VLAN功能:
VLAN  port的設定可分成手動 / 自動  GVRP
Ingress filtering
   這概念很簡單,當這功能打開,從port進來的packet如果帶的VLAN TAG的VLAN「不存在」or和這個port join的VLAN不同的話就會直接被drop掉。不同的model這實現的方式不同,但不外乎是per port去做filtering或者total system去做filtering

VLAN Mapping
把進來packet的VLAN ID給換掉,可用於在Service Provider Network中和edge端的private network下用到相同VLAN ID但有不同用途的情況下。除了換VID也可以換priority,這是per port設定的feature


VLAN Stacking
VLAN Stacking 簡單講就是在原本的VLAN TAG前面再加一個TAG,有兩層TAG的意思。也稱做Q-in-Q, double tagged好處是在原本的4094的VLAN可以double加到4094*2個VLAN可以用。其實是為了解決ISP業者為了個別用戶都個別去設定VLAN導致VLAN不夠用的問題。

原本的VLAN稱為INNER TAG (CVID),多加的那一層稱為OUTER TAG (SVID)

Note: VLAN Stacking和VLAN Mapping不能同時使用


Reference:
[1]http://blog.xuite.net/ahdeng/life/16396680
[2]http://guiderworld.blogspot.com/2008/12/vlan-stacking.html


VLAN Trunking
VTP(VLAN TRUNKING PROTOCOL),cisco提出的protocol,不過大多數交換器產品都支援此protocol。

這功能主要是要讓「不存在」於這台Device的vlan tag packet可以pass through這個port。優點是在end-device設定好對應的vlan group時,當彼此間要溝通的時候,中間經過的device也都要有對應的vlan group設定才可以通,否則它們會看到這些packet都會把它drop。而這些packet會forward到同台的有開vlan trunking的port去

Reference:
[1]http://support.dell.com/support/edocs/network/pc5212/tc/ug/pc5212ce.htm


port-security - 主要用於限制per port可以讓幾台host(認幾個MAC)連上去,包含動態學習以及手動設定


Security有關的feature可以包括幾項,主要規範於IEEE 802.1X:

Multicast: IGMP Snooping


for Layer 2 redundant mechanism: Spanning tree(STP, RSTP, MSTP..)
spanning tree收斂速度太慢(300ms !?) Extreme Network提出 EAPS,Ethernet Automatic Protection Switching, 可以在30ms的時間內完成

to be continued...

2011年9月7日 星期三

Loop guard

Loop guard用於解決edge端loop的問題,而對應的應用在core-network避免loop的則是STP

Loop guard得作法其實就是送一個probe packet出去,當在同一個port收到這個flooding回來的probe packet則表示有loop發生 -> 關port避免loop

當switch收到probe packet,會確認dst mac是不是特定的(01a0c5aaaaab),以及src mac是不是自己的mac,如果是的話表示有loop情形發生 -> 關port; 反之則flooding到其他port

當loop guard開始作用,port會被disable掉。當loop排除,可以用err-disable的recovery自動enable回來;或者手動在port上先關掉,再打開一次回復forwarding state


延伸閱讀:http://guiderworld.blogspot.com/2009/02/loop-guard.html


/* loopguard probe packet(dst mac = 01a0c5aaaaab, source mac = 0019cb000001) */
01 a0 c5 aa aa ab 00 19 cb 00 00 01 90 00 01 00
27 bf 06 01 06 00 19 cb 00 00 01 02 02 00 00 03
06 47 53 32 32 30 30 04 04 00 40 cb 3a 05 06 47
53 32 32 30 30 00 00 00 00 00 00 00

2011年8月9日 星期二

(轉貼) ASCII字元碼對照表 (C/C++) (C) (Web) (HTML)

最近有需要用到了,趕快來紀錄一下比較方便查詢

完整的ASCII字元碼對照表,除了8進位、16進位、10進位外,還包含HTML表示法

Reference:

2011年7月29日 星期五

Trace32 略知一二

/* 關於Trace32 內建online help page */

Trace 32 在插上電源後打HELP, 按下ENTER 可以有個online help page可以查COMMAND,但也是對應到安裝trace32目錄資料夾下一個pdf的資料夾下面的所有.PDF的文件(EX. C:\T32\pdf ),只是TRACE 32打HELP開起來的時候有個索引的功能[下有查的大概原因]



/* 關於SYSTEM.UP */

正常打SYSTEM.UP 這個COMMAND過程是 trace32把目標的CPU給RESET然後強制他進入debug mode (我們就是在debug mode 可以load file or cmm file, 所以點GO之後才是根據我們load的file去執行)


會搶不到的原因是CPU上nTRST這個pin line is connected to 某些地方造成我們無法進入debug mode(這要看cpu對pin的design)

所以當我們下OFF 後 可以把cpu給holt住,強制他進入debug mode。跟JTAG、線有無關係我就無法確定了


這些在debugger_arm.pdf中有詳細說明

2011年7月26日 星期二

Trace32

本想找個Trace32 command的意義的,結果竟然爬到大陸子公司對trace32研究的文章! 用公司系統查還可以查到這個人的E_MAIL跟部門,這實在太牛了XDD


http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1435747&bbs_page_no=1&search_mode=4&search_text=holged&bbs_id=9999

2011年7月4日 星期一

SNMP SMIv2

§
SMIv2Structure of Management Information Version 2

The STATUS clause in indicates whether this definition is current or historic. 
  • current" means that the definition is current and valid. 
  • "obsolete" means the definition is obsolete and should not be implemented and/or can be removed if previously implemented. 
  • "deprecated" also indicates an obsolete definition, it permits new/continued implementation in order to foster interoperability with older/existing implementations.

Reference:
RFC2578 SMIv2, section6.1

2011年6月15日 星期三

SDHC vs SD

原來這兩者有不同...差點糗了..




SD vs. SDHC

以外型來說 SD和SDHC 看起來是一樣的。差異的部份 其實還是有挺大的差異的
1. 所謂的HC 顧名思義就是 High capacity
所以SDHC 泛指高容量的SD卡 , 而高容量的部份就是4G以上(包含4G)

2. 於SD協會所定義的SD SPEC中 , SD 1.1 的SPEC 只定義到2GB 容量的卡片
SD2.0的規範定義4G~32GB的卡片

3. SD1.1和SD2.0的規範中 , 有幾個比較簡單 也比較容易記的差異點
A : SD1.1 的卡片支援到2GB的其中一個原因是 "使用FAT16的file system format"
在1.1中並沒有定義FAT32的檔案格式 , 所以才會不能用4GB或是以上的卡
這部分在2.0的規格中才定義清楚

B : SD1.1的時代 , 速度的標示方式 都是以"倍速" 當標示的方式 , 而市面上常看到的卡片
150X , 300X 之類的 ; 每個X 就是代表 150KB/S , 這個大家應該都知道,而且廠家標示的速度
都是讀取速度(因為讀取一定比寫入快) .
而在SD2.0的規格,協會為了避免標示不清或是小廠亂標示一通 , 才開始定義了Class 的規範
市面上可以看到SDHC相關的卡片都會有標示Class ; 其中目前有 2 . 4 . 6
數字代表的是保障最低的存取效能 , 但是標示6 並不是簡單的讀取或是寫入效能6MB/S 就好了
詳細的規範 , 請看SD2.0 SPEC , 很難解釋太多 .

C : SD1.1 的卡片 , 可以用在SD1.1和SD2.0的device
SD2.0的卡片 , 低於4GB的容量 可以用在SD1.1和SD2.0的Device
SD2.0的卡片 , 高於等於4GB的容量(SDHC) , 只能用在SD2.0的device




Reference:
http://www.mobile01.com/topicdetail.php?f=164&t=410253
http://blog.xuite.net/ieye0111/vicky/19297033

2011年5月23日 星期一

Big endian and Little endian

如果你在文件上看到一個雙字組的data,
Ex: long MyData=0x12345678,要寫到從0x0000開始的記憶體位址時。
如果是Big Endian的系統,
存到記憶體會變成 0x12 0x34 0x56 0x78,最高位元組在位址最低位元,最低位元組在位址最高位元,依次排列。

如果是Little Endian的系統,
存到記憶體會變成 0x78 0x56 0x34 0x12,最低位元組在最低位元,最高位元組在最高位元,反序排列。

比較的結果就是這樣:


Reference:

2011年5月17日 星期二

新增/修改XP網卡IPv6 config

安裝IPv6功能:
dos>ipv6 install

移除:
dos>ipv6 uninstall


修改網卡的IPv6 address: /* 假定網卡的name為RealTek,要把它address手動設成2100::5 */
dos> netsh>interface>ipv6>set address interface=RealTek address=2100::5


刪除IPv6的address:
dos> netsh>interface>ipv6>delete address interface=RealTek address=2100::5

2011年5月4日 星期三

PoE(Power over Ethernet)


PoE工作原理

在加電啟動的時候,PSE設備必須首先確定:是否可以連接到任何PD;它們所需的電力;檢測網路中沒有短路。為了做到這一點,PoE標準規定了信號傳輸協定(signalling protocol),以便在引導時間(boot time)內交換必要的資訊確保進行有效的電源管理。
加電啟動或者reset的同時就開始進行特徵檢測(signature detection),見圖4左下角部分。PSE在2.7V~10V的範圍內提供0. 1V /μs的電壓斜坡(voltage ramp)。要實現兩個阻抗測量就要確定是否連接PD。如果檢測到的阻抗位於15kΩ~33kΩ的範圍內,那麼接下來就進入分級(classification)階段;如果檢測到阻抗在這個範圍之外就切斷電源。


下一步是確立PD的電源分級。在這個過程中,PSE將電壓增加到14.5V~20.5V之間。PD將發出一個特徵電流(signature current)用於向PSE標識它的電源級別,然後PSE才可以確立PD所需要的電力。在802.3af標準裡,規定了五種電源級別,見表1。當分級步驟完成之後,PSE將幻象電源電壓升至正常水平,即 48V。這樣,電纜的最大損耗可以這樣計算,在PD上至少37V的電源,電流為350mA,總體的功耗為12.95W。
等級使用特徵(signature)PSE功率PD功率
0標準<5.0mA<=15.40.44W~12.95W
1可選10.5mA<=4.00.44W~3.84W
2可選18.5mA<=7.03.84W~6.49W
3可選28.0Ma<=15.46.49W~12.95W
4保留40.0mA保留保留

概況來說,總共有三個步驟:檢測、分級和執行分配電源。必須要注意的是對時序要求不同的標準版本定義有所不同,例如,在PoE Plus標準裡,特徵脈衝(signature pulse)最大為30ms,而這些脈衝之間的間隙最大為12ms。[1]


PoE的後續版本IEEE802.3at或者PoE Plus正在處於開發當中。它們向後相容802.3af,並且允許向PD設備傳輸30W的電力。標準強制使用Cat 5e的電纜,而且PSE電壓範圍也從原先的44V~57V提升到50V~57V。最大電流從350mA增加到720mA,電纜的最大工作溫度被設定在45℃。
根據新標準設計的PSE可以與舊的PD設備一起使用。另一方面,新的PD設備當然不會從舊式的PSE上攝取全部30W的電力。系統擴展後,通過延伸分級步驟的動作將使系統中的新設備能夠匹配工作。從圖5可以看出,改進後有兩個用於分級的脈衝。PoE Plus標準協定下的PD設備必須首先將它們自身確立為class 4器件。在另外一個分級脈衝中,它們必須輸出40mA的特徵電流(signature current)。PoE標準協定下的設備將忽略第二個脈衝,這樣就能夠很清晰的區分 PoE設備和PoE Plus設備。

2-Event Classification允許PD識別是否連接到Type1(802.3af/13W)或Type 2(802.3at/30W)供電設備(PSE),反之亦然。2-Event Classfication告知符合IEEE 802.3at的PSE可以安全地把提供給PD的電源從13W增加到30W。使用這種Type2 PSE與Type 2 PD之間的分級協定,可以支援電源的動態協商與分配,從而實現更有效率的系統電源管理。

Reference:
[1]http://www.electronictechnology.com/new/mgad.php?sublnk=article&mcontentid=2700&contentid=NDM1XzE5L2luZGV4Lmh0bWw=
[2]http://www.dallmeier-china.com/news_show.asp?id=53

2011年3月1日 星期二

C語言- 指標變數 (pointer variable)

/* 永遠不要忘記,一個指標變數無論其TYPE如何,指標變數的大小只會等於4bytes,  sizeof(指標變數) = 4 bytes */


EX.
typedef struct eTable_s
{
qlink_t link;
eEntry_t e_entry;
logEntry_t *logTable;
logEntry_t *log_next;
int32 log_qcnt;
} eTable_t;


eTable_t *bpt = NULL;  /* 指標變數的初始值,給他NULL */

bpt's size = 4 bytes

sizeof(eTable_t) == 246 (bytes)
sizeof(bpt) == 4 (bytes)

如果想要把bp malloc的空間給清成0,如果寫成memset(bpt,0,sizeof(bpt));
則因為sizeof(bpt)==4 bytes. 所以後面如果用到bpt->logTable時後則可能會取得!=NULL的value;

正確用法是 memset(bpt,0,sizeof(eTable_t));


Q2: 那為什麼寫 memset(bpt->logTable,0,sizeof(bpt->logTalble))
則bp->logTable 仍有可能不是NULL??

因為memset是把bp->logTable這個「指標變數」「指到」的地方清成0[補充1],而不是bp->logTable這個指標變數清成0
/* 可參考memset的macro function */

正確寫法應該是 bpt->logTable = NULL;

更多指標變數用法,說明,範例:
http://squall.cs.ntou.edu.tw/cprog/Materials/Pointers.html
http://nknucc.nknu.edu.tw/~jwu/c/cpgch4.htm
http://www.wretch.cc/blog/rave30822/12674500





[補充1] memset的用法:

memset( buf, '0', 6 )
的意思就是:
把從 buf 指向的地址開始的 6 個字節的內容置為 '0' 。


Reference:
http://www.lslnet.com/linux/f/docs1/i42/big5296913.htm
http://tw.myblog.yahoo.com/jw!C8o78amGHxpmt7niVSLKqfN4pg--/article?mid=46





[補充2] 幾個容易混淆的 pointer宣告與大小

請問以下宣告pointer佔多少bytes, 假設 1 pointer: 4bytes
0) char *x;
1) char **a;             //This is a pointer to a pointer to char
2) char *b[20];      //This is an array of 20 pointers to char.
3) char (*c)[20];    //This is a pointer to an array of 20 chars.
4) char (*d)[20][40];


Ans: sizeof(x):4,sizeof(a):4,sizeof(b):80,sizeof(c):4,sizeof(d):4

引用自: http://eeepage.info/pointer-size/

2011年2月18日 星期五

基本避免Memory Leak的技巧

很多程式初學者比較沒有在注意一些Memory處理上的問題。其實只要平時稍微注意一下,就可以避免掉很多問題,而且也可以讓你的程式更好以及更穩定。

首先,是指標變數內容的問題。通常各位在使用指標時,可能習慣不給予初始值。其實這會造成一些問題。所以建議大家宣告指標變數時一律給予初值。若無法在宣告的同時一併配置記憶體,那麼請給予NULL作為初值。例如:

TList *myList = NULL ;

另外,許多在delete後,大家可能也就不再理會該指標的內容了。其實,這也是會造成一些麻煩。因為記憶體被delete可能只是系統作一個記號在記憶配置表中,表示該記憶體是free的。原來的記憶體內還是有原先的內容。但是你的程式一個不注意,又去把原來的指標拿起來用。如果馬上就出錯的話,這樣還好。偏偏因為原來的內容都還在,所以這個錯誤會延遲產生影響。這種類型的Bug特別難抓!因為,你根本找不到引發問題的所在,如果你有個地方一直發生Access Violation,可是該地方的程式碼你已經check過十幾次了,還是找不問題,那很可能你就是遇到這樣的問題。以前在寫一些程式時,我就曾經為了這樣的Bug,弄了三天。可見其傷害有多大。

所以,當delete某指標後,其務必將其內容設為NULL。一方面是使用NULL指標,一定是馬上出錯。所以你的Bug一下就會抓到。另外一個
理由是如果你不小心重複delete同一個物件時,一樣會發生延遲影響的錯誤。


轉貼自: http://blog.xuite.net/huenlil/note/5290923

2011年2月10日 星期四

LACP timeout value problem? 改成short timeout為什麼反而是收到對方的LACPDU的timeout變短?

在LACP中timeout value只有兩種mode可以選,long以及short。long是30秒而short則是1秒。timeout value影響的是不同台間在維持LACP link時多久會去發一個packet去「確認」這條連線還是不是存在,如果不存在則在3倍timeout value後把這個port移出trunk group,而確認連線是否活著的packet通稱為LACPDU。

而目前有個問題意思是說當兩台DUT對接,當A台的timeout 設成1 sec而另外一台B維持default 30sec,去抓封包會發現B台會每隔1 sec發一次LACPDUPACKET
反而A台還是原本的30sec去發LACPDU packet,好像有點怪怪的!?

經過查證後我們得到spec是寫說送LACPDU PACKETtimeout 時間是參考「對方的timeout 時間,也意思是說當對方timeout設為1秒時候我們才會每1秒去發packet;反之則不會。

可以翻閱802.3ad-2000 p.133頁關於LACPTx state machine的描述:
LACP Periodic Tx Machine[1]
可以看到標紅色的部份,當我們要送LACPDU的時候會根據Partnertimeout value
/* specactor代表的是自己;partner代表的是另外一台 */

另外,如果接DUT去接host,改了TIMEOUT1sec後也是30sec才會收到LACPDU也是因為這個緣故。(partnertimeout value default都是30sec,當收到對方LACPDU時候跟現在timeout value不同才會去update)

Reference:
[1] IEEE 802.3ad-2000

2011年1月27日 星期四

IPv6入門

IPv6的初步認識

IPv6採用128個bits來定義一個位址,所以在理論值上可以有2的128次方個IP位址可以用,天啊!!那是一個多大的天文數字!! IPv6基本上把前面64個bits當成網段ID,後面64個bits當成Interface ID。有幾個和IPv4不一樣的重點要記住
  • IPv6沒有遮罩值(Submask)
  • IPv6沒有廣播(Broadcast)
  • IPv6不用網路位址轉譯器(NAT)

IPv6設定

128 Bits被分成8個區塊,每一個區塊為16個Bits(即2個Bytes),使用16進位來表示,而且每個區塊之間使用:(冒號)隔開,所以看起來如下
2010: 0000: 0000: 00A2: 0000: AB01: 813D: 01AF
每一個區塊中,前面如果是0可以省略,例如:00A2 可以寫成 A2
如果是連續區塊皆為0,則可以使用::(連續兩個冒號)來表示,例如上面的:0000:0000:可以寫成::。但是這種::(連續兩個冒號)之表示方法在一個位址中只能出現一次。

IPv6首碼(Prefix)

IPv6位址需要定義一個首碼,例如 /3,表示前面3個bits,是固定不變的。很像IPv4的遮罩,但它是不同的意義。

IPv6的位址分類

IPv6分成unicast Address, multicast address, anycast address(取代了broadcast廣播) 這些位址在一台電腦中,是可以同時存在。
  • anycast--可以指派給多個網路卡,每個網路卡傳送anycast時,只傳給距離最近的一個節點。
  • multicast--和IPv4 multicast作用相同,基本定義為 1111 1111 /8,即前面8個bits皆為1,所以看起來以 FF 開頭之位址即是 multicast address。
  • unicast又分成link-local, site-local及Global。
Global unicast是由IANA統一分配,是用來連上Internet的位址,基本定義為 001 /3。意思就是最前面的3個bits固定是001不變,也就是說,以二進位而言,看起來就是如下
0010 0000 0000 0000:(後面7個區塊就省略不列出來囉)
一直到
0011 1111 1111 1111:(後面7個區塊就省略不列出來囉)
所以用16進位表示,看起來就會像 2000:....一直到 3FFF:....。也就是說當你看到只要是 2 或 3 開頭的IPv6位址,是IANA分配的,可以用此位址直接連上Internet。
另一種比較常見的是 link-local address,它很像IPv4的APIPA,但不相同的是,APIPA位址的產生是因為設定DHCP Client(自動取得IP Address),但並沒有被分配到IP Address時,電腦才會產生APIPA位址(例如:169.254.23.3 /16)。IPv6的link-local address則是在網路卡上會自動產生出來,基本定義為 FE80:/10,意思即前面的10個bits要固定為 1111 1110 10,而且其實後面是連接54個0,所以看其來會是 FE80::例如下圖


link-local address 的特性跟APIPA幾乎一樣,只能用在和本身電腦所處的區段之其他電腦相互溝通之用,不可以跨Router,意即不可能用此種位址連上Internet。


轉貼自: http://www.uuu.com.tw/public/content/article/100927tips.htm

忘光光..真頭大...

2011年1月25日 星期二

packet builder

packet builder
可以把透過wireshock之類抓封包軟體儲存的檔案(例如格式為.cap or .pcap)做解析然後一模一樣再送出去的軟體。

說真的,如果不是QA跟我講我還真不知道有這種軟體,而且是free的


Download:http://www.colasoft.com/packet_builder/

2011年1月24日 星期一

使DHCP 重新取得IP

開個.bat檔,把這段貼入,之後點選執行這個bat檔就可以重新向DHCP server註冊個IP


@echo 重新向dhcp的取得ip
ipconfig /release
ipconfig /flushdns
ipconfig /renew
pause


Reference:
http://forum.icst.org.tw/phpbb/viewtopic.php?f=24&t=13340

2011年1月20日 星期四

Non-block Socket:select()

  • What 's socket
    • §Socket is a file descriptor associated with an opened file.
  • Blocking or non-blocking socket:
    • Blocking socket
      • The program is "blocked" until the request for data has been satisfied Socket default behavior
§
    • Non-blocking socket
      • Synchronous I/O Multiplexing
        • select() 




  • Select()
    • select() monitor readfds, writefds, and exceptfds.
    • fd: file descriptor
    • Use socket descriptor for file descriptor.
    • Provide the ability to monitor a set of sockets at the same time
      • Which socket is ready for read
      • Which socket is ready for write
    • Provide multiple sessions 
      • Several clients can access server at the same time
    • Non-blocking
      • Return to process if timer expires

  • Parameters in select()
int select(

int nfds, 

fd_set_t *readSet, 

fd_set_t *writeSet, 
fd_set_t *exSet, 
timeval_t *timeVal



  • nfds
    • Be the highest file descriptor plus one
  • readSet
    • Reflect which file descriptor your selected is ready for reading.
  • writeSet
    • Reflect which file descriptor your selected is ready for writing.
  • exSet
  • timeVal




  • Macro for select()
    • Bind() : FD_ZERO(), FD_SET()
    • Select(): FD_ISSET()
    • Close(): FD_CLR()
  • Sample code for select()


Reference:


2011年1月17日 星期一

FTP port 20 ? port 21?

TCP 的連線中在 Client 及 Server 端各會有一個 Port Number
在 Client 端一般是隨機指定的,而 Server 端則看服務而定,一般不會變動

FTP 的通訊協定比較複雜一點,詳細資料可以參考 http://rfc.giga.net.tw/rfc959

我這邊簡單解釋一下:

FTP 通訊協定在伺服器端可能會使用到 TCP Port 20 及 TCP Port 21 (這可以改的)
TCP Port 21 主要用來傳送命令,TCP Port 20 則用來傳送檔案/資料
如果你的 FTP Server 不是跑在 Port 21,
那麼 Data Port 一般會跑在 command port 減 1 的位置

FTP 有兩種運作模式,一個是 active (主動) 一個是 passive (被動)
這裡的主動與被動的定義是相對於伺服器的角色而言的

而 Port 20 只會用在主動模式下

在主動模式狀況下
Client 首先連接到 FTP Server 的 TCP Port 21,
告訴 FTP Server 他要抓一個檔案,然後這時候 Client 要送出一個訊息,
告訴伺服器他會在那個 TCP Port (隨機指定)等著接收這個檔案,
然後伺服器會經由自己的 Port 20 主動建立一條連線到 Client 端的這個 Port 上面,
藉由此連線把檔案傳送給 Client 端

在被動模式狀況下
Client 首先連接到 FTP Server 的 TCP Port 21,並指明要採用 Passive 模式,
接著告訴 FTP Server 他要抓一個檔案,
這時候伺服器會送出一個訊息,告訴 Client 說已經把檔案準備好放在某個 TCP Port (隨機指定) 上面,
由 Client 端自行建立一條連線到 Server 的這個 TCP Port 來把檔案傳送回去

綜合以上所述,如果你的服務是跑在 TCP port 21,且使用主動模式,
那麼照道理來講,伺服器端連接出去送資料應該要使用 Port 20 才對

你要不要說明一下伺服器端的環境,
然後看看能不能把 Client 端的連線過程記錄貼上來看看
(例如 CuteFTP 連線時會有個小視窗看到一堆命令)

有一個可能是因為伺服器的設定問題導致的

這邊有一份文件詳細說明 FTP data-port 的運作模式,很值得你參考 (英文的)

http://slacksite.com/other/ftp.html







轉貼自: http://www.pczone.com.tw/vbb3/thread/47/117740/

FTP 指令 (DOS)

FTP 命令: (後面有詳細說明內容) 
ftp的命令行格式為:
ftp -v -d -i -n -g[主機名] -v 顯示遠程服務器的所有響應信息。
-d 使用調試方式。 
-n 限制ftp的自動登錄,即不使用.netrc文件。
-g 取消全局文件名。 
help [命令] 或 ?[命令] 查看命令說明 
bye 或 quit 終止主機FTP進程,並退出FTP管理方式. 
pwd 列出當前遠端主機目錄 
put 或 send 本地文件名 [上傳到主機上的文件名] 將本地一個文件傳送至遠端主機中 
get 或 recv [遠程主機文件名] [下載到本地後的文件名] 從遠端主機中傳送至本地主機中 
mget [remote-files] 從遠端主機接收一批文件至本地主機 
mput local-files 將本地主機中一批文件傳送至遠端主機 
dir 或 ls [remote-directory] [local-file] 列出當前遠端主機目錄中的文件.如果有本地文件,就將結果寫至本地文件 
ascii 設定以ASCII方式傳送文件(缺省值) 
bin 或 image 設定以二進制方式傳送文件 
bell 每完成一次文件傳送,報警提示 
cdup 返回上一級目錄 
close 中斷與遠程服務器的ftp會話(與open對應) 
open host[port] 建立指定ftp服務器連接,可指定連接端口 
delete 刪除遠端主機中的文件 
mdelete [remote-files] 刪除一批文件 
mkdir directory-name 在遠端主機中建立目錄 
rename [from] [to] 改變遠端主機中的文件名 
rmdir directory-name 刪除遠端主機中的目錄 
status 顯示當前FTP的狀態 
system 顯示遠端主機系統類型 
user user-name [password] [account] 重新以別的用戶名登錄遠端主機 
open host [port] 重新建立一個新的連接 
prompt 交互提示模式 
macdef 定義宏命令 
lcd 改變當前本地主機的工作目錄,如果缺省,就轉到當前用戶的HOME目錄 
chmod 改變遠端主機的文件權限 
case 當為ON時,用MGET命令拷貝的文件名到本地機器中,全部轉換為小寫字母 
cd remote-dir 進入遠程主機目錄 
cdup 進入遠程主機目錄的父目錄 





Reference:
http://hack.org.tw/isfourm/viewthread.php?tid=58