picoTCP実装のメインループを読んでみました。
picoTCPはAltran Intelligent Systemsが開発しているTCP/IPプロトコルスタックです。
ライセンスは、独自ライセンスとGPL2のdual licenseです。
ソースコード
picoTCPのメインループ
- stack/pico_stack.c にメインループがあります。
pico_stack.c
void pico_stack_loop(void)
{
while(1) {
pico_stack_tick();
PICO_IDLE();
}
}
- 上記だけだと、あんまりなので、pico_stack_tick() の中身を見てみました。
- pico_stack_tick()では、ラウンドロビンで各プロトコルの処理をしています。
- 各レイヤーを順番に処理しています。
- 物理層の受信
- データリンク層の受信
- ネットワーク層の受信
- トランスポート層の受信
- ソケット処理
- ソケットの受信
- ソケットの送信
- ネットワーク層の送信
- データリンク層の送信
- 物理層の送信
- ラウンドロビンのパラメータ更新してます。
pico_stack.c
void pico_stack_tick(void)
{
static int score[PROTO_DEF_NR] = {
PROTO_DEF_SCORE, PROTO_DEF_SCORE, PROTO_DEF_SCORE, PROTO_DEF_SCORE, PROTO_DEF_SCORE, PROTO_DEF_SCORE, PROTO_DEF_SCORE, PROTO_DEF_SCORE, PROTO_DEF_SCORE, PROTO_DEF_SCORE, PROTO_DEF_SCORE
};
static int index[PROTO_DEF_NR] = {
0, 0, 0, 0, 0, 0
};
static int avg[PROTO_DEF_NR][PROTO_DEF_AVG_NR];
static int ret[PROTO_DEF_NR] = {
0
};
pico_check_timers();
/* dbg("LOOP_SCORES> %3d - %3d - %3d - %3d - %3d - %3d - %3d - %3d - %3d - %3d - %3d\n",score[0],score[1],score[2],score[3],score[4],score[5],score[6],score[7],score[8],score[9],score[10]); */
/* score = pico_protocols_loop(100); */
ret[0] = pico_devices_loop(score[0], PICO_LOOP_DIR_IN);
pico_rand_feed((uint32_t)ret[0]);
ret[1] = pico_protocol_datalink_loop(score[1], PICO_LOOP_DIR_IN);
pico_rand_feed((uint32_t)ret[1]);
ret[2] = pico_protocol_network_loop(score[2], PICO_LOOP_DIR_IN);
pico_rand_feed((uint32_t)ret[2]);
ret[3] = pico_protocol_transport_loop(score[3], PICO_LOOP_DIR_IN);
pico_rand_feed((uint32_t)ret[3]);
ret[5] = score[5];
# if defined (PICO_SUPPORT_IPV4) || defined (PICO_SUPPORT_IPV6)
# if defined (PICO_SUPPORT_TCP) || defined (PICO_SUPPORT_UDP)
ret[5] = pico_sockets_loop(score[5]); /* swapped */
pico_rand_feed((uint32_t)ret[5]);
# endif
# endif
ret[4] = pico_protocol_socket_loop(score[4], PICO_LOOP_DIR_IN);
pico_rand_feed((uint32_t)ret[4]);
ret[6] = pico_protocol_socket_loop(score[6], PICO_LOOP_DIR_OUT);
pico_rand_feed((uint32_t)ret[6]);
ret[7] = pico_protocol_transport_loop(score[7], PICO_LOOP_DIR_OUT);
pico_rand_feed((uint32_t)ret[7]);
ret[8] = pico_protocol_network_loop(score[8], PICO_LOOP_DIR_OUT);
pico_rand_feed((uint32_t)ret[8]);
ret[9] = pico_protocol_datalink_loop(score[9], PICO_LOOP_DIR_OUT);
pico_rand_feed((uint32_t)ret[9]);
ret[10] = pico_devices_loop(score[10], PICO_LOOP_DIR_OUT);
pico_rand_feed((uint32_t)ret[10]);
/* calculate new loop scores for next iteration */
calc_score(score, index, (int (*)[])avg, ret);
}