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