1 onps棧移植說明——onps棧的配置及裁剪( 二 )

協議棧的內存管理單元采用了buddy伙伴算法 。上述三個宏的關系參見BUDDY_MEM_SIZE宏的注釋 。前面說過,mmu管理的內存用于協議棧的不同業務情形,其中最核心的一種業務情形就是socket,用戶分配的內存大小直接決定了用戶編寫網絡應用時能夠申請的socket數量 。如果你在申請分配一個新的socket時報ERRREQMEMTOOLARGE(The requested memory is too large, please refer to the macro definition BUDDY_MEM_SIZE)或ERRNOFREEMEM(The mmu has no memory available)錯誤,則意味著內存已經不夠用了,需要你增加內存或者檢視你的代碼看是否存在未及時釋放的socket句柄 。另外,決定內存利用效率的關鍵配置項是BUDDY_PAGE_SIZE宏,因為mmu分配內存的最小單位就是“頁” 。這個宏設置單個內存頁的大小 , 單位為字節 , 其值必須是2的整數次冪 。如果你的通訊報文不大,建議把頁面大小調整的小一些,比如16字節、32字節等,以盡量減少單個頁面的空余字節數 。
sys_config.h文件的其余宏均為協議層相關的配置項 。這其中有幾個與底層網絡接口相關的配置項需要特別關注:
#define SUPPORT_PPP 1 //* 是否支持ppp模塊:1,支持;0 , 不支持,如果選擇支持,則系統會將ppp模塊代碼加入到協議棧中#if SUPPORT_PPP#define APN_DEFAULT"4gnet"http://* 根據實際情況在這里設置缺省APN#define AUTH_USER_DEFAULT"card"http://* ppp認證缺省用戶名#define AUTH_PASSWORD_DEFAULT "any_char" //* ppp認證缺省口令#define PPP_NETLINK_NUM1 //* 協議棧加載幾路ppp鏈路(系統存在幾個modem這里就指定幾就行)#define SUPPORT_ECHO1 //* 對端是否支持echo鏈路探測#define WAIT_ACK_TIMEOUT_NUM 5 //* 在這里指定連續幾次接收不到對端的應答報文就進入協議棧故障處理流程(STACKFAULT),這意味著當前鏈路已經因嚴重故障終止了#else#define PPP_NETLINK_NUM 0#endif#define SUPPORT_ETHERNET 1 //* 是否支持ethernet:1,支持;0,不支持#if SUPPORT_ETHERNET#define ETHERNET_NUM 1//* 要添加幾個ethernet網卡(實際存在幾個就添加幾個)#define ARPENTRY_NUM 32 //* arp條目緩存表的大小,只要不小于局域網內目標通訊節點的個數即可確保arp尋址次數為1,否則就會出現頻繁尋址的可能 , 當然這也不會妨礙正常通訊邏輯,只不過這會降低通訊效率#else#define ETHERNET_NUM 0#endif如果目標系統需要用到ppp撥號,我們在打開協議棧對ppp模塊的支持后還需要設置缺省的撥號參數值,比如apn、撥號賬號及密碼等 。當然你也可以不用設置,后面我們在編寫os適配層接口的時候也會設置這幾項 。系統會使用os適配層的設置值代替缺省值 。另外協議棧在設計之初即考慮支持多路ppp同時撥號的情形,目標系統支持幾路ppp , 宏PPP_NETLINK_NUM值置幾即可 。SUPPORT_ECHO宏指定ppp鏈路是否啟用echo回顯探測功能 。某些ppp接入服務商可能會關閉此項功能 , 如果你不確定,建議缺省情況下關閉此功能 。因為echo鏈路探測功能一旦被啟用,協議棧會每隔一小段時間發送探測報文到對端 。對端如果不支持此功能會丟棄該探測報文不做任何響應,這將導致協議棧判定ppp鏈路故障,從而主動結束鏈路、重新撥號 。
協議棧同樣支持多路ethernet網卡,ETHERNET_NUM宏用于指定目標系統存在幾路ethernet網卡 。這里需要特別注意的是ARPENTRY_NUM宏,這個宏用于指定ethernet網絡環境下進行通訊時mac地址緩存表的大小 。如果緩存表過小,進行通訊的目標地址并不在緩存表中時,協議棧會先發送arp查詢報文 , 得到對端的mac地址后才會發送實際的通訊報文 。雖然這一切都是協議棧自動進行的 , 但通訊效率會受到影響 。如果目標系統的內存夠用,建議放大緩存表的容量,最合理的大小是等于計劃通訊的目標地址的數量 。
其余協議層相關的配置項均屬于ip及其支持的上層協議:
//* ip支持的上層協議相關配置項//* ===============================================================================================#define SUPPORT_IPV6 0 //* 是否支持IPv6:1,支持;0,不支持#define SUPPORT_SACK 0//* 系統是否支持sack項,sack項需要協議棧建立發送隊列,這個非常消耗內存,通用版本不支持該項#define ICMPRCVBUF_SIZE_DEFAULT 128//* icmp發送echo請求報文時指定的接收緩沖區的缺省大?。?注意 , 如果要發送較大的ping包就必須指定較大的接收緩沖區#define TCPRCVBUF_SIZE_DEFAULT2048//* tcp層缺省的接收緩沖區大小,大小應是2^n次冪才能最大限度不浪費budyy模塊分配的內存#define TCPUDP_PORT_START20000 //* TCP/UDP協議動態分配的起始端口號#define TCP_WINDOW_SCALE0//* 窗口擴大因子缺省值#define TCP_CONN_TIMEOUT30//* 缺省TCP連接超時時間#define TCP_ACK_TIMEOUT3//* 缺省TCP應答超時時間#define TCP_MSL15//* 指定TCP鏈路TIMEWAIT態的最大關閉時長:2 * TCP_MSL,單位:秒#define TCP_LINK_NUM_MAX16//* 系統支持最多建立多少路TCP鏈路(涵蓋所有TCP客戶端 + TCP服務器的并發連接數),超過這個數量將無法建立新的tcp鏈路#if SUPPORT_ETHERNET#define TCPSRV_BACKLOG_NUM_MAX 10 //* tcp服務器支持的最大請求隊列數量,任意時刻所有已開啟的tcp服務器的請求連接隊列數量之和應小于該值,否則將會出現拒絕連接的情況#define TCPSRV_NUM_MAX2//* 系統能夠同時建立的tcp服務器數量#define TCPSRV_RECV_QUEUE_NUM64 //* tcp服務器接收隊列大?。?所有已開啟的tcp服務器共享該隊列資源,如果單位時間內到達所有已開啟tcp服務器的報文數量較大,應將該值調大#endif#define UDP_LINK_NUM_MAX 4//* 調用connect()函數連接對端udp服務器的最大數量(一旦調用connect()函數,收到的非服務器報文將被直接丟棄)#define SOCKET_NUM_MAX16 //* 系統支持的最大SOCKET數量,如實際應用中超過這個數量則會導致用戶層業務邏輯無法全部正常運行(icmp/tcp/udp業務均受此影響) , 其值應大于等于TCP_LINK_NUM_MAX值#define IP_TTL_DEFAULT64 //* 缺省TTL值#define ROUTE_ITEM_NUM8//* 系統路由表數量//* ===============================================================================================

推薦閱讀