Advertisement
Knuffeliger

I HATE EVERYTHING

Apr 26th, 2025
58
0
12 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.00 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <map>
  4. #include <malloc.h>
  5. #include "pico/stdlib.h"
  6. #include "pico/cyw43_arch.h"
  7. #include "lwip/sockets.h"
  8. #include "lwip/ip_addr.h"
  9. #include "dhcp.h"
  10.  
  11. bool network_init(const char *ap_ssid, const char *ap_password, const ip_addr_t &ip, const ip_addr_t &netmask, const ip_addr_t &gateway) {
  12.     if (cyw43_arch_init()) {
  13.         std::cout << "Failed to initialize cyw43" << std::endl;
  14.         return false;
  15.     }
  16.  
  17.     cyw43_arch_enable_ap_mode(ap_ssid, ap_password, CYW43_AUTH_WPA2_AES_PSK);
  18.  
  19.     netif_set_ipaddr(cyw43_state.netif, &ip);
  20.     netif_set_netmask(cyw43_state.netif, &netmask);
  21.     netif_set_gw(cyw43_state.netif, &gateway);
  22.  
  23.     cyw43_state.netif->flags |= NETIF_FLAG_UP;
  24.  
  25.     if (!(cyw43_state.netif->flags & NETIF_FLAG_UP)) {
  26.         std::cout << "Failed to bring network interface up!" << std::endl;
  27.         return false;
  28.     } else std::cout << "Network interface is up!" << std::endl;
  29.     return true;
  30. }
  31.  
  32. void network_deinit() {
  33.     cyw43_arch_disable_ap_mode();
  34.     cyw43_arch_deinit();
  35. }
  36.  
  37. class UDPServer {
  38. public:
  39.     UDPServer(ip_addr_t ip_address) : _ap_addr(ip_address) {
  40.         IP_ADDR4(&_bc_addr, 0xFF, 0xFF, 0xFF, 0xFF);
  41.     }
  42.  
  43.     bool start() {
  44.         _ap_pcb = udp_new();
  45.         if (_ap_pcb == NULL) {
  46.             std::cout << "Failed to create UDP PCB" << std::endl;
  47.             return false;
  48.         }
  49.  
  50.         err_t err = udp_bind(_ap_pcb, &_ap_addr, 67);
  51.         if (err != ERR_OK) {
  52.             std::cout << "Failed to bind address" << std::endl;
  53.             return false;
  54.         }
  55.  
  56.         udp_recv(_ap_pcb, udp_recv_callback, this);
  57.         return true;
  58.     }
  59.  
  60. private:
  61.     static void udp_recv_callback(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) {
  62.         UDPServer* server = (UDPServer*)arg;
  63.         uint8_t *payload = (uint8_t*)p->payload;
  64.         DHCPPacket *recv_pack = reinterpret_cast<DHCPPacket*>(payload);
  65.         DHCPPacket ret_pack;
  66.  
  67.         if (!server->handle_dhcp_packet(*recv_pack, ret_pack)) {
  68.             pbuf_free(p);
  69.             return;
  70.         }
  71.  
  72.         std::vector<uint8_t> ret_pack_vec = ret_pack.convert();
  73.         const uint8_t *ret_data = ret_pack_vec.data();
  74.         size_t ret_data_size = ret_pack_vec.size();
  75.  
  76.         pbuf *p_ret = pbuf_alloc(PBUF_TRANSPORT, ret_data_size, PBUF_RAM);
  77.         if (p_ret == NULL) {
  78.             std::cout << "Failed to create pbuf" << std::endl;
  79.             pbuf_free(p);
  80.             return;
  81.         }
  82.         std::cout << "pbuf created" << std::endl;
  83.         std::memcpy(p_ret->payload, ret_data, ret_data_size);
  84.  
  85.         if (cyw43_state.netif == nullptr || !(cyw43_state.netif->flags & NETIF_FLAG_UP)) {
  86.             std::cout << "Network interface is down or not properly initialized." << std::endl;
  87.             pbuf_free(p_ret);
  88.             pbuf_free(p);
  89.             return;
  90.         }
  91.  
  92.         std::cout << "Size of p_ret: " << ret_data_size << std::endl;
  93.         std::cout << "IP address: " << ip4addr_ntoa(&cyw43_state.netif->ip_addr) << std::endl;
  94.         std::cout << "Network interface status: " << (cyw43_state.netif != nullptr ? "Up" : "Down") << std::endl;
  95.         std::cout << "Network interface flags before sending: " << cyw43_state.netif->flags << std::endl;
  96.         err_t err = udp_sendto_if(server->_ap_pcb, p_ret, &server->_bc_addr, 68, cyw43_state.netif);
  97.         std::cout << "Sending done" << std::endl;
  98.         if (err != ERR_OK) {
  99.             std::cout << "Failed to send, Error code: " << (int)err << std::endl;
  100.             if (cyw43_state.netif == nullptr) std::cout << "Network interface is down." << std::endl;
  101.             else std::cout << "Network interface status: " << (cyw43_state.netif->flags) << std::endl;
  102.         } else std::cout << "Success" << std::endl;
  103.  
  104.         std::cout << "Success" << std::endl;
  105.         pbuf_free(p_ret);
  106.         pbuf_free(p);
  107.     }
  108.  
  109.     bool handle_dhcp_packet(const DHCPPacket &recv_pack, DHCPPacket &ret_pack) {
  110.         auto opts = recv_pack.get_opts();
  111.  
  112.         if (opts.find(53) == opts.end()) {
  113.             std::cout << "Missing option 53" << std::endl;
  114.             return false;
  115.         }
  116.         if (recv_pack.is_discover() && opts[53][0] == 0x01) return handle_dhcp_discover(recv_pack, ret_pack, opts);
  117.        
  118.         std::cout << "Unknown Package: " << (int)opts[53][0] << std::endl;
  119.         return false;
  120.     }
  121.  
  122.     bool handle_dhcp_discover(const DHCPPacket &recv_pack, DHCPPacket &ret_pack, const std::map<uint8_t, std::vector<uint8_t>> &opts) {
  123.         std::cout << "DHCP DISCOVER" << std::endl;
  124.  
  125.         std::map<uint8_t, std::vector<uint8_t>> ret_opts;
  126.         ret_pack.op = BOOTREPLY;
  127.         ret_pack.htype = ETHERNET;
  128.         ret_pack.xid = recv_pack.xid;
  129.         ret_pack.hlen = recv_pack.hlen;
  130.         std::memcpy(ret_pack.chaddr, recv_pack.chaddr, sizeof(recv_pack.chaddr));
  131.         std::memcpy(ret_pack.magic_cookie, recv_pack.magic_cookie, sizeof(recv_pack.magic_cookie));
  132.         ret_pack.yiaddr = 0xC0A80220;
  133.  
  134.         ret_opts[1] = { 255, 255, 255, 0 }; // SUBNET MASK
  135.         ret_opts[3] = { 192, 168, 2, 1 }; // GATEWAY
  136.         ret_opts[51] = { 0x00, 0x00, 0x01, 0x51 }; // LEASE TIME
  137.         ret_opts[53] = { 0x02 }; // DHCP OFFER
  138.         ret_opts[54] = { 192, 168, 2, 1 }; // SERVER IP
  139.  
  140.         ret_pack.set_options(ret_opts);
  141.         return true;
  142.     }
  143.  
  144.     ip_addr_t _ap_addr;
  145.     ip_addr_t _bc_addr;
  146.     udp_pcb *_ap_pcb;
  147. };
  148.  
  149. int main() {
  150.     stdio_init_all();
  151.     sleep_ms(1000);
  152.     std::cout << "Alive" << std::endl;
  153.    
  154.     ip_addr_t ap_addr;
  155.     ip_addr_t nm_addr;
  156.     ip_addr_t gw_addr;
  157.     IP4_ADDR(&ap_addr, 192, 168, 2, 1);
  158.     IP4_ADDR(&nm_addr, 255, 255, 255, 0);
  159.     IP4_ADDR(&gw_addr, 192, 168, 2, 1);
  160.  
  161.     if (!network_init("Fly NET", "12345678", ap_addr, nm_addr, gw_addr)) return -1;
  162.     std::cout << "AP alive" << std::endl;
  163.  
  164.     UDPServer server(ap_addr);
  165.     server.start();
  166.    
  167.     while (1) {
  168.         sleep_ms(1);
  169.     }
  170.    
  171.     network_deinit();
  172.     sleep_ms(1000);
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement