Connectd tells us a peer has connected/reconnected: it never hands us duplicates, since * it holds them until we say peer_disconnected. */
| 1816 | /* Connectd tells us a peer has connected/reconnected: it never hands us duplicates, since |
| 1817 | * it holds them until we say peer_disconnected. */ |
| 1818 | void handle_peer_connected(struct lightningd *ld, const u8 *msg) |
| 1819 | { |
| 1820 | struct node_id id; |
| 1821 | struct peer *peer; |
| 1822 | struct peer_connected_hook_payload *hook_payload; |
| 1823 | u64 connectd_counter; |
| 1824 | const char *cmd_id; |
| 1825 | char *connect_reason; |
| 1826 | u64 connect_nsec; |
| 1827 | struct wireaddr *last_known_addr; |
| 1828 | |
| 1829 | hook_payload = tal(NULL, struct peer_connected_hook_payload); |
| 1830 | hook_payload->ld = ld; |
| 1831 | hook_payload->error = NULL; |
| 1832 | if (!fromwire_connectd_peer_connected(hook_payload, msg, |
| 1833 | &id, &connectd_counter, |
| 1834 | &hook_payload->addr, |
| 1835 | &hook_payload->remote_addr, |
| 1836 | &hook_payload->incoming, |
| 1837 | &hook_payload->their_features, |
| 1838 | &connect_reason, |
| 1839 | &connect_nsec)) { |
| 1840 | u64 prev_connectd_counter, connected_time_nsec; |
| 1841 | if (!fromwire_connectd_peer_reconnected(hook_payload, msg, |
| 1842 | &id, &prev_connectd_counter, |
| 1843 | &connectd_counter, |
| 1844 | &hook_payload->addr, |
| 1845 | &hook_payload->remote_addr, |
| 1846 | &hook_payload->incoming, |
| 1847 | &hook_payload->their_features, |
| 1848 | &connected_time_nsec)) { |
| 1849 | fatal("Connectd gave bad CONNECT_PEER_(RE)CONNECTED message %s", |
| 1850 | tal_hex(msg, msg)); |
| 1851 | } |
| 1852 | /* Reconnect? Mark the disconnect *first*, but don't |
| 1853 | * fail any connect attempts: this is a race. */ |
| 1854 | log_peer_debug(ld->log, &id, "peer reconnected"); |
| 1855 | peer_disconnected(ld, &id, prev_connectd_counter, connected_time_nsec, false); |
| 1856 | connect_reason = tal_strdup(hook_payload, ""); |
| 1857 | connect_nsec = 0; |
| 1858 | } |
| 1859 | |
| 1860 | wallet_save_network_event(ld, &id, |
| 1861 | NETWORK_EVENT_CONNECT, |
| 1862 | hook_payload->incoming ? NULL : connect_reason, |
| 1863 | connect_nsec, |
| 1864 | false); |
| 1865 | |
| 1866 | /* If we connected, and it's a normal address */ |
| 1867 | if (!hook_payload->incoming |
| 1868 | && hook_payload->addr.itype == ADDR_INTERNAL_WIREADDR |
| 1869 | && !hook_payload->addr.u.wireaddr.is_websocket) { |
| 1870 | last_known_addr = &hook_payload->addr.u.wireaddr.wireaddr; |
| 1871 | } else { |
| 1872 | last_known_addr = NULL; |
| 1873 | } |
| 1874 | |
| 1875 | /* If we're already dealing with this peer, hand off to correct |
no test coverage detected