low.c 4.58 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
/*
 * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The OpenAirInterface Software Alliance licenses this file to You under
 * the OAI Public License, Version 1.1  (the "License"); you may not use this file
 * except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.openairinterface.org/?page_id=698
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *-------------------------------------------------------------------------------
 * For more information about the OpenAirInterface (OAI) Software Alliance:
 *      contact@openairinterface.org
 */

#include "low.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void store_ul(benetel_t *bs, ul_packet_t *ul)
{
30 31 32 33 34 35 36 37
#if 0
struct timespec t;
static struct timespec old;
clock_gettime(CLOCK_REALTIME, &t);
printf("store_ul %d.%ld (%ld)\n", (int)(t.tv_sec % 60), t.tv_nsec, t.tv_nsec - old.tv_nsec);
old = t;
#endif

38
  int a = ul->antenna;
39

40 41 42
  if (ul->slot != bs->next_slot[a] ||
      ul->symbol != bs->next_symbol[a]) {
    printf("%s: error, antenna %d expected frame.sl.symbol %d.%d.%d, got %d.%d.%d\n",
43
           __FUNCTION__,
44
           a, bs->expected_benetel_frame[a], bs->next_slot[a], bs->next_symbol[a],
45
           ul->frame, ul->slot, ul->symbol);
46 47 48
  }

  /* fill missing data with 0s */
49 50 51 52 53 54
  while (ul->slot != bs->next_slot[a] ||
         ul->symbol != bs->next_symbol[a]) {
    lock_ul_buffer(bs->buffers, bs->next_slot[a]);
    if (bs->buffers->ul_busy[a][bs->next_slot[a]] & (1 << bs->next_symbol[a])) {
      printf("%s: warning, antenna %d UL overflow (sl.symbol %d.%d)\n", __FUNCTION__,
             a, bs->next_slot[a], bs->next_symbol[a]);
55 56
    }

57
    memset(bs->buffers->ul[a][bs->next_slot[a]] + bs->next_symbol[a] * 1272*4,
58
           0, 1272*4);
59 60 61
    bs->buffers->ul_busy[a][bs->next_slot[a]] |= (1 << bs->next_symbol[a]);
    signal_ul_buffer(bs->buffers, bs->next_slot[a]);
    unlock_ul_buffer(bs->buffers, bs->next_slot[a]);
62

63 64 65 66 67 68 69
    bs->next_symbol[a]++;
    if (bs->next_symbol[a] == 14) {
      bs->next_symbol[a] = 0;
      bs->next_slot[a] = (bs->next_slot[a] + 1) % 20;
      if (bs->next_slot[a] == 0) {
        bs->expected_benetel_frame[a]++;
        bs->expected_benetel_frame[a] &= 255;
70 71
      }
    }
72 73
  }

74 75 76 77
  lock_ul_buffer(bs->buffers, bs->next_slot[a]);
  if (bs->buffers->ul_busy[a][bs->next_slot[a]] & (1 << bs->next_symbol[a])) {
    printf("%s: warning, antenna %d UL overflow (sl.symbol %d.%d)\n", __FUNCTION__,
           a, bs->next_slot[a], bs->next_symbol[a]);
78 79
  }

80
  memcpy(bs->buffers->ul[a][bs->next_slot[a]] + bs->next_symbol[a] * 1272*4,
81
         ul->iq, 1272*4);
82 83 84
  bs->buffers->ul_busy[a][bs->next_slot[a]] |= (1 << bs->next_symbol[a]);
  signal_ul_buffer(bs->buffers, bs->next_slot[a]);
  unlock_ul_buffer(bs->buffers, bs->next_slot[a]);
85

86 87 88 89 90 91 92
  bs->next_symbol[a]++;
  if (bs->next_symbol[a] == 14) {
    bs->next_symbol[a] = 0;
    bs->next_slot[a] = (bs->next_slot[a] + 1) % 20;
    if (bs->next_slot[a] == 0) {
      bs->expected_benetel_frame[a]++;
      bs->expected_benetel_frame[a] &= 255;
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
    }
  }
}

void store_prach(benetel_t *bs, int frame, int slot, void *data)
{
  static int last_frame = -1;
  static int last_slot = -1;
  /* hack: antenna number is always 0, discard second packet with same f/sf */
  //if (frame == last_frame && slot == last_slot) return;
  if (frame == last_frame && slot == last_slot) { printf("got f.sl %d.%d twice\n", frame, slot); return; }
  last_frame = frame;
  last_slot = slot;

  lock_ul_buffer(bs->buffers, slot);
  if (bs->buffers->prach_busy[slot]) {
    printf("store_prach: fatal: previous prach buffer not processed\n");
    unlock_ul_buffer(bs->buffers, slot);
    return;
  }
  bs->buffers->prach_busy[slot] = 1;
  memcpy(bs->buffers->prach[slot], data, 839*4);
  signal_ul_buffer(bs->buffers, slot);
  unlock_ul_buffer(bs->buffers, slot);

}

void *benetel_start_dpdk(char *ifname, shared_buffers *buffers, char *dpdk_main_command_line);

void *benetel_start(char *ifname, shared_buffers *buffers, char *dpdk_main_command_line)
{
  if (!strcmp(ifname, "dpdk"))
    return benetel_start_dpdk(ifname, buffers, dpdk_main_command_line);
  printf("benetel: fatal: interface %s not supported, only dpdpk is supported\n", ifname);
  exit(1);
}