static void h5_init(void) { BT_DBG(""); h5.link_state = UNINIT; h5.rx_state = START; h5.tx_win = 4; /* TX thread */ k_fifo_init(&h5.tx_queue); k_thread_create(&tx_thread_data, tx_stack, K_THREAD_STACK_SIZEOF(tx_stack), (k_thread_entry_t)tx_thread, NULL, NULL, NULL, K_PRIO_COOP(CONFIG_BT_HCI_TX_PRIO), 0, K_NO_WAIT); k_fifo_init(&h5.rx_queue); k_thread_create(&rx_thread_data, rx_stack, K_THREAD_STACK_SIZEOF(rx_stack), (k_thread_entry_t)rx_thread, NULL, NULL, NULL, K_PRIO_COOP(CONFIG_BT_RX_PRIO), 0, K_NO_WAIT); /* Unack queue */ k_fifo_init(&h5.unack_queue); /* Init delayed work */ k_delayed_work_init(&ack_work, ack_timeout); k_delayed_work_init(&retx_work, retx_timeout); }
void on_nble_gap_connect_evt(const struct nble_gap_connect_evt *ev) { struct bt_conn *conn; BT_DBG("handle %u role %u", ev->conn_handle, ev->role_slave); conn = conn_get(&ev->peer_bda); if (!conn) { BT_ERR("Unable to get bt_conn object"); return; } conn->handle = ev->conn_handle; conn->role = ev->role_slave ? BT_CONN_ROLE_SLAVE : BT_CONN_ROLE_MASTER; conn->interval = ev->conn_values.interval; conn->latency = ev->conn_values.latency; conn->timeout = ev->conn_values.supervision_to; bt_addr_le_copy(&conn->dst, &ev->peer_bda); k_delayed_work_init(&conn->update_work, le_conn_update); conn->state = BT_CONN_CONNECTED; notify_connected(conn); /* * Core 4.2 Vol 3, Part C, 9.3.12.2 * The Peripheral device should not perform a Connection Parameter * Update procedure within 5 s after establishing a connection. */ k_delayed_work_submit(&conn->update_work, conn->role == BT_HCI_ROLE_MASTER ? K_NO_WAIT : CONN_UPDATE_TIMEOUT); }
static void h5_init(void) { BT_DBG(""); h5.link_state = UNINIT; h5.rx_state = START; h5.tx_win = 4; /* TX thread */ k_fifo_init(&h5.tx_queue); k_thread_spawn(tx_stack, sizeof(tx_stack), (k_thread_entry_t)tx_thread, NULL, NULL, NULL, K_PRIO_COOP(7), 0, K_NO_WAIT); k_fifo_init(&h5.rx_queue); k_thread_spawn(rx_stack, sizeof(rx_stack), (k_thread_entry_t)rx_thread, NULL, NULL, NULL, K_PRIO_COOP(7), 0, K_NO_WAIT); /* Unack queue */ k_fifo_init(&h5.unack_queue); /* Init delayed work */ k_delayed_work_init(&ack_work, ack_timeout); k_delayed_work_init(&retx_work, retx_timeout); }
/* Prepare DHCPv4 Message request and send it to peer */ static void send_request(struct net_if *iface, bool renewal) { struct net_buf *buf; buf = prepare_message(iface, DHCPV4_MSG_TYPE_REQUEST); if (!buf) { goto fail; } if (!add_server_id(buf) || !add_req_ipaddr(buf) || !add_end(buf)) { goto fail; } setup_header(buf); if (net_send_data(buf) < 0) { goto fail; } if (renewal) { iface->dhcpv4.state = NET_DHCPV4_RENEWAL; } else { iface->dhcpv4.state = NET_DHCPV4_REQUEST; } iface->dhcpv4.attempts++; k_delayed_work_init(&iface->dhcpv4_timeout, dhcpv4_timeout); k_delayed_work_submit(&iface->dhcpv4_timeout, get_dhcpv4_timeout()); return; fail: NET_DBG("Message preparation failed"); if (!buf) { net_nbuf_unref(buf); } }
static bool l2cap_chan_add(struct bt_conn *conn, struct bt_l2cap_chan *chan, bt_l2cap_chan_destroy_t destroy) { struct bt_l2cap_le_chan *ch = l2cap_chan_alloc_cid(conn, chan); if (!ch) { BT_ERR("Unable to allocate L2CAP CID"); return false; } k_delayed_work_init(&chan->rtx_work, l2cap_rtx_timeout); bt_l2cap_chan_add(conn, chan, destroy); if (IS_ENABLED(CONFIG_BLUETOOTH_L2CAP_DYNAMIC_CHANNEL) && L2CAP_LE_CID_IS_DYN(ch->rx.cid)) { bt_l2cap_chan_set_state(chan, BT_L2CAP_CONNECT); } return true; }
/* Prepare DHCPv4 Discover message and broadcast it */ static void send_discover(struct net_if *iface) { struct net_buf *buf; iface->dhcpv4.xid++; buf = prepare_message(iface, DHCPV4_MSG_TYPE_DISCOVER); if (!buf) { goto fail; } if (!add_req_options(buf) || !add_end(buf)) { goto fail; } setup_header(buf); if (net_send_data(buf) < 0) { goto fail; } iface->dhcpv4.state = NET_DHCPV4_DISCOVER; k_delayed_work_init(&iface->dhcpv4_timeout, dhcpv4_timeout); k_delayed_work_submit(&iface->dhcpv4_timeout, get_dhcpv4_timeout()); return; fail: NET_DBG("Message preparation failed"); if (!buf) { net_nbuf_unref(buf); } }
/* TODO: Handles only DHCPv4 OFFER and ACK messages */ static inline void handle_dhcpv4_reply(struct net_if *iface, uint8_t msg_type) { /* * Check for previous state, reason behind this check is, if client * receives multiple OFFER messages, first one will be handled. * Rest of the replies are discarded. */ if (iface->dhcpv4.state == NET_DHCPV4_DISCOVER) { if (msg_type != NET_DHCPV4_OFFER) { NET_DBG("Reply not handled %d", msg_type); return; } /* Send DHCPv4 Request Message */ k_delayed_work_cancel(&iface->dhcpv4_timeout); send_request(iface, false); } else if (iface->dhcpv4.state == NET_DHCPV4_REQUEST || iface->dhcpv4.state == NET_DHCPV4_RENEWAL) { if (msg_type != NET_DHCPV4_ACK) { NET_DBG("Reply not handled %d", msg_type); return; } k_delayed_work_cancel(&iface->dhcpv4_timeout); switch (iface->dhcpv4.state) { case NET_DHCPV4_REQUEST: NET_INFO("Received: %s", net_sprint_ipv4_addr( &iface->dhcpv4.requested_ip)); if (!net_if_ipv4_addr_add(iface, &iface->dhcpv4.requested_ip, NET_ADDR_DHCP, iface->dhcpv4.lease_time)) { NET_DBG("Failed to add IPv4 addr to iface %p", iface); return; } break; case NET_DHCPV4_RENEWAL: /* TODO: if the renewal is success, update only * vlifetime on iface */ break; default: break; } iface->dhcpv4.attempts = 0; iface->dhcpv4.state = NET_DHCPV4_ACK; /* Start renewal time */ k_delayed_work_init(&iface->dhcpv4_t1_timer, dhcpv4_t1_timeout); k_delayed_work_submit(&iface->dhcpv4_t1_timer, get_dhcpv4_renewal_time(iface)); } }
void bt_mesh_beacon_init(void) { k_delayed_work_init(&beacon_timer, beacon_send); }