这里阐述channel收到RELAY* cell后的处理过程。主机身份是user或者是OR
command_process_relay_cell():
channel收到RELAY cell,调取command_process_relay_cell()函数。
step 1: 调用circuitlist.c的circuit_get_by_circid_channel()函数,获取RELAY cell的circuit,并确认cell direction(CELL_DIRECTION_IN or CELL_DIRECTION_OUT)。
step 2: 调用relay.c的circuit_receive_relay_cell()函数,在circuit层处理cell。
circuit_receive_relay_cell():
step 1: 调用relay_crypto.c的relay_decrypt_cell()函数, 下面具体介绍这个函数处理过程。
step 1: 当cell direction是OUT时,调用relay_crypto.c的relay_crypt_one_payload()函数,对RELAY cell的payload进行解密。
step 2: 调用relay_header_unpack()函数,获取relay header的recognized变量值。(0代表发送的这个node的RELAY cell)