int SinglePacketBuffer_Init (SinglePacketBuffer *o, PacketRecvInterface *input, PacketPassInterface *output, BPendingGroup *pg) { ASSERT(PacketPassInterface_GetMTU(output) >= PacketRecvInterface_GetMTU(input)) // init arguments o->input = input; o->output = output; // init input PacketRecvInterface_Receiver_Init(o->input, (PacketRecvInterface_handler_done)input_handler_done, o); // init output PacketPassInterface_Sender_Init(o->output, (PacketPassInterface_handler_done)output_handler_done, o); // init buffer if (!(o->buf = BAlloc(PacketRecvInterface_GetMTU(o->input)))) { goto fail1; } // schedule receive PacketRecvInterface_Receiver_Recv(o->input, o->buf); DebugObject_Init(&o->d_obj); return 1; fail1: return 0; }
void init_control_io (BSocksClient *o) { // init receiving BConnection_RecvAsync_Init(&o->con); o->control.recv_if = BConnection_RecvAsync_GetIf(&o->con); StreamRecvInterface_Receiver_Init(o->control.recv_if, (StreamRecvInterface_handler_done)recv_handler_done, o); // init sending BConnection_SendAsync_Init(&o->con); PacketStreamSender_Init(&o->control.send_sender, BConnection_SendAsync_GetIf(&o->con), INT_MAX, BReactor_PendingGroup(o->reactor)); o->control.send_if = PacketStreamSender_GetInput(&o->control.send_sender); PacketPassInterface_Sender_Init(o->control.send_if, (PacketPassInterface_handler_done)send_handler_done, o); }
int PacketBuffer_Init (PacketBuffer *buf, PacketRecvInterface *input, PacketPassInterface *output, int num_packets, BPendingGroup *pg) { ASSERT(PacketPassInterface_GetMTU(output) >= PacketRecvInterface_GetMTU(input)) ASSERT(num_packets > 0) // init arguments buf->input = input; buf->output = output; // init input PacketRecvInterface_Receiver_Init(buf->input, (PacketRecvInterface_handler_done)input_handler_done, buf); // set input MTU buf->input_mtu = PacketRecvInterface_GetMTU(buf->input); // init output PacketPassInterface_Sender_Init(buf->output, (PacketPassInterface_handler_done)output_handler_done, buf); // allocate buffer int num_blocks = ChunkBuffer2_calc_blocks(buf->input_mtu, num_packets); if (num_blocks < 0) { goto fail0; } if (!(buf->buf_data = BAllocArray(num_blocks, sizeof(buf->buf_data[0])))) { goto fail0; } // init buffer ChunkBuffer2_Init(&buf->buf, buf->buf_data, num_blocks, buf->input_mtu); // schedule receive PacketRecvInterface_Receiver_Recv(buf->input, buf->buf.input_dest); DebugObject_Init(&buf->d_obj); return 1; fail0: return 0; }
int PacketProtoDecoder_Init (PacketProtoDecoder *enc, StreamRecvInterface *input, PacketPassInterface *output, BPendingGroup *pg, void *user, PacketProtoDecoder_handler_error handler_error) { // init arguments enc->input = input; enc->output = output; enc->user = user; enc->handler_error = handler_error; // init input StreamRecvInterface_Receiver_Init(enc->input, (StreamRecvInterface_handler_done)input_handler_done, enc); // init output PacketPassInterface_Sender_Init(enc->output, (PacketPassInterface_handler_done)output_handler_done, enc); // set output MTU, limit by maximum payload size enc->output_mtu = bmin_int(PacketPassInterface_GetMTU(enc->output), PACKETPROTO_MAXPAYLOAD); // init buffer state enc->buf_size = PACKETPROTO_ENCLEN(enc->output_mtu); enc->buf_start = 0; enc->buf_used = 0; // allocate buffer if (!(enc->buf = (uint8_t *)malloc(enc->buf_size))) { goto fail0; } // start receiving StreamRecvInterface_Receiver_Recv(enc->input, enc->buf, enc->buf_size); DebugObject_Init(&enc->d_obj); return 1; fail0: return 0; }
void PacketPassFifoQueue_Init (PacketPassFifoQueue *o, PacketPassInterface *output, BPendingGroup *pg) { // init arguments o->output = output; o->pg = pg; // init output PacketPassInterface_Sender_Init(output, (PacketPassInterface_handler_done)output_handler_done, o); // init waiting flows list LinkedList1_Init(&o->waiting_flows_list); // set no sending flow o->sending_flow = NULL; // init schedule job BPending_Init(&o->schedule_job, pg, (BPending_handler)schedule_job_handler, o); // set not freeing o->freeing = 0; DebugCounter_Init(&o->d_flows_ctr); DebugObject_Init(&o->d_obj); }
int BArpProbe_Init (BArpProbe *o, const char *ifname, uint32_t addr, BReactor *reactor, void *user, BArpProbe_handler handler) { ASSERT(ifname) ASSERT(handler) // init arguments o->addr = addr; o->reactor = reactor; o->user = user; o->handler = handler; // get interface information int if_mtu; int if_index; if (!badvpn_get_iface_info(ifname, o->if_mac, &if_mtu, &if_index)) { BLog(BLOG_ERROR, "failed to get interface information"); goto fail0; } uint8_t *if_mac = o->if_mac; BLog(BLOG_INFO, "if_mac=%02"PRIx8":%02"PRIx8":%02"PRIx8":%02"PRIx8":%02"PRIx8":%02"PRIx8" if_mtu=%d if_index=%d", if_mac[0], if_mac[1], if_mac[2], if_mac[3], if_mac[4], if_mac[5], if_mtu, if_index); // check MTU if (if_mtu < sizeof(struct arp_packet)) { BLog(BLOG_ERROR, "MTU is too small for ARP !?!"); goto fail0; } // init dgram if (!BDatagram_Init(&o->dgram, BADDR_TYPE_PACKET, o->reactor, o, (BDatagram_handler)dgram_handler)) { BLog(BLOG_ERROR, "BDatagram_Init failed"); goto fail0; } // bind dgram BAddr bind_addr; BAddr_InitPacket(&bind_addr, hton16(ETHERTYPE_ARP), if_index, BADDR_PACKET_HEADER_TYPE_ETHERNET, BADDR_PACKET_PACKET_TYPE_HOST, if_mac); if (!BDatagram_Bind(&o->dgram, bind_addr)) { BLog(BLOG_ERROR, "BDatagram_Bind failed"); goto fail1; } // set dgram send addresses BAddr dest_addr; uint8_t broadcast_mac[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; BAddr_InitPacket(&dest_addr, hton16(ETHERTYPE_ARP), if_index, BADDR_PACKET_HEADER_TYPE_ETHERNET, BADDR_PACKET_PACKET_TYPE_BROADCAST, broadcast_mac); BIPAddr local_addr; BIPAddr_InitInvalid(&local_addr); BDatagram_SetSendAddrs(&o->dgram, dest_addr, local_addr); // init send interface BDatagram_SendAsync_Init(&o->dgram, sizeof(struct arp_packet)); o->send_if = BDatagram_SendAsync_GetIf(&o->dgram); PacketPassInterface_Sender_Init(o->send_if, (PacketPassInterface_handler_done)send_if_handler_done, o); // set not sending o->send_sending = 0; // init recv interface BDatagram_RecvAsync_Init(&o->dgram, sizeof(struct arp_packet)); o->recv_if = BDatagram_RecvAsync_GetIf(&o->dgram); PacketRecvInterface_Receiver_Init(o->recv_if, (PacketRecvInterface_handler_done)recv_if_handler_done, o); // init timer BTimer_Init(&o->timer, 0, (BTimer_handler)timer_handler, o); // receive first packet PacketRecvInterface_Receiver_Recv(o->recv_if, (uint8_t *)&o->recv_packet); // send request send_request(o); // set timer BReactor_SetTimerAfter(o->reactor, &o->timer, BARPPROBE_INITIAL_WAITRECV); // set zero missed o->num_missed = 0; // set state initial o->state = STATE_INITIAL; DebugError_Init(&o->d_err, BReactor_PendingGroup(o->reactor)); DebugObject_Init(&o->d_obj); return 1; fail1: BDatagram_Free(&o->dgram); fail0: return 0; }