libarms->アプリケーション
RS から受信したコンフィグをSA 固有のコンフィグ処理ルーチンへ引き渡す。 コールバックテーブルへの登録は必須。
コンフィグの分割受信を行う場合、一つのコンフィグに対して複数回呼ばれることがある。 コンフィグの妥当性判定(後述) を行う場合で、妥当ではないと判定した場合には返り値に非0 を渡すことで、SMFv2 システムにコンフィグの異常を通知できる。 コンフィグの異常はオペレータの介入により解消することが期待できるため、 ライブラリは異常検出後も(間隔の長い) リトライをおこなう。 コンフィグの妥当性判定とは、
のどちらか、または両方を想定している。コンフィグの実際の動作への反映は想定していない。 したがって、ライブラリからみてコールバック関数呼び出しの前後でSA の動作が変更された場合、以降の動作は保証できない。 利用方法としては、以下の3 種を想定している。
- ○: 実装がとても簡単
- X: コンフィグがおかしくても現地調査しないと気づかない
- X: コンフィグのサイズ分だけライブラリ内でメモリを使う
実装例:
int vendor_config_cb(uint32_t id, const char *version, arms_module_info_t *info, int action, const char *buff, size_t buff_len, int next, void *udata) { FILE *config_file; config_file = fopen(PATH_CONFIG_FILE, "w"); fwrite(buff, buff_len, 1, config_file); fclose(config_file); return 0; }
- ○: 実装がやや複雑
- ○: コンフィグがおかしい場合、RS のログにより管理者が気づく
- X: コンフィグのサイズ分だけライブラリ内でメモリを使う
実装例:
int vendor_config_cb(uint32_t id, const char *version, arms_module_info_t *info, int action const char *buff, size_t buff_len, int next, void *udata) { FILE *config_file; int error; if ( (error = validate_config(buff, buff_len)) != 0) { log("config validation failed. error = %d", error); return ERR_CODE; } config_file = fopen(PATH_CONFIG_FILE, "w"); fwrite(buff, buff_len, 1, config_file); fclose(config_file); return 0; }
- X: 実装が複雑
- ○: コンフィグがおかしい場合、RS のログやAlert で管理者が気づく
- ○: ライブラリ内でのメモリ消費をコントロール可能
本関数は、RSとの通信に失敗した場合も呼ばれる場合がある。 これは、コンフィグ情報を取得後にもプロトコルエラーが発生する可能性があるためである。 したがって、起動処理が成功したかどうかの判定は、本関数により適切なコンフィグが得られたかどうか、および arms_pull() の返り値が成功を示しているかどうかの2 点により判断しなければならない。 分割受信処理を利用する場合、コンフィグ情報の受信中にエラーが発生する可能性があるため、コンフィグ受信中のエラーへの対処が必要となる。 この場合、エラー発生時には本関数にFINISH フラグの付いたコンフィグブロックが渡され、 arms_pull() はリトライ処理をおこなうか、エラーを返す。 リトライ処理の場合、再度本関数が呼び出される。 したがって、本関数が複数回呼び出された場合、コンフィグ受信中にエラーが発生したものとして処理する必要がある。
モジュールID。ID 自体はSA の機種ごとに定義される。 SA 内で複数モジュールを用いてコンフィグを扱う場合に利用する。
モジュールIDの指定はRS が行う。複数のコンフィグをRSから受信する こともある。この場合、コンフィグの数だけコールバックが行われる。
コンフィグ適用バージョンを識別する情報文字列。値はSA の機種およびコンフィグ 種別ごとに自由に定義してよい。
SA 内でコンフィグのバージョンを識別する必要がある場合に利用する。
コンフィグ適用バージョンの指定はRS が行う。
コンフィグ受信に関する動作種別を示す値。次のいずれかとなる。
ノート
このAPIはVer1.00で追加された。