いっぴきこあらの大冒険

ロードバイクで鄙びた集落を巡るブログ

【AUTOSAR】SOME/IP Service Discovery Protocol Specification(R22-11)を読んでみる

ちょっと気になったところから...個人的に何回かざっと読んだことがあり、巷にもSOMEIPの解説はあるので、ara::comの時より飛ばし気味で気になったところだけ

5.1.2.5 Service Entries

Find Service Entry

[PRS_SOMEIPSD_00350]
  • FindServiceメッセージはサービスインスタンスを探すために使用される
  • 現在のサービス状態が不明、つまり有効なOfferServiceを受信していない場合のみ送信される
    • かなり重要な一文と思う。FindServiceが出ません!みたいなことがあるけど、これはもうOfferを受信していたからという...

 

[PRS_SOMEIPSD_00351]
  • FindServeiceのフィールド設定について
    • これはパケットを見よう
[PRS_SOMEIPSD_00528]・[PRS_SOMEIPSD_00529] 
  • FindServiceにはIP EndPointOptionを含めないし、含んでいた場合も無視する
[PRS_SOMEIPSD_00839]
  • サーバ側が Initial Wait Phaseの場合受信したFindServiceは無視する 
    • Initial Wait Phaseについてはこの後解説があるはず

Offer Service Entry

[PRS_SOMEIPSD_00355]〜[PRS_SOMEIPSD_00827]
  • ara::com仕様書で書かれていたものと同様なので飛ばす
  • OfferServiceにはIPEndPointOptionが含まれる
    • UDPの場合、クライアントはこのIPに向けてSubscribeを出す
  • OfferServiceのTTLを0xFFFFFFにすると再起動されるまで有効となる。一方0x000000にするとStopOfferServiceとなる

5.1.2.6 Endpoint Handling for Services and Events

[PRS_SOMEIPSD_00476]
  • EndPointが静的にManifestに定義されていたとしても、実際にOfferServiceで送られてきたEndPointが異なった場合は上書きする
[PRS_SOMEIPSD_00360]
  • OfferServiceに含まれるEndPointからEventは送信される。かつ、クライアントはメソッドのReqを送る
[PRS_SOMEIPSD_00361]
  • EndPointがUDPの場合、そのままSOME/IP通信に使われる
[PRS_SOMEIPSD_00362]
  • TCPの場合、クライアントは3ウェイハンドシェイクをする
[PRS_SOMEIPSD_00801]
  • サービスはUDPTCPの両方を同時に使用できる
    • EventはUDP、MethodはTCPとか
[PRS_SOMEIPSD_00802]
  • どのメッセージでUDP or TCPを使うかは明示的に設定する必要がある
    • ManifestにEvent、Methodごとに記載する必要がある

....

[PRS_SOMEIPSD_00481]
  • ServiceInstanceを分ける場合は、Endpointを分けることで識別する必要

Eventgroup Endpoints

[PRS_SOMEIPSD_00484]

  • Subscribe Eventgroup メッセージに含まれるEndPointへサーバはイベントを送信する
  • EventをTCPで送信する場合は、クライアントがSubscribe Eventgroup メッセージ送信前にTCPコネクションを貼り、このコネクション上でEventを送信する

[PRS_SOMEIPSD_00487]

  • 初期イベントは必ずunicastで送られる必要がある
    • Initial Eventってなんだ?

[PRS_SOMEIPSD_00488]

  • Subscribe Eventgroup Ackには最大1つのMulticastIPを含む必要がある

    • EventをMulticastで送る設定した場合に使用するMulticastIPのこと

サービスディスカバリからイベント・メソッドを送るまでの流れがわかりやすく書かれている:

5.1.3 Service Discovery Messages

[PRS_SOMEIPSD_00600]

  • すべてのSDメッセージはSD_PORT(=30490)へ送られる

[PRS_SOMEIPSD_00601]

  • SD_PORTはunicastでもMulticastでも送信元ポートとして使われる

[PRS_SOMEIPSD_00603]

  • すべてのSDメッセージはSD_MULTICAST_IPへ送られる

5.1.3.1 Eventgroup Entry

Subscribe Eventgroup Entry

Stop Subscribe Eventgroup Entry

Subscribe Eventgroup Acknowledgement (Subscribe Eventgroup Ack) Entry

Subscribe Eventgroup Negative Acknowledgement (Subscribe Eventgroup
Nack) Entry

[PRS_SOMEIPSD_00566]
  • Subscribe Eventgroup Nackは必要なTCPコネクションが存在しない場合も送られる
[PRS_SOMEIPSD_00527]
  • TCPコネクションが必要な SubscribeEventgroupについてNACKが帰ってきた場合はクライアントはTCPコネクションを再チェックして、TCPコネクションを貼り直す
    • NACKを受け取るとTCPコネクションが切れることになる

5.1.4 Service Discovery Communication Behavior

[PRS_SOMEIPSD_00800]
  • SDのメッセージをなるべく減らすため、メッセージはなるべくまとめて送るべき
  • OfferやSubscribeEventgroupAck を同じメッセージに含めて送信できる

5.1.4.1 Startup Behavior

[PRS_SOMEIPSD_00395]
  • SDにおいて各インスタンスは少なくとも以下3つの状態を実装する
    • Initial Wait Phase
    • Repetition Phase
    • Main Phase
[PRS_SOMEIPSD_00397]
  • クライアントサービスのインスタンスは以下の条件を満たした時、Initial Wait Phaseに入る
    • 対応するインターフェースのリンクが Up 状態

       

    • アプリケーションからそのクライアントサービスが要求された

[PRS_SOMEIPSD_00133]
  • サーバサービスのインスタンスは以下の条件を満たした時、Initial Wait Phaseに入る
    • 対応するインターフェースのリンクが Up 状態

    • サーバのサービスが提供可能になった
[PRS_SOMEIPSD_00399]
  • Initial Wait Phase に入った後、INITIAL_DELAYの時間だけ待機してから、SDメッセージを送信する
[PRS_SOMEIPSD_00400]・[PRS_SOMEIPSD_00401]
  • INITIAL_DELAYは最大値と最小値の範囲で記載され、その範囲からランダムの値を取る
    • ネットワーク負荷を下げるため
[PRS_SOMEIPSD_00404]
  • 初回のSDメッセージを送信したら、Repetition Phaseに移行する
[PRS_SOMEIPSD_00405] 
  • Repetition Phaseでの待機時間はREPETITIONS_BASE_DELAYに基づく
[PRS_SOMEIPSD_00406]
  • Repetition Phaseではメッセージ送信のたびに待機時間が倍増
[PRS_SOMEIPSD_00407]
  • メッセージはREPETITIONS_MAXの回数まで送信可能
[PRS_SOMEIPSD_00408]
  • クライアントはOfferエントリを受信したらMain Phaseへ遷移し、Findメッセージを送信しない
[PRS_SOMEIPSD_00409]
  • REPETITIONS_MAX = 0と設定した場合、Repetition Phaseはスキップされ、Main Phaseへ
[PRS_SOMEIPSD_00410]
  • Repetition Phaseの後、Main Phaseに入る
[PRS_SOMEIPSD_00411]
  • Main Phaseへ遷移後、CYCLIC_OFFER_DELAYだけ待機して最初のOfferエントリを送信する
[PRS_SOMEIPSD_00412]
  • CYCLIC_OFFER_DELAYが設定されている場合は、 Main PhaseでOfferを周期的に送信する
[PRS_SOMEIPSD_00413]
  • Offerメッセージを送信したら次のメッセージ送信までCYCLIC_OFFER_DELAYだけ待つ必要がある
[PRS_SOMEIPSD_00415]
  • Main PhaseでのFindメッセージの周期的送信は禁止されている
[PRS_SOMEIPSD_00582]
  • Subscribe EventGroupメッセージは周期的に送信されるOfferメッセージによってトリガーされる

    • これは毎回のOfferに対してSubscribeを送れということではないっぽい

5.1.4.2 Server Answer Behavior

[PRS_SOMEIPSD_00417]
  • 以下の場合でREQUEST_RESPONSE_DELAYにもとづく遅延を入れる必要がある
    • Find(Multicats)受信からOffer送信まで
    • Offer(Multicats)受信からSubscribe送信まで
[PRS_SOMEIPSD_00419]
  • ユニキャストのメッセージにユニキャストで応答する場合は遅延の対象外
[PRS_SOMEIPSD_00422]
  • 基本的な設計としては、FindServiceへの嘔吐は全てユニキャストでOffer Serviceを返答するべき
[PRS_SOMEIPSD_00423]
  • 最適化のため、以下の振る舞いがサポートされる
    • Unicast Flag = 1のFindメッセージを Main Phase で受信。かつ最後の Offer 送信から CYCLIC_OFFER_DELAY の半分より短い時間であれば、ユニキャストで応答してよい

    • CYCLIC_OFFER_DELAYの半分以上であればMulticastで応答しても良い

[PRS_SOMEIPSD_00811]

  • 純粋なイベントメッセージに対して初期値を要求してはいけない