- git - push to non-bare repository
- 用一張圖來為 Git 快速入門 (流程圖解)
- git筆記
- vmware的timekeeping問題
- doxygen
- indent - format your code
2015年4月19日 星期日
Table Of Content for tag "tools"
2015年2月27日 星期五
OpenEmbedded User Manual - CH3, Writing Meta Data (Adding packages)
如同User manual提的,讓我們從寫package的description跟license開始,我們寫一個brook_1.0.bb開始
description
DESCRIPTION = "Brook's first application" HOMEPAGE = "http://www.brook.com/oe/" LICENSE = "Brook-Proprietary"基本上這些參數都只是描述,也就是字串,至於LICENSE有公用哪些選項,請參考Recipe License Fields。
define dependency
DEPENDS = "gtk+" RDEPENDS = "cool-ttf-fonts"DEPENDS是build時需要哪個package,RDEPENDS則是執行時需要哪個package,也就是說如果該brook_1.0被加到image,則RDEPENDS所列的也都會被加到image之中。
source location
SRC_URI = "http://127.0.0.1/brook/${P}.tar.bz2"
SRC_URI[md5sum] = "6abf52e3f874f67bc4663d0986493970"
SRC_URI[sha256sum] = "7aa5130f9648f0948ebaad270a4fe1112e4cc06895580dab85da26baa37fd4f6"
SRC_URI是指定檔案所在的位置,可以支援http、ftp、git、svn、file等,詳情可參考SRC_URI variable,SRC_URI[md5sum]與SRC_URI[sha256sum]是去驗證檔案是否正確,可以透過md5sum file_name與sha256sum file_name算出。當中的${P}=${PN}-${PV},${PN}是Package Name,${PV}是Package Version。
build system selection
在開始真正build package之前,我們必須決定這個package使用哪個build system,如果這個package需要先執行configure script然後在make,那麼通常就會選用autotools,更多關於autotools class,其他inherit之後再來討論。到此可以真正開始build brook這個package了,bitbake brook。
完整brook_1.0.bb
DESCRIPTION = "Brook's first application"
HOMEPAGE = "http://www.brook.com/oe/"
LICENSE = "Brook-Proprietary"
LIC_FILES_CHKSUM = "file://COPYING;md5=dcb2a5c2b6d6fea1a0835c08d71ad817"
SRC_URI = "http://127.0.0.1/brook/${P}.tar.bz2"
SRC_URI[md5sum] = "6abf52e3f874f67bc4663d0986493970"
SRC_URI[sha256sum] = "7aa5130f9648f0948ebaad270a4fe1112e4cc06895580dab85da26baa37fd4f6"
inherit autotools
Example of Source Code
brook-1.0/Makefileall: brook
brook: main.o
${CC} $? -o $@
install:
install -d -m 755 ${DESTDIR}/bin
install -m 755 brook ${DESTDIR}/bin
brook-1.0/main.c
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello world, Brook\n");
return 0;
}
LIC_FILES_CHKSUM does not match
如果出現以下錯誤ERROR: brook: Recipe file does not have license file information (LIC_FILES_CHKSUM) ERROR: Licensing Error: LIC_FILES_CHKSUM does not match, please fix可以在bb file中加入
LIC_FILES_CHKSUM = "file://COPYING;md5=dcb2a5c2b6d6fea1a0835c08d71ad817"
其中COPYING就是LICENSE檔案位置,我是指到source file解開後的COPYING檔案位置與其對應的md5sum。
標籤:
OpenEmbedded
2015年2月7日 星期六
nc — arbitrary TCP and UDP connections and listens
幾乎任何使用 TCP,UDP或UNIX-domain socket的動作都可以用nc來達成,常見的功能如。
- simple TCP proxies
- shell-script based HTTP clients and servers
- network daemon testing
- a SOCKS or HTTP ProxyCommand for ssh(1)
- and much, much more
SYNOPSIS
nc [-46bCDdhklnrStUuvZz] [-I length] [-i interval] [-O length]
[-P proxy_username] [-p source_port]
[-q seconds] [-s source] [-T toskeyword] [-V rtable]
[-w timeout] [-X proxy_protocol] [-x proxy_address[:port]]
[destination] [port]
options: -v, verbose
不加-v,發生錯誤時不會有訊息。brook@vista:~$ nc 127.0.0.1 12345 brook@vista:~$ nc -v 127.0.0.1 12345 nc: connect to 127.0.0.1 port 12345 (tcp) failed: Connection refused brook@vista:~$ nc -v 127.0.0.1 80 Connection to 127.0.0.1 80 port [tcp/http] succeeded! 輸入GET / HTTP/1.1 輸入HOST: 127.0.0.1 輸入[enter] 輸入[enter] HTTP/1.1 200 OK Date: Tue, 27 Jan 2015 08:24:17 GMT Server: Apache/2.2.22 (Ubuntu) Last-Modified: Mon, 23 Dec 2013 04:13:45 GMT ETag: "1b806ff-b1-4ee2bdaa24ac8" Accept-Ranges: bytes Content-Length: 177 Vary: Accept-Encoding Content-Type: text/html X-Pad: avoid browser bug <html><body><h1>It works!</h1> <p>This is the default web page for this server.</p> <p>The web server software is running but no content has been added, yet.</p> </body></html>
options: -l, listen for an incoming connection rather than initiate a connection to a remote host
等同開socket在listen,預設是tcp。brook@vista:~$ nc -l 127.0.0.1 5000 -> server brook@vista:~$ netstat -nal | grep 5000 tcp 0 0 127.0.0.1:5000 0.0.0.0:* LISTEN brook@vista:~$ nc 127.0.0.1 5000 -> client
options: -u, Use UDP instead of the default option of TCP.
使用UDP取代預設的TCPbrook@vista:~$ nc -lu 127.0.0.1 5000 -> server brook@vista:~$ nc -u 127.0.0.1 5000 -> client
使用nc當Web Server
{ echo -ne "HTTP/1.0 200 OK\r\nContent-Length: $(wc -c < some.file)\r\n\r\n"; cat some.file; } | nc -l 5050
開啟Browser,http://127.0.0.1:5050/,就可以看到網頁了。
Works as a Port Scanner
brook@vista:~$ nc -v -z 127.0.0.1 80-200 2>&1 | grep -v failed Connection to 127.0.0.1 80 port [tcp/http] succeeded! Connection to 127.0.0.1 139 port [tcp/netbios-ssn] succeeded!
Transfering Files
sender brook@vista:~$ md5sum usb_eth.txt 2367562f85f99fe972b9d6a83ce38099 usb_eth.txt brook@vista:~$ tar cvf - usb_eth.txt | nc 127.0.0.1 5000 usb_eth.txt receiver brook@vista:/tmp$ nc -l 5000 | tar xvf - usb_eth.txt brook@vista:/tmp$ md5sum usb_eth.txt 2367562f85f99fe972b9d6a83ce38099 usb_eth.txt
Git Proxy
以下的Script是我拿用當gitproxy用的
#!/bin/bash
# http://tech-tacolin.blogspot.tw/2013/04/git-http-proxy.html
PROXY=1.2.3.4
PROXYPORT=3128
case $1 in
192.168.1.1 | internal-ip)
nc -X connect $*
;;
*)
nc -x $PROXY:$PROXYPORT -X connect $*
;;
esac
標籤:
tools - net
2014年10月19日 星期日
od - dump files in octal and other formats
od(octal dump)主要是用來將資料轉成可讀的格式(human-readable formats),預設顯示格式如同名稱,顯示8進位資料,顯示格式包含8/10/16進位,以及ASCII顯示格式。
brook@vista:~$ echo abc| od 0000000 061141 005143 0000004 brook@vista:~$ echo abc| od -o 0000000 061141 005143 0000004 brook@vista:~$ echo abc| od -d 0000000 25185 2659 0000004 jpr@jpr-Veriton-M4610:~$ echo abc| od -h 0000000 6261 0a63 0000004 brook@vista:~$ echo abc| od -c 0000000 a b c \n 0000004 brook@vista:~$ echo abc| od -b 0000000 141 142 143 012 0000004 brook@vista:~$ echo abc| od -i 0000000 174285409 0000004 jpr@jpr-Veriton-M4610:~$ echo abc| od -l 0000000 174285409 0000004 brook@vista:~$ echo abc| od -s 0000000 25185 2659 0000004 brook@vista:~$ echo abc| od -x 0000000 6261 0a63 0000004"a"的ascii值為,8/10/16進位值為97/61/141,所以有看到沒有參數和"-o"顯示一樣的內容,061141的10/16進位值為25185/H6261,看得出是一次顯示兩個byte,-b則是顯示一個byte,-h/-x一次顯示兩個byte的16進位,-d和-s一樣一次顯示兩個byte的10進位。
再來下面的例子是顯示address/offset的格式"-A",可以搭配"oxnd",o是8進位,d是10進位,d是16進位,n是不顯示address/offset。
brook@vista:~$ od -Ad sleep.sh 0000000 1647255843 1932488297 1752631912 543517801 0000016 1920213083 1562404213 1868827195 1819478282 0000032 544236901 1695091249 544172131 1701606183 0000048 824209509 660825459 1852793866 168442725 0000064 brook@vista:~$ od -Ao sleep.sh 0000000 1647255843 1932488297 1752631912 543517801 0000020 1920213083 1562404213 1868827195 1819478282 0000040 544236901 1695091249 544172131 1701606183 0000060 824209509 660825459 1852793866 168442725 0000100 brook@vista:~$ od -Ax sleep.sh 000000 1647255843 1932488297 1752631912 543517801 000010 1920213083 1562404213 1868827195 1819478282 000020 544236901 1695091249 544172131 1701606183 000030 824209509 660825459 1852793866 168442725 000040 brook@vista:~$ od -An sleep.sh 1647255843 1932488297 1752631912 543517801 1920213083 1562404213 1868827195 1819478282 544236901 1695091249 544172131 1701606183 824209509 660825459 1852793866 168442725
其餘參數包含"-N"讀幾個byte,與"-j"offset幾個byte,"-t"輸出格式顯示方式,"-t"可以搭配dfoux,後面再搭配數字,以一次幾個byte顯示。如
brook@vista:~$ od -An -N6 -t x1 sleep.sh 23 21 2f 62 69 6e brook@vista:~$ od -An -N6 -t x2 sleep.sh 2123 622f 6e69 brook@vista:~$ od -An -N6 -t x4 sleep.sh 622f2123 00006e69
我常拿od來產生random MAC,
brook@vista:~$ od -An -N6 -t x1 sleep.sh | tr ' ' ':' | cut -d':' -f2-7 23:21:2f:62:69:6e
標籤:
tools - utils
2014年7月6日 星期日
[轉載]Linux中tty、pty、pts的概念區別
轉自 http://www.wretch.cc/blog/redsonoma/14021073
基本概念:
1> tty(終端設備的統稱):
tty一詞源於Teletypes,或者teletypewriters,原來指的是電傳打字機,是通過串行線用打印機鍵盤通過閱讀和發送信息的東西,後來這東西被鍵盤與顯示器取代,所以現在叫終端比較合適。
終端是一種字符型設備,它有多種類型,通常使用tty來簡稱各種類型的終端設備。
2> pty(虛擬終端):
但是如果我們遠程telnet到主機或使用xterm時不也需要一個終端交互麼?是的,這就是虛擬終端pty(pseudo-tty)
3> pts/ptmx(pts/ptmx結合使用,進而實現pty):
pts(pseudo-terminal slave)是pty的實現方法,與ptmx(pseudo-terminal master)配合使用實現pty。
Linux終端:
在Linux系統的設備特殊文件目錄/dev/下,終端特殊設備文件一般有以下幾種:
1、串行端口終端(/dev/ttySn)
串行端口終端(Serial Port Terminal)是使用計算機串行端口連接的終端設備。計算機把每個串行端口都看作是一個字符設備。有段時間這些串行端口設備通常被稱為終端設備,因為 那時它的最大用途就是用來連接終端。這些串行端口所對應的設備名稱是/dev/tts/0(或/dev/ttyS0), /dev/tts/1(或/dev/ttyS1)等,設備號分別是(4,0), (4,1)等,分別對應於DOS系統下的COM1、COM2等。若要向一個端口發送資料,可以在命令行上把標準輸出重定向到這些特殊文件名上即可。例如, 在命令行提示符下鍵入:echo test > /dev/ttyS1會把單詞」test」發送到連接在ttyS1(COM2)端口的設備上。可接串口來實驗。
2、偽終端(/dev/pty/)
偽終端(Pseudo Terminal)是成對的邏輯終端設備(即master和slave設備, 對master的操作會反映到slave上)。
例如/dev/ptyp3和/dev/ttyp3(或者在設備文件系統中分別是/dev/pty/m3和 /dev/pty/s3)。它們與實際物理設備並不直接相關。如果一個程序把ptyp3(master設備)看作是一個串行端口設備,則它對該端口的讀/ 寫操作會反映在該邏輯終端設備對應的另一個ttyp3(slave設備)上面。而ttyp3則是另一個程序用於讀寫操作的邏輯設備。
這樣,兩個程序就可以通過這種邏輯設備進行互相交流,而其中一個使用ttyp3的程序則認為自己正在與一個串行端口進行通信。這很像是邏輯設備對之間的管 道操作。對於ttyp3(s3),任何設計成使用一個串行端口設備的程序都可以使用該邏輯設備。但對於使用ptyp3的程序,則需要專門設計來使用 ptyp3(m3)邏輯設備。
例如,如果某人在網上使用telnet程序連接到你的計算機上,則telnet程序就可能會開始連接到設備 ptyp2(m2)上(一個偽終端端口上)。此時一個getty程序就應該運行在對應的ttyp2(s2)端口上。當telnet從遠端獲取了一個字符 時,該字符就會通過m2、s2傳遞給 getty程序,而getty程序就會通過s2、m2和telnet程序往網絡上返回」login:」字符串信息。這樣,登錄程序與telnet程序就通 過「偽終端」進行通信。通過使用適當的軟件,就可以把兩個甚至多個偽終端設備連接到同一個物理串行端口上。
在使用設備文件系統 (device filesystem)之前,為了得到大量的偽終端設備特殊文件,使用了比較複雜的文件名命名方式。因為只存在16個ttyp(ttyp0—ttypf) 的設備文件,為了得到更多的邏輯設備對,就使用了象q、r、s等字符來代替p。例如,ttys8和ptys8就是一個偽終端設備對。不過這種命名方式目前 仍然在RedHat等Linux系統中使用著。
但Linux系統上的Unix98並不使用上述方法,而使用了」pty master」方式,例如/dev/ptm3。它的對應端則會被自動地創建成/dev/pts/3。這樣就可以在需要時提供一個pty偽終端。目錄 /dev/pts是一個類型為devpts的文件系統,並且可以在被加載文件系統列表中看到。雖然「文件」/dev/pts/3看上去是設備文件系統中的 一項,但其實它完全是一種不同的文件系統。
即: TELNET ---> TTYP3(S3: slave) ---> PTYP3(M3: master) ---> GETTY
=========================================================================
實驗:
1、在X下打開一個或N個終端窗口
2、#ls /dev/pt*
3、關閉這個X下的終端窗口,再次運行;比較兩次輸出信息就明白了。
在RHEL4環境下: 輸出為/dev/ptmx /dev/pts/1存在一(master)對多(slave)的情況
=========================================================================
3、控制終端(/dev/tty)
如果當前程序有控制終端(Controlling Terminal)的話,那麼/dev/tty就是當前程序的控制終端的設備特殊文件。可以使用命令」ps –ax」來查看程序與哪個控制終端相連。對於你登錄的shell,/dev/tty就是你使用的終端,設備號是(5,0)。使用命令」tty」可以查看它 具體對應哪個實際終端設備。/dev/tty有些類似於到實際所使用終端設備的一個聯接。
4、控制台終端(/dev/ttyn, /dev/console)
在Linux 系統中,計算機顯示器通常被稱為控制台終端 (Console)。它仿真了類型為Linux的一種終端(TERM=Linux),並且有一些設備特殊文件與之相關聯:tty0、tty1、tty2 等。當你在控制台上登錄時,使用的是tty1。使用Alt+[F1—F6]組合鍵時,我們就可以切換到tty2、tty3等上面去。tty1–tty6等 稱為虛擬終端,而tty0則是當前所使用虛擬終端的一個別名,系統所產生的信息會發送到該終端上(這時也叫控制台終端)。因此不管當前正在使用哪個虛擬終 端,系統信息都會發送到控制台終端上。你可以登錄到不同的虛擬終端上去,因而可以讓系統同時有幾個不同的會話期存在。只有系統或超級用戶root可以向 /dev/tty0進行寫操作 即下例:
1、# tty(查看當前TTY)
/dev/tty1
2、#echo "test tty0" > /dev/tty0
test tty0
5 虛擬終端(/dev/pts/n)
在Xwindows模式下的偽終端.
6 其它類型
Linux系統中還針對很多不同的字符設備存在有很多其它種類的終端設備特殊文件。例如針對ISDN設備的/dev/ttyIn終端設備等。這裡不再贅述。
FAQ: 終端和控制台
Q:/dev/console 是什麼?
A:/dev/console即控制台,是與操作系統交互的設備,系統將一些信息直接輸出到控制台上。目前只有在單用戶模式下,才允許用戶登錄控制台。
Q:/dev/tty是什麼?
A:tty設備包括虛擬控制台,串口以及偽終端設備。
/dev/tty代表當前tty設備,在當前的終端中輸入 echo 「hello」 > /dev/tty ,都會直接顯示在當前的終端中。
Q:/dev/ttyS*是什麼?
A:/dev/ttyS*是串行終端設備。
Q:/dev/pty*是什麼?
A:/dev/pty*即偽終端,所謂偽終端是邏輯上的終端設備,多用於模擬終端程序。例如,我們在X Window下打開的終端,以及我們在Windows使用telnet 或ssh等方式登錄Linux主機,此時均在使用pty設備(準確的說在使用pty從設備)。
Q:/dev/tty0與/dev/tty1 …/dev/tty63是什麼?它們之間有什麼區別?
A:/dev/tty0代表當前虛擬控制台,而/dev/tty1等代表第一個虛擬控制台,例如當使用ALT+F2進行切換時,系統的虛擬控制台為/dev/tty2 ,當前的控制台則指向/dev/tty2
Q:如何確定當前所在的終端(或控制台)?
A:使用tty命令可以確定當前的終端或者控制台。
Q:/dev/console是到/dev/tty0的符號鏈接嗎?
A: 目前的大多數文本中都稱/dev/console是到/dev/tty0的鏈接(包括《Linux內核原始碼情景分析》),但是這樣說是不確切的。根據內 核文檔,在2.1.71之前,/dev/console根據不同系統的設定可以鏈接到/dev/tty0或者其他tty*上,在2.1.71版本之後則完 全由內核控制。目前,只有在單用戶模式下可以登錄/dev/console(可以在單用戶模式下輸入tty命令進行確認)。
Q:/dev/tty0與/dev/fb*有什麼區別?
A: 在Framebuffer設備沒有啟用的系統中,可以使用/dev/tty0訪問顯卡。
Q:關於終端和控制台的區別可以參考哪些文本
A: 可以參考內核文檔中的 Documents/devices.txt 中關於」TERMINAL DEVICES」的章節。另外,《Linux內核原始碼情景分析》的8.7節 以及《Operating Systems : Design and Implementation》中的3.9節(第3版中為3.8節)都對終端設備的概念和歷史做了很好的介紹。另外在《Modern Operating system》中也有對終端設備的介紹,由於與《Operating Systems : Design and Implementation》的作者相同,所以文本內容也大致相同。需要注意的一點是《Operating Systems : Design and Implementation》中將終端設備分為3類,而《Modern Operating system》將終端硬體設備分為2類,差別在於前者將 X Terminal作為一個類別。
PS:
只有2410的2.6才叫ttySAC0,9200等的還是叫ttyS0
標籤:
Linux - misc
vim - statusline
status line會在vim底下有一個視窗,用以顯示狀態,透過laststatus=0關閉status line,或laststatus=2永遠開啟status line。透過statusline設定要顯示那些東西,以及如何顯示,基本上就是"%"加上修飾字(vim的document稱為item),如%F會顯示含路徑檔案名稱,%f顯示不含路徑檔案名稱,其他一般文字會被直接顯示,如set statusline=%l/%L,就會顯示"目前所在行數/全部行數",如8/50之類的字眼。而空白要用"\"escape。
有幾個特別的修飾字(item),如"*"是設定highlight group,根據group number設定前景與背景顏色,如
set statusline=%2*%F hi User2 ctermfg=3 ctermbg=0會將%F(顯示含路徑檔案名稱)顯示前景為黃色的字體。
修飾字(item)"<"則會截去過長的字串。修飾字(item)"="會把status分成左右兩部分,即靠左靠右對齊。其餘的翻翻document吧。
以下是我常用的vim設定,
set statusline=
set statusline+=%1*\[%n] "buffernr
set statusline+=%2*\ %<%F\ "File+path
set statusline+=%3*\ %=\ %{''.(&fenc!=''?&fenc:&enc).''}\ "Encoding
set statusline+=%4*\ %{(&bomb?\",BOM\":\"\")}\ "Encoding2
set statusline+=%5*\ %{&ff}\ "FileFormat (dos/unix..)
set statusline+=%6*\ row:%l/%L\ col:%03c\ (%03p%%)\ "Rownumber/total (%)
set statusline+=%0*\ \ %m%r%w\ %P\ \ "Modified? Readonly? Top/bot.
hi User2 ctermfg=3 ctermbg=0
hi User6 ctermfg=3 ctermbg=4
set laststatus=2
參考資料
- vim document - statusline, http://vimdoc.sourceforge.net/htmldoc/options.html#'statusline'
- vim document - status-line, http://vimdoc.sourceforge.net/htmldoc/windows.html#status-line
- Learn Vimscript the Hard Way, Status Lines
標籤:
tools - editor
2014年6月15日 星期日
git - push to non-bare repository
如果push到non-bare的repository,則會被reject,必須將該repository的receive.denyCurrentBranch設為ignore
brook@vista:~/x2$ git push origin HEAD Counting objects: 3, done. Delta compression using up to 4 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (2/2), 227 bytes, done. Total 2 (delta 0), reused 0 (delta 0) remote: error: refusing to update checked out branch: refs/heads/master remote: error: By default, updating the current branch in a non-bare repository remote: error: is denied, because it will make the index and work tree inconsistent remote: error: with what you pushed, and will require 'git reset --hard' to match remote: error: the work tree to HEAD. remote: error: remote: error: You can set 'receive.denyCurrentBranch' configuration variable t remote: error: 'ignore' or 'warn' in the remote repository to allow pushing int remote: error: its current branch; however, this is not recommended unless you remote: error: arranged to update its work tree to match what you pushed in some remote: error: other way. remote: error: remote: error: To squelch this message and still keep the default behaviour, see remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'. To /home/brook/x ! [remote rejected] HEAD -> master (branch is currently checked out) error: failed to push some refs to '/home/brook/x'
編輯該repoistory底下的.git/config
[receive]
denyCurrentBranch = ignore
相關文章:
git筆記
標籤:
tools - devel
2013年9月28日 星期六
RFC 5969 - IPv6 Rapid Deployment on IPv4 Infrastructures (6rd) -- Protocol Specification之筆記
Abstract
描述6rd prefix + IPv4 address的方式定址的優點,如automatic IPv6 prefix delegation to site, statless operation, simple provisioning and service等等。Introduction
6rd機制成功的被商業化,被詳細記錄在RFC 5569。6rd是基於6to4改善而來,主要差異是在IPv6 Prefix的部分,6to4是用2002::/16,6rd是SP(service provider)自訂的prefix。6to4也可以被視為是6rd的subset,因為如果6rd的prefix是2002::/16就是6to4了。Terminology
| 6rd prefix | 被SP用來給6rd domain的IPv6 prefix。SP可以布署一個以上的6rd domain。 |
| 6rd CE (Customer Edge) | 在6rd的布置中擔任CPE(Customer Premises Equipment)的角色或稱RG (Residential Gateway)。典型的CE有一個WAN site interface和一個以上的LAN interface,LAN端也稱為Customer-facing。提供IP6能力,WAN端也稱SP-facing。 |
| 6rd delegated prefix | 由CE計算給Customer site端使用的IPv6 Prefix。 |
| 6rd domain | 使用相同的virtual 6rd link的CEs和BRs的集合。SP可以有一個以上的6rd doamin。每個6rd domain必須使用不同的6rd prefix。 |
| 6rd Border Relay | 被佈署在6rd domain的edge位置。IPv4-enabled interface用於6rd的IPv6 in IPv4 tunnel端。IPv6 interface用於連接IPv6網路。 |
| BR IPv4 address | 6rd Border Relay的IPv4 address。 |
| 6rd virtual interface | encapsulation and decapsulation of IPv6 packets inside IPv4。 |
6rd Prefix Delegation
6rd delegated prefix是利用6rd prefix和CE的IPv4計算出來,用於customer site。如圖一:當IPv4 address在6rd domain可以被aggregate,如10.0.0.0/8,則不使用全部的IPv4來計算,因為前面8bit可以被aggregate,所以使用後面24bit(即o bit為24)。
6rd不限於使用public IP,但如果private address會overlap,就應該被切成不同的6rd domain(使用不同的6rd prefix, 可以確保唯一性)。
即使相同的SP,也可能使用不同的IPv4 bit數,比如10.0.0.0/8和192.168.0.1/16之間的差異就可能會使用不同的IPv4MaskLen。
6rd delegated prefix是使用IPv4計算,所以IPv4 address的變動,也會影響6rd delegated prefix,因此建議以IPv4 address的lease time當成prefix的lifetime。
6rd Configuration
6rd有四個重要的configured value:| IPv4MaskLen | ignore最高的幾個bit,比如IPv4 address range是10.0.0./8,那麼IPv4MaskLen就是8,使用後面24bit來計算6rd delegated prefix。 |
| 6rdPrefix | 6rd IPv6 prefix |
| 6rdPrefixLen | 6rd IPv6 prefix length. |
| 6rdBRIPv4Address | 6rd Border Relay的IPv4 address. |
Customer Edge Configuration
這四個configured value可透過TR-69,PPP或手動方式設定,這份RFC使用DHCP方式取得參數。
6rd DHCPv4 Option
6rdBRIPv4Address允許一個以上,不過OPTION_6RD只能限制最多只有一個6rd domain,不支援多個6rd domain。當6rd被啟動, CE會設定default route到BR,比如CE IP: 10.100.100.1/8, BR IP: 10.0.0.1, 6rdPrefix: 201:db8/32,那麼CE的routing table會是這樣:
::/0 -> 6rd-virtual-int0 via 2001:db8:0:100:: (default route)
2001:db8::/32 -> 6rd-virtual-int0 (direct connect to 6rd)
2001:db8:6464:100::/56 -> Null0 (delegated prefix null route)
2001:db8:6464:100::/64 -> Ethernet0 (LAN interface)
Border Relay Configuration
BR的位址可以利用anycast address達到loading baalancing和reliability.
IPv6 in IPv4 Encapsulation
IPv6的Traffic class field必須被複製到IPv4的Tos欄位(可以參考RFC 4213/3056/2983/3168等)。Maximum Transmission Unit
6rd的MTU應該被設成CE WAN side的MTU - 20 bytes(IPv4 header),如果IPv4 MTU是1500,那麼6rd Tunnel MTU應該被設成1500-20=1480。如果缺乏資訊,6rd MTU應該被設成1280。
Receiving Rules
為了防止spoofing攻擊,6rd的BR和CE應該根據6rd domain的參數,驗證6rd Tunnel的IPv4 address和IPv6 address的IPv4部分是否相符,不符合就drop。
IPv6 Address Space Usage
基本上就是6rd prefix length和IPv4MaskLen的取捨,如果要給user的6rd delegated prefix是 /60,而IPv4MaskLen是24(根據IPv4 aggregate的程度),那麼6rdPrefixLen就要給60-24=36。2013年9月21日 星期六
RFC 5569 - IPv6 Rapid Deployment on IPv4 Infrastructures (6rd)之筆記
Abstract
6rd是建立在6to4的機制上,提供ISP快速布建IPv6網路的機制,和6to4相似處:
statless IPv6(IPv6 prefix + IPv4 address information),並且將IPv6封裝在IPv4上在IPv4-only網路上傳送。
和6to4不同處:
6to4使用2002::/16的prefix,而6rd使用ISP給的prefix。
Introduction
描述Free這間ISP成功的使用6rd快速布建IPv6網路(5周),而且低成本,變動少。Problem Statement and Purpose of 6rd
ISP/Customer/Application之間的死結,影響IPv6布置的速度。ISP等待Customer有需求才會想布置IPv6,而客戶只有當應程式需要IPv6才會想用IPv6,應用程式卻因為沒有IPv6所以在NAT底下繼續奮鬥。
ISPs wait for customer demand before deploying IPv6; customers don't demand IPv6 as long as application vendors announce that their products work on existing infrastructures (that are IPv4 with NATs); application vendors focus their investments on NAT traversal compatibility as long as ISPs don't deploy IPv6.
Problem
6to4的routing問題,6to4的IPv6 address是由IPv4算出來的,如:ISP給你10.1.1.1,你的6to4 address就是2001:0a01:0101::,另外一個ISP也給他的client相同的IPv4 Addresss,而他也使用了6to4,routing就出問題了。這個問題的癥結點就是相同的prefix,如果由ISP各自給合法的Prefix,就沒這問題了。因為即使是NAT,各自的Prefix還是會不同,IPv6 address仍可保證唯一。
Specification
6rd relay server的IPv4 anycast address可以由ISP自行決定,通常會避免掉192.88.99.1這個6to4專用address。
圖中說明,6rd CPE會負責將IPv6的packet封裝在IPv4裡面,並且往6rd relay server傳送,之後就可以送到IPv6的Network去,反過來,目的地是ISP的IPv6 prefix就會經由6RD relay server送到6rd CPE去。
訂閱:
文章 (Atom)
熱門文章
-
轉自 http://www.wretch.cc/blog/redsonoma/14021073 基本概念: 1> tty(終端設備的統稱): tty一詞源於Teletypes,或者teletypewriters,原來指的是電傳打字機,是通過串行線用打印機鍵盤通過閱...
-
Work queue提供一個interface,讓使用者輕易的建立kernel thread並且將work綁在這個kernel thread上面,如下圖[1]所示。 由於work queue是建立一個kernel thread來執行,所以是在process context...
-
(V)將介紹file operations中的ioctl。ioctl的prototype為: int (*ioctl) (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg); ...
-
System Call在HW和user space提供一層抽象層,主要目的有: 為user space提供硬體抽象層。比如,讀取檔案時,不用管檔案所在的媒體類型與檔案儲存類型。 System call能確保系統的安全與穩定。避免user space的無意或惡意的破壞。 ...
-
這兩天電腦的word忽然都不能存檔,即便是另存新檔也不行,最後都只能放棄修改檔案,即便重新安裝過或者更新成2007也都不能存檔,最後就乖乖的google一下,原來是暫存的資料夾不存在,按照以下方式就可以解決了。 資料來源: word 2003不能存檔問題 編輯機碼的(reg...
-
在kernel中建立thread可以使用kthread_create(),建立一個task,然後在調用wake_up_process(task)讓task真正的運行,如果要kill一個kthread可以使用kthread_stop()。 在kernel中,將kthread_cr...
-
Linux module練習手札I紀錄如何撰寫一個簡單的module,並且編輯它,以及load和unload一個module。 write a module #include <linux/init.h> #include <linux/module.h...
-
幾乎任何使用 TCP,UDP或UNIX-domain socket的動作都可以用nc來達成,常見的功能如。 simple TCP proxies shell-script based HTTP clients and servers network daemon testi...
-
很多人心中都有過一個問題 What is the difference between Platform driver and normal device driver? ,簡單的來說Platform devices就non-discoverable,也就是device本身沒辦法...
-
組成元件 要能正確顯示資料,必須包含資料倉儲(Store),資料欄位的定義(ColumnModel)。 首先我們先定義資料欄位: var cm = new Ext.grid.ColumnModel({ {header: 'Name', dataIndex...

