Revert "Refactored the gw.cc run thread to reduce excessive indentation. Starting to add TFT OP code handling."

This reverts commit 19af4d0052e5478f511edc3624429a9c98c13aed.
master
Pedro Alvarez 6 years ago committed by Andre Puschmann
parent 684ee2834e
commit b55a4ccfee

@ -276,43 +276,31 @@ void gw::run_thread()
{ {
if (SRSLTE_MAX_BUFFER_SIZE_BYTES-SRSLTE_BUFFER_HEADER_OFFSET > idx) { if (SRSLTE_MAX_BUFFER_SIZE_BYTES-SRSLTE_BUFFER_HEADER_OFFSET > idx) {
N_bytes = read(tun_fd, &pdu->msg[idx], SRSLTE_MAX_BUFFER_SIZE_BYTES-SRSLTE_BUFFER_HEADER_OFFSET - idx); N_bytes = read(tun_fd, &pdu->msg[idx], SRSLTE_MAX_BUFFER_SIZE_BYTES-SRSLTE_BUFFER_HEADER_OFFSET - idx);
if (N_bytes <= 0) {
gw_log->error("Failed to read from TUN interface - gw receive thread exiting.\n");
gw_log->console("Failed to read from TUN interface - gw receive thread exiting.\n");
break;
}
} else { } else {
gw_log->error("GW pdu buffer full - gw receive thread exiting.\n"); gw_log->error("GW pdu buffer full - gw receive thread exiting.\n");
gw_log->console("GW pdu buffer full - gw receive thread exiting.\n"); gw_log->console("GW pdu buffer full - gw receive thread exiting.\n");
break; break;
} }
gw_log->debug("Read %d bytes from TUN fd=%d, idx=%d\n", N_bytes, tun_fd, idx); gw_log->debug("Read %d bytes from TUN fd=%d, idx=%d\n", N_bytes, tun_fd, idx);
struct iphdr* ip_pkt = (struct iphdr*)pdu->msg; if (N_bytes > 0) {
struct ipv6hdr* ip6_pkt = (struct ipv6hdr*)pdu->msg; struct iphdr *ip_pkt = (struct iphdr*)pdu->msg;
struct ipv6hdr *ip6_pkt = (struct ipv6hdr*)pdu->msg;
uint16_t pkt_len = 0; uint16_t pkt_len = 0;
pdu->N_bytes = idx + N_bytes; pdu->N_bytes = idx + N_bytes;
if (ip_pkt->version == 4 || ip_pkt->version == 6) {
// Check valid IP version if (ip_pkt->version == 4){
if (ip_pkt->version != 4 && ip_pkt->version != 6) {
gw_log->error("IP Version not handled. Version %d\n", ip_pkt->version);
gw_log->error_hex(pdu->msg, pdu->N_bytes, "IP Version not handled.");
continue;
}
// Get packet length
if (ip_pkt->version == 4) {
pkt_len = ntohs(ip_pkt->tot_len); pkt_len = ntohs(ip_pkt->tot_len);
} else if (ip_pkt->version == 6) { } else if (ip_pkt->version == 6){
pkt_len = ntohs(ip6_pkt->payload_len) + 40; pkt_len = ntohs(ip6_pkt->payload_len)+40;
} else {
gw_log->error_hex(pdu->msg, pdu->N_bytes, "Unsupported IP version. Dropping packet.\n");
continue;
} }
gw_log->debug("IPv%d packet total length: %d Bytes\n", ip_pkt->version, pkt_len); gw_log->debug("IPv%d packet total length: %d Bytes\n", ip_pkt->version, pkt_len);
// Check if entire packet was received // Check if entire packet was received
if (pkt_len == pdu->N_bytes) { if (pkt_len == pdu->N_bytes) {
gw_log->info_hex(pdu->msg, pdu->N_bytes, "TX PDU"); gw_log->info_hex(pdu->msg, pdu->N_bytes, "TX PDU");
// Wait for attach
while (run_enable && !pdcp->is_lcid_enabled(default_lcid) && attach_wait < ATTACH_WAIT_TOUT) { while (run_enable && !pdcp->is_lcid_enabled(default_lcid) && attach_wait < ATTACH_WAIT_TOUT) {
if (!attach_wait) { if (!attach_wait) {
gw_log->info( gw_log->info(
@ -324,6 +312,7 @@ void gw::run_thread()
usleep(100000); usleep(100000);
attach_wait++; attach_wait++;
} }
attach_wait = 0; attach_wait = 0;
if (!run_enable) { if (!run_enable) {
@ -344,17 +333,24 @@ void gw::run_thread()
gw_log->error("Fatal Error: Couldn't allocate PDU in run_thread().\n"); gw_log->error("Fatal Error: Couldn't allocate PDU in run_thread().\n");
usleep(100000); usleep(100000);
} }
} while (!pdu); } while(!pdu);
idx = 0; idx = 0;
} }
} else { }else{
idx += N_bytes; idx += N_bytes;
gw_log->debug( gw_log->debug("Entire packet not read from socket. Total Length %d, N_Bytes %d.\n", ip_pkt->tot_len, pdu->N_bytes);
"Entire packet not read from socket. Total Length %d, N_Bytes %d.\n", ip_pkt->tot_len, pdu->N_bytes); }
} else {
gw_log->error("IP Version not handled. Version %d\n", ip_pkt->version);
}
}else{
gw_log->error("Failed to read from TUN interface - gw receive thread exiting.\n");
gw_log->console("Failed to read from TUN interface - gw receive thread exiting.\n");
break;
}
} }
running = false; running = false;
gw_log->info("GW IP receiver thread exiting.\n"); gw_log->info("GW IP receiver thread exiting.\n");
}
} }
uint8_t gw::check_tft_filter_match(const srslte::unique_byte_buffer_t& pdu) { uint8_t gw::check_tft_filter_match(const srslte::unique_byte_buffer_t& pdu) {

Loading…
Cancel
Save