static void func_new (void *vo, NCDModuleInst *i, const struct NCDModuleInst_new_params *params) { struct instance *o = vo; o->i = i; // check arguments NCDValRef ms_start_arg; NCDValRef ms_stop_arg = NCDVal_NewInvalid(); if (!NCDVal_ListRead(params->args, 1, &ms_start_arg) && !NCDVal_ListRead(params->args, 2, &ms_start_arg, &ms_stop_arg)) { ModuleLog(o->i, BLOG_ERROR, "wrong arity"); goto fail0; } uintmax_t ms; btime_t ms_start; if (NCDVal_IsString(ms_start_arg) && NCDVal_StringEqualsId(ms_start_arg, NCD_STRING_EMPTY)) { ms_start = -1; } else { if (!ncd_read_uintmax(ms_start_arg, &ms) || ms > INT64_MAX) { ModuleLog(o->i, BLOG_ERROR, "wrong start time"); goto fail0; } ms_start = ms; } if (NCDVal_IsInvalid(ms_stop_arg) || (NCDVal_IsString(ms_stop_arg) && NCDVal_StringEqualsId(ms_stop_arg, NCD_STRING_EMPTY))) { o->ms_stop = -1; } else { if (!ncd_read_uintmax(ms_stop_arg, &ms) || ms > INT64_MAX) { ModuleLog(o->i, BLOG_ERROR, "wrong stop time"); goto fail0; } o->ms_stop = ms; } // init timer BTimer_Init(&o->timer, 0, timer_handler, o); // set not dying o->dying = 0; if (ms_start < 0) { // go up NCDModuleInst_Backend_Up(i); } else { // set timer BReactor_SetTimerAfter(o->i->params->iparams->reactor, &o->timer, ms_start); } return; fail0: NCDModuleInst_Backend_DeadError(i); }
static void func_new (NCDModuleInst *i) { // allocate instance struct instance *o = malloc(sizeof(*o)); if (!o) { ModuleLog(i, BLOG_ERROR, "failed to allocate instance"); goto fail0; } NCDModuleInst_Backend_SetUser(i, o); // init arguments o->i = i; // read arguments NCDValue *ifname_arg; NCDValue *user_arg; NCDValue *exec_arg; NCDValue *args_arg; if (!NCDValue_ListRead(o->i->args, 4, &ifname_arg, &user_arg, &exec_arg, &args_arg)) { ModuleLog(o->i, BLOG_ERROR, "wrong arity"); goto fail1; } if (NCDValue_Type(ifname_arg) != NCDVALUE_STRING || NCDValue_Type(user_arg) != NCDVALUE_STRING || NCDValue_Type(exec_arg) != NCDVALUE_STRING || NCDValue_Type(args_arg) != NCDVALUE_LIST) { ModuleLog(o->i, BLOG_ERROR, "wrong type"); goto fail1; } o->ifname = NCDValue_StringValue(ifname_arg); o->user = NCDValue_StringValue(user_arg); o->exec = NCDValue_StringValue(exec_arg); o->args = args_arg; // check arguments NCDValue *arg = NCDValue_ListFirst(o->args); while (arg) { if (NCDValue_Type(arg) != NCDVALUE_STRING) { ModuleLog(o->i, BLOG_ERROR, "wrong type"); goto fail1; } arg = NCDValue_ListNext(o->args, arg); } // create TAP device if (!NCDIfConfig_make_tuntap(o->ifname, o->user, 0)) { ModuleLog(o->i, BLOG_ERROR, "failed to create TAP device"); goto fail1; } // set device up if (!NCDIfConfig_set_up(o->ifname)) { ModuleLog(o->i, BLOG_ERROR, "failed to set device up"); goto fail2; } // set not dying o->dying = 0; // init timer BTimer_Init(&o->timer, RETRY_TIME, (BTimer_handler)timer_handler, o); // signal up NCDModuleInst_Backend_Up(o->i); // try starting process try_process(o); return; fail2: if (!NCDIfConfig_remove_tuntap(o->ifname, 0)) { ModuleLog(o->i, BLOG_ERROR, "failed to remove TAP device"); } fail1: free(o); fail0: NCDModuleInst_Backend_SetError(i); NCDModuleInst_Backend_Dead(i); }
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; }