grpc_error *grpc_chttp2_ping_parser_parse(grpc_exec_ctx *exec_ctx, void *parser, grpc_chttp2_transport *t, grpc_chttp2_stream *s, gpr_slice slice, int is_last) { uint8_t *const beg = GPR_SLICE_START_PTR(slice); uint8_t *const end = GPR_SLICE_END_PTR(slice); uint8_t *cur = beg; grpc_chttp2_ping_parser *p = parser; while (p->byte != 8 && cur != end) { p->opaque_8bytes[p->byte] = *cur; cur++; p->byte++; } if (p->byte == 8) { GPR_ASSERT(is_last); if (p->is_ack) { grpc_chttp2_ack_ping(exec_ctx, t, p->opaque_8bytes); } else { gpr_slice_buffer_add(&t->qbuf, grpc_chttp2_ping_create(1, p->opaque_8bytes)); grpc_chttp2_initiate_write(exec_ctx, t, false, "ping response"); } } return GRPC_ERROR_NONE; }
grpc_chttp2_parse_error grpc_chttp2_ping_parser_parse( grpc_exec_ctx *exec_ctx, void *parser, grpc_chttp2_transport_parsing *transport_parsing, grpc_chttp2_stream_parsing *stream_parsing, gpr_slice slice, int is_last) { uint8_t *const beg = GPR_SLICE_START_PTR(slice); uint8_t *const end = GPR_SLICE_END_PTR(slice); uint8_t *cur = beg; grpc_chttp2_ping_parser *p = parser; while (p->byte != 8 && cur != end) { p->opaque_8bytes[p->byte] = *cur; cur++; p->byte++; } if (p->byte == 8) { GPR_ASSERT(is_last); if (p->is_ack) { grpc_chttp2_ack_ping(exec_ctx, transport_parsing, p->opaque_8bytes); } else { gpr_slice_buffer_add(&transport_parsing->qbuf, grpc_chttp2_ping_create(1, p->opaque_8bytes)); } } return GRPC_CHTTP2_PARSE_OK; }
static void send_ping_locked(grpc_chttp2_transport *t, grpc_closure *on_recv) { grpc_chttp2_outstanding_ping *p = gpr_malloc(sizeof(*p)); p->next = &t->global.pings; p->prev = p->next->prev; p->prev->next = p->next->prev = p; p->id[0] = (gpr_uint8)((t->global.ping_counter >> 56) & 0xff); p->id[1] = (gpr_uint8)((t->global.ping_counter >> 48) & 0xff); p->id[2] = (gpr_uint8)((t->global.ping_counter >> 40) & 0xff); p->id[3] = (gpr_uint8)((t->global.ping_counter >> 32) & 0xff); p->id[4] = (gpr_uint8)((t->global.ping_counter >> 24) & 0xff); p->id[5] = (gpr_uint8)((t->global.ping_counter >> 16) & 0xff); p->id[6] = (gpr_uint8)((t->global.ping_counter >> 8) & 0xff); p->id[7] = (gpr_uint8)(t->global.ping_counter & 0xff); p->on_recv = on_recv; gpr_slice_buffer_add(&t->global.qbuf, grpc_chttp2_ping_create(0, p->id)); }