usrp-users@lists.ettus.com

Discussion and technical support related to USRP, UHD, RFNoC

View all threads

Re: NIC suggestion

NB
Nikos Balkanas
Sat, Apr 26, 2025 2:26 AM

Thanks Marcus,

for your fast reply.

On Sat, Apr 26, 2025 at 4:08 AM Marcus D. Leech patchvonbraun@gmail.com
wrote:

On 25/04/2025 20:50, Nikos Balkanas wrote:

Hello,

I need to buy a new NIC. What would you suggest?
The one I use is an old Mellanox 10 Gbs, before the Connect-4 series.
It can only do 1996 S/s, need 19960 (10x more) to work with latest uhd.
Using Ubuntu 24.04 and uhd 4.6.0

So, 1.996ksps vs 19.960ksps?  You hardly need a 10Gbit link to support
that.  So, perhaps something
is being lost here in your requirements?

True. Can't explain it in terms of bandwidth. 16 * 1996 = 31.936 Kbps, 16 *
19960 = 319.360 Kbps well short of a 10 Gbps line:(
Does a complex pair count as 1 sample, or 2?
I have followed all the instructions in
https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks,
Even installed the DPDK drivers. My Mellanox is too old to use their OFED
drivers:(

On a related question. it seems that the streamer doesn't crash anymore
when receiving less than MAXSPS samples, instead it reads 0:(
This was due to the sse2 code not aligned in convert.
I change my stream args to cpu_format=sc16, otw=sc16, so no conversion
required.
Streamer still doesn't read anything. Is there a reason for it?

You'd need to share more of your code.  This should just work as far as I
can tell.

Thanks. these are just the usrp code:

int main()
{
uhd_stream_args_t stream_args =
{
.cpu_format =
"sc16",
.otw_format =
"sc16",
.args = "",
.n_channels =
1,

.channel_list = &channel
};
..uhd_stream_cmd_t stream_cmd =
{
.stream_mode
= UHD_STREAM_MODE_NUM_SAMPS_AND_DONE,
.stream_now
= true
};

if (uhd_init(0, 0, gain)) do_exit(20);
 if ((err = uhd_usrp_get_rx_stream(dev[0], &stream_args,

rx_streamer[0])))
{
uhd_get_last_error(errmsg, 127);
error(log, "Failed to get streamer[0] (%d). %s.\n", 0, FL, LN,
FN, err, errmsg);
uhd_rx_streamer_free(&rx_streamer[0]);
rx_streamer[0] = NULL;
uhd_rx_metadata_free(&md[0]);
md[0] = NULL;
do_exit(30);
}
if ((err = uhd_rx_streamer_max_num_samps(rx_streamer[0], &maxsamps)))

 {
      uhd_get_last_error(errmsg, 127);
      error(log, "Failed to get max samples/buffer[0] (%d). %s.\n", 0,

FL, LN, FN, err,
..errmsg);
do_exit(35);
}
if (maxsamps != MAXSMPS)
warn(log, "Incorrect maxsamples (%ld). Expected %d.\n", 0, FL,
LN, FN, maxsamps,
MAXSMPS);
info(log, "Max samples/buffer[0]: %ld\n", 0, maxsamps);

 if ((err = uhd_rx_streamer_issue_stream_cmd(rx_streamer[0],

&stream_cmd)))

{
     uhd_get_last_error(errmsg, 127);
     error(log, "Failed to start streamer[0] (%d). %s.\n", 0, FL, LN,

FN, err, errmsg);
do_exit(40);
}

     [...]
     do_exit(0)
 }

bool uhd_init(size_t channel, double srate, double gain)
{
double tmp;
uhd_rx_metadata_error_code_t err;

  if ((err = uhd_set_thread_priority(uhd_default_thread_priority,

true)))
warn(log, "Unable to set  main thread priority (%d). %s.\n",
0, FL, LN, FN,
err, uhdError(err));
/* Create USRP */
f ((err = uhd_usrp_make(&dev[channel], "type=x300")))
{
error(log, "Failed to create USRP (%d). %s.\n", 0, FL, LN, FN,
err,
uhdError(err));
dev[channel] = NULL;
return(FAIL);

     }
      info(stderr, "Created USRP with args\n", 0);

 /* Create RX streamer */
 if ((err = uhd_rx_streamer_make(&rx_streamer[channel])))
 {
     error(log, "Failed to create rx_streamer[%d] (%d). %s.\n", 0, FL,

LN, FN,
channel, err, uhdError(err));
return(FAIL);
}
/* Create RX metadata */
if ((err = uhd_rx_metadata_make(&md[channel])))
{
error(log, "Failed to create md[%d] (%d). %s.\n", 0, FL, LN, FN,
channel,
err, uhdError(err));
return(FAIL);
}

 /* Get master clock rate */
  if ((err = uhd_usrp_get_master_clock_rate(dev[channel], 0, &tmp)))
  {
        error(log, "Failed to set master clock to %.0lf Mhz (%d).

%s.\n", 0, FL,
LN, FN, tmp/1000000, err, uhdError(err));
return(FAIL);
}
info(stderr, "Master clock is at %.0lf Mhz\n", 0, tmp/1000000);
/* Set the sample rate /
if (srate && !uhd_set_rx_rate_check(channel, srate)) return(FAIL);
/
Set the tuner gain SBX-120 is 0-31.5 in .5 db steps */

   if ((err = uhd_usrp_set_rx_gain(dev[channel], gain, channel, "")))
    {
         error(log, "Failed to set tuner[%d] gain to %.0lf db (%d).

%s.\n", 0, FL,
LN, FN, channel, gain, err, uhdError(err));
return(FAIL);
}
if (!(err = uhd_usrp_get_rx_gain(dev[channel], channel, "",
&tmp)))
info(log, "Tuner[%d] gain set to %.0lf (%.0lf) dB\n", 0,
channel, tmp, gain);

    ./* Set channel bw to conserve tuner resources. Not needed, set by

srate /
uhd_usrp_set_rx_bandwidth(dev[channel], srate, channel);
./
Disable subtracting constant averaged background. Signal looks
cleaner */
if ((err = uhd_usrp_set_rx_dc_offset_enabled(dev[channel],
false, channel)))
{
warn(log, "Failed to disable FPGA DC offset on channel
%d(%d). %s.\n", 0,
FL, LN, FN, channel, err, uhdError(err));
}
info(stderr, "Disabled FPGA DC offset on channel %d\n", 0,
channel);
return(SUCCESS);
}

This is the generated output:

[INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300;
UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1
[INFO] [X300] X300 initialization sequence...
[INFO] [X300] Maximum frame size: 8000 bytes.
[INFO] [X300] Radio 1x clock: 200 MHz
Sat Apr 26 03:33:48 2025 [00] [+] Created USRP with args
Sat Apr 26 03:33:48 2025 [00] [+] Master clock is at 200 Mhz
Sat Apr 26 03:33:48 2025 [00] [+] Tuner[0] gain set to 30 (30) dB
Sat Apr 26 03:33:48 2025 [00] [*] scanner.l:1446:main Incorrect maxsamples
(1996). Expected 19960.
Sat Apr 26 03:33:48 2025 [00] [+] Max samples/buffer[0]: 1996
[WARNING] [0/Radio#0] Ignoring stream command for finite acquisition of
zero samples
I hope this reads OK. Maybe next time I should attach the code:)

TIA
Nikos


USRP-users mailing list -- usrp-users@lists.ettus.com
To unsubscribe send an email to usrp-users-leave@lists.ettus.com

Thanks Marcus, for your fast reply. On Sat, Apr 26, 2025 at 4:08 AM Marcus D. Leech <patchvonbraun@gmail.com> wrote: > On 25/04/2025 20:50, Nikos Balkanas wrote: > > Hello, > > I need to buy a new NIC. What would you suggest? > The one I use is an old Mellanox 10 Gbs, before the Connect-4 series. > It can only do 1996 S/s, need 19960 (10x more) to work with latest uhd. > Using Ubuntu 24.04 and uhd 4.6.0 > > So, 1.996ksps vs 19.960ksps? You hardly need a 10Gbit link to support > that. So, perhaps something > is being lost here in your requirements? > True. Can't explain it in terms of bandwidth. 16 * 1996 = 31.936 Kbps, 16 * 19960 = 319.360 Kbps well short of a 10 Gbps line:( Does a complex pair count as 1 sample, or 2? I have followed all the instructions in https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks, Even installed the DPDK drivers. My Mellanox is too old to use their OFED drivers:( > > On a related question. it seems that the streamer doesn't crash anymore > when receiving less than MAXSPS samples, instead it reads 0:( > This was due to the sse2 code not aligned in convert. > I change my stream args to cpu_format=sc16, otw=sc16, so no conversion > required. > Streamer still doesn't read anything. Is there a reason for it? > > You'd need to share more of your code. This should just work as far as I > can tell. > > Thanks. these are just the usrp code: int main() { uhd_stream_args_t stream_args = { .cpu_format = "sc16", .otw_format = "sc16", .args = "", .n_channels = 1, .channel_list = &channel }; ..uhd_stream_cmd_t stream_cmd = { .stream_mode = UHD_STREAM_MODE_NUM_SAMPS_AND_DONE, .stream_now = true }; if (uhd_init(0, 0, gain)) do_exit(20); > if ((err = uhd_usrp_get_rx_stream(dev[0], &stream_args, > rx_streamer[0]))) > { > uhd_get_last_error(errmsg, 127); > error(log, "Failed to get streamer[0] (%d). %s.\n", 0, FL, LN, > FN, err, errmsg); > uhd_rx_streamer_free(&rx_streamer[0]); > rx_streamer[0] = NULL; > uhd_rx_metadata_free(&md[0]); > md[0] = NULL; > do_exit(30); > } > if ((err = uhd_rx_streamer_max_num_samps(rx_streamer[0], &maxsamps))) > { > uhd_get_last_error(errmsg, 127); > error(log, "Failed to get max samples/buffer[0] (%d). %s.\n", 0, > FL, LN, FN, err, > ..errmsg); > do_exit(35); > } > if (maxsamps != MAXSMPS) > warn(log, "Incorrect maxsamples (%ld). Expected %d.\n", 0, FL, > LN, FN, maxsamps, > MAXSMPS); > info(log, "Max samples/buffer[0]: %ld\n", 0, maxsamps); > > if ((err = uhd_rx_streamer_issue_stream_cmd(rx_streamer[0], > &stream_cmd))) > { > uhd_get_last_error(errmsg, 127); > error(log, "Failed to start streamer[0] (%d). %s.\n", 0, FL, LN, > FN, err, errmsg); > do_exit(40); > } > [...] do_exit(0) } > bool uhd_init(size_t channel, double srate, double gain) > { > double tmp; > uhd_rx_metadata_error_code_t err; > > if ((err = uhd_set_thread_priority(uhd_default_thread_priority, > true))) > warn(log, "Unable to set main thread priority (%d). %s.\n", > 0, FL, LN, FN, > err, uhdError(err)); > /* Create USRP */ > f ((err = uhd_usrp_make(&dev[channel], "type=x300"))) > { > error(log, "Failed to create USRP (%d). %s.\n", 0, FL, LN, FN, > err, > uhdError(err)); > dev[channel] = NULL; > return(FAIL); > } > info(stderr, "Created USRP with args\n", 0); > > /* Create RX streamer */ > if ((err = uhd_rx_streamer_make(&rx_streamer[channel]))) > { > error(log, "Failed to create rx_streamer[%d] (%d). %s.\n", 0, FL, > LN, FN, > channel, err, uhdError(err)); > return(FAIL); > } > /* Create RX metadata */ > if ((err = uhd_rx_metadata_make(&md[channel]))) > { > error(log, "Failed to create md[%d] (%d). %s.\n", 0, FL, LN, FN, > channel, > err, uhdError(err)); > return(FAIL); > } > > /* Get master clock rate */ > if ((err = uhd_usrp_get_master_clock_rate(dev[channel], 0, &tmp))) > { > error(log, "Failed to set master clock to %.0lf Mhz (%d). > %s.\n", 0, FL, > LN, FN, tmp/1000000, err, uhdError(err)); > return(FAIL); > } > info(stderr, "Master clock is at %.0lf Mhz\n", 0, tmp/1000000); > /* Set the sample rate */ > if (srate && !uhd_set_rx_rate_check(channel, srate)) return(FAIL); > /* Set the tuner gain SBX-120 is 0-31.5 in .5 db steps */ > if ((err = uhd_usrp_set_rx_gain(dev[channel], gain, channel, ""))) > { > error(log, "Failed to set tuner[%d] gain to %.0lf db (%d). > %s.\n", 0, FL, > LN, FN, channel, gain, err, uhdError(err)); > return(FAIL); > } > if (!(err = uhd_usrp_get_rx_gain(dev[channel], channel, "", > &tmp))) > info(log, "Tuner[%d] gain set to %.0lf (%.0lf) dB\n", 0, > channel, tmp, gain); > ./* Set channel bw to conserve tuner resources. Not needed, set by srate */ uhd_usrp_set_rx_bandwidth(dev[channel], srate, channel); ./* Disable subtracting constant averaged background. Signal looks cleaner */ if ((err = uhd_usrp_set_rx_dc_offset_enabled(dev[channel], false, channel))) { warn(log, "Failed to disable FPGA DC offset on channel %d(%d). %s.\n", 0, FL, LN, FN, channel, err, uhdError(err)); } info(stderr, "Disabled FPGA DC offset on channel %d\n", 0, channel); return(SUCCESS); } This is the generated output: [INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300; UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1 [INFO] [X300] X300 initialization sequence... [INFO] [X300] Maximum frame size: 8000 bytes. [INFO] [X300] Radio 1x clock: 200 MHz Sat Apr 26 03:33:48 2025 [00] [+] Created USRP with args Sat Apr 26 03:33:48 2025 [00] [+] Master clock is at 200 Mhz Sat Apr 26 03:33:48 2025 [00] [+] Tuner[0] gain set to 30 (30) dB Sat Apr 26 03:33:48 2025 [00] [*] scanner.l:1446:main Incorrect maxsamples (1996). Expected 19960. Sat Apr 26 03:33:48 2025 [00] [+] Max samples/buffer[0]: 1996 [WARNING] [0/Radio#0] Ignoring stream command for finite acquisition of zero samples I hope this reads OK. Maybe next time I should attach the code:) > TIA > Nikos > > _______________________________________________ > USRP-users mailing list -- usrp-users@lists.ettus.com > To unsubscribe send an email to usrp-users-leave@lists.ettus.com > > >
MD
Marcus D. Leech
Sat, Apr 26, 2025 2:45 AM

On 25/04/2025 22:26, Nikos Balkanas wrote:

Thanks Marcus,

for your fast reply.

On Sat, Apr 26, 2025 at 4:08 AM Marcus D. Leech
patchvonbraun@gmail.com wrote:

 On 25/04/2025 20:50, Nikos Balkanas wrote:
 Hello,

 I need to buy a new NIC. What would you suggest?
 The one I use is an old Mellanox 10 Gbs, before the Connect-4 series.
 It can only do 1996 S/s, need 19960 (10x more) to work with
 latest uhd.
 Using Ubuntu 24.04 and uhd 4.6.0
 So, 1.996ksps vs 19.960ksps?   You hardly need a 10Gbit link to
 support that.  So, perhaps something
   is being lost here in your requirements?

True. Can't explain it in terms of bandwidth. 16 * 1996 = 31.936 Kbps,
16 * 19960 = 319.360 Kbps well short of a 10 Gbps line:(
Does a complex pair count as 1 sample, or 2?
I have followed all the instructions in
https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks,
Even installed the DPDK drivers. My Mellanox is too old to use their
OFED drivers:(

 On a related question. it seems that the streamer doesn't crash
 anymore
 when receiving less than MAXSPS samples, instead it reads 0:(
 This was due to the sse2 code not aligned in convert.
 I change my stream args to cpu_format=sc16, otw=sc16, so no
 conversion required.
 Streamer still doesn't read anything. Is there a reason for it?
 You'd need to share more of your code.  This should just work as
 far as I can tell.

Thanks. these are just the usrp code:

int main()
{
uhd_stream_args_t stream_args =
                                                           {
  .cpu_format = "sc16",
  .otw_format = "sc16",
  .args = "",
  .n_channels = 1,
   .channel_list = &channel
 };
..uhd_stream_cmd_t stream_cmd =
 {
   .stream_mode = UHD_STREAM_MODE_NUM_SAMPS_AND_DONE,
    .stream_now = true
  };

 if (uhd_init(0, 0, gain)) do_exit(20);
 if ((err = uhd_usrp_get_rx_stream(dev[0], &stream_args,
 rx_streamer[0])))
 {
 uhd_get_last_error(errmsg, 127);
 error(log, "Failed to get streamer[0] (%d). %s.\n", 0, FL, LN, FN,
 err, errmsg);
 uhd_rx_streamer_free(&rx_streamer[0]);
 rx_streamer[0] = NULL;
 uhd_rx_metadata_free(&md[0]);
 md[0] = NULL;
 do_exit(30);
 }
 if ((err = uhd_rx_streamer_max_num_samps(rx_streamer[0], &maxsamps)))

 {
 uhd_get_last_error(errmsg, 127);
 error(log, "Failed to get max samples/buffer[0] (%d). %s.\n", 0,
 FL, LN, FN, err,
 ..errmsg);
 do_exit(35);
 }
 if (maxsamps != MAXSMPS)
 warn(log, "Incorrect maxsamples (%ld). Expected %d.\n", 0, FL, LN,
 FN, maxsamps,
 MAXSMPS);
 info(log, "Max samples/buffer[0]: %ld\n", 0, maxsamps);

     if ((err = uhd_rx_streamer_issue_stream_cmd(rx_streamer[0],
 &stream_cmd)))

 {
 uhd_get_last_error(errmsg, 127);
 error(log, "Failed to start streamer[0] (%d). %s.\n", 0, FL, LN,
 FN, err, errmsg);
 do_exit(40);
 }

   [...]
 do_exit(0)
     }

 bool uhd_init(size_t channel, double srate, double gain)
 {
 double tmp;
 uhd_rx_metadata_error_code_t err;

 if ((err = uhd_set_thread_priority(uhd_default_thread_priority,
 true)))
 warn(log, "Unable to set  main thread priority (%d). %s.\n", 0,
 FL, LN, FN,
 err, uhdError(err));
 /* Create USRP */
 f ((err = uhd_usrp_make(&dev[channel], "type=x300")))
 {
 error(log, "Failed to create USRP (%d). %s.\n", 0, FL, LN, FN, err,
 uhdError(err));
 dev[channel] = NULL;
       return(FAIL);

 }
 info(stderr, "Created USRP with args\n", 0);

 /* Create RX streamer */
 if ((err = uhd_rx_streamer_make(&rx_streamer[channel])))
 {
 error(log, "Failed to create rx_streamer[%d] (%d). %s.\n", 0, FL,
 LN, FN,
 channel, err, uhdError(err));
 return(FAIL);
 }
 /* Create RX metadata */
 if ((err = uhd_rx_metadata_make(&md[channel])))
 {
 error(log, "Failed to create md[%d] (%d). %s.\n", 0, FL, LN, FN,
 channel,
 err, uhdError(err));
 return(FAIL);
 }

 /* Get master clock rate */
 if ((err = uhd_usrp_get_master_clock_rate(dev[channel], 0, &tmp)))

 {
 error(log, "Failed to set master clock to %.0lf Mhz (%d). %s.\n",
 0, FL,
 LN, FN, tmp/1000000, err, uhdError(err));
 return(FAIL);
 }
 info(stderr, "Master clock is at %.0lf Mhz\n", 0, tmp/1000000);
 /* Set the sample rate */
 if (srate && !uhd_set_rx_rate_check(channel, srate)) return(FAIL);
 /* Set the tuner gain SBX-120 is 0-31.5 in .5 db steps */

    if ((err = uhd_usrp_set_rx_gain(dev[channel], gain, channel, "")))
 {
 error(log, "Failed to set tuner[%d] gain to %.0lf db (%d). %s.\n",
 0, FL,
 LN, FN, channel, gain, err, uhdError(err));
 return(FAIL);
 }
    if (!(err = uhd_usrp_get_rx_gain(dev[channel], channel, "", &tmp)))
 info(log, "Tuner[%d] gain set to %.0lf (%.0lf) dB\n", 0, channel,
 tmp,gain);

./* Set channel bw to conserve tuner resources. Not needed, set by
srate /
uhd_usrp_set_rx_bandwidth(dev[channel], srate, channel);
./
Disable subtracting constant averaged background. Signal looks
cleaner */
if ((err = uhd_usrp_set_rx_dc_offset_enabled(dev[channel], false,
channel)))
{
warn(log, "Failed to disable FPGA DC offset on channel %d(%d). %s.\n", 0,
FL, LN, FN, channel, err, uhdError(err));
}
info(stderr, "Disabled FPGA DC offset on channel %d\n", 0, channel);
return(SUCCESS);
   }

This is the generated output:

[INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300;
UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1
[INFO] [X300] X300 initialization sequence...
[INFO] [X300] Maximum frame size: 8000 bytes.
[INFO] [X300] Radio 1x clock: 200 MHz
Sat Apr 26 03:33:48 2025 [00] [+] Created USRP with args
Sat Apr 26 03:33:48 2025 [00] [+] Master clock is at 200 Mhz
Sat Apr 26 03:33:48 2025 [00] [+] Tuner[0] gain set to 30 (30) dB
Sat Apr 26 03:33:48 2025 [00] [*] scanner.l:1446:main Incorrect
maxsamples (1996). Expected 19960.
Sat Apr 26 03:33:48 2025 [00] [+] Max samples/buffer[0]: 1996
[WARNING] [0/Radio#0] Ignoring stream command for finite acquisition
of zero samples
I hope this reads OK. Maybe next time I should attach the code:)

 TIA
 Nikos

 _______________________________________________
 USRP-users mailing list --usrp-users@lists.ettus.com
 To unsubscribe send an email tousrp-users-leave@lists.ettus.com

I believe that max number of samples-per-buffer is limited by MTU
size.   Which is typically around 8000 or so for "jumbo frames".

On 25/04/2025 22:26, Nikos Balkanas wrote: > Thanks Marcus, > > for your fast reply. > > On Sat, Apr 26, 2025 at 4:08 AM Marcus D. Leech > <patchvonbraun@gmail.com> wrote: > > On 25/04/2025 20:50, Nikos Balkanas wrote: >> Hello, >> >> I need to buy a new NIC. What would you suggest? >> The one I use is an old Mellanox 10 Gbs, before the Connect-4 series. >> It can only do 1996 S/s, need 19960 (10x more) to work with >> latest uhd. >> Using Ubuntu 24.04 and uhd 4.6.0 > So, 1.996ksps vs 19.960ksps?   You hardly need a 10Gbit link to > support that.  So, perhaps something >   is being lost here in your requirements? > > > True. Can't explain it in terms of bandwidth. 16 * 1996 = 31.936 Kbps, > 16 * 19960 = 319.360 Kbps well short of a 10 Gbps line:( > Does a complex pair count as 1 sample, or 2? > I have followed all the instructions in > https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks, > Even installed the DPDK drivers. My Mellanox is too old to use their > OFED drivers:( > >> >> On a related question. it seems that the streamer doesn't crash >> anymore >> when receiving less than MAXSPS samples, instead it reads 0:( >> This was due to the sse2 code not aligned in convert. >> I change my stream args to cpu_format=sc16, otw=sc16, so no >> conversion required. >> Streamer still doesn't read anything. Is there a reason for it? >> > You'd need to share more of your code.  This should just work as > far as I can tell. > > Thanks. these are just the usrp code: > > int main() > { > uhd_stream_args_t stream_args = >                                                            { >   .cpu_format = "sc16", >   .otw_format = "sc16", >   .args = "", >   .n_channels = 1, >    .channel_list = &channel >  }; > ..uhd_stream_cmd_t stream_cmd = >  { >    .stream_mode = UHD_STREAM_MODE_NUM_SAMPS_AND_DONE, >     .stream_now = true >   }; > > if (uhd_init(0, 0, gain)) do_exit(20); > if ((err = uhd_usrp_get_rx_stream(dev[0], &stream_args, > rx_streamer[0]))) > { > uhd_get_last_error(errmsg, 127); > error(log, "Failed to get streamer[0] (%d). %s.\n", 0, FL, LN, FN, > err, errmsg); > uhd_rx_streamer_free(&rx_streamer[0]); > rx_streamer[0] = NULL; > uhd_rx_metadata_free(&md[0]); > md[0] = NULL; > do_exit(30); > } > if ((err = uhd_rx_streamer_max_num_samps(rx_streamer[0], &maxsamps))) > > { > uhd_get_last_error(errmsg, 127); > error(log, "Failed to get max samples/buffer[0] (%d). %s.\n", 0, > FL, LN, FN, err, > ..errmsg); > do_exit(35); > } > if (maxsamps != MAXSMPS) > warn(log, "Incorrect maxsamples (%ld). Expected %d.\n", 0, FL, LN, > FN, maxsamps, > MAXSMPS); > info(log, "Max samples/buffer[0]: %ld\n", 0, maxsamps); > >     if ((err = uhd_rx_streamer_issue_stream_cmd(rx_streamer[0], > &stream_cmd))) > > { > uhd_get_last_error(errmsg, 127); > error(log, "Failed to start streamer[0] (%d). %s.\n", 0, FL, LN, > FN, err, errmsg); > do_exit(40); > } > >    [...] >  do_exit(0) >      } > > bool uhd_init(size_t channel, double srate, double gain) > { > double tmp; > uhd_rx_metadata_error_code_t err; > > if ((err = uhd_set_thread_priority(uhd_default_thread_priority, > true))) > warn(log, "Unable to set  main thread priority (%d). %s.\n", 0, > FL, LN, FN, > err, uhdError(err)); > /* Create USRP */ > f ((err = uhd_usrp_make(&dev[channel], "type=x300"))) > { > error(log, "Failed to create USRP (%d). %s.\n", 0, FL, LN, FN, err, > uhdError(err)); > dev[channel] = NULL; >       return(FAIL); > > } > info(stderr, "Created USRP with args\n", 0); > > /* Create RX streamer */ > if ((err = uhd_rx_streamer_make(&rx_streamer[channel]))) > { > error(log, "Failed to create rx_streamer[%d] (%d). %s.\n", 0, FL, > LN, FN, > channel, err, uhdError(err)); > return(FAIL); > } > /* Create RX metadata */ > if ((err = uhd_rx_metadata_make(&md[channel]))) > { > error(log, "Failed to create md[%d] (%d). %s.\n", 0, FL, LN, FN, > channel, > err, uhdError(err)); > return(FAIL); > } > > /* Get master clock rate */ > if ((err = uhd_usrp_get_master_clock_rate(dev[channel], 0, &tmp))) > > { > error(log, "Failed to set master clock to %.0lf Mhz (%d). %s.\n", > 0, FL, > LN, FN, tmp/1000000, err, uhdError(err)); > return(FAIL); > } > info(stderr, "Master clock is at %.0lf Mhz\n", 0, tmp/1000000); > /* Set the sample rate */ > if (srate && !uhd_set_rx_rate_check(channel, srate)) return(FAIL); > /* Set the tuner gain SBX-120 is 0-31.5 in .5 db steps */ > >    if ((err = uhd_usrp_set_rx_gain(dev[channel], gain, channel, ""))) > { > error(log, "Failed to set tuner[%d] gain to %.0lf db (%d). %s.\n", > 0, FL, > LN, FN, channel, gain, err, uhdError(err)); > return(FAIL); > } >    if (!(err = uhd_usrp_get_rx_gain(dev[channel], channel, "", &tmp))) > info(log, "Tuner[%d] gain set to %.0lf (%.0lf) dB\n", 0, channel, > tmp,gain); > > ./* Set channel bw to conserve tuner resources. Not needed, set by > srate */ > uhd_usrp_set_rx_bandwidth(dev[channel], srate, channel); > ./* Disable subtracting constant averaged background. Signal looks > cleaner */ > if ((err = uhd_usrp_set_rx_dc_offset_enabled(dev[channel], false, > channel))) > { > warn(log, "Failed to disable FPGA DC offset on channel %d(%d). %s.\n", 0, > FL, LN, FN, channel, err, uhdError(err)); > } > info(stderr, "Disabled FPGA DC offset on channel %d\n", 0, channel); > return(SUCCESS); >    } > > This is the generated output: > > [INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300; > UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1 > [INFO] [X300] X300 initialization sequence... > [INFO] [X300] Maximum frame size: 8000 bytes. > [INFO] [X300] Radio 1x clock: 200 MHz > Sat Apr 26 03:33:48 2025 [00] [+] Created USRP with args > Sat Apr 26 03:33:48 2025 [00] [+] Master clock is at 200 Mhz > Sat Apr 26 03:33:48 2025 [00] [+] Tuner[0] gain set to 30 (30) dB > Sat Apr 26 03:33:48 2025 [00] [*] scanner.l:1446:main Incorrect > maxsamples (1996). Expected 19960. > Sat Apr 26 03:33:48 2025 [00] [+] Max samples/buffer[0]: 1996 > [WARNING] [0/Radio#0] Ignoring stream command for finite acquisition > of zero samples > I hope this reads OK. Maybe next time I should attach the code:) > >> TIA >> Nikos >> >> _______________________________________________ >> USRP-users mailing list --usrp-users@lists.ettus.com >> To unsubscribe send an email tousrp-users-leave@lists.ettus.com > I believe that max number of samples-per-buffer is limited by MTU size.   Which is typically around 8000 or so for "jumbo frames".
NB
Nikos Balkanas
Sat, Apr 26, 2025 3:33 AM

Actually MTU is 9000. This is one of the recommendations...
I tried it with MTU 1500. It was worse:(
maxsamples dropped to 364...

[INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300;
UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1
[INFO] [X300] X300 initialization sequence...
[INFO] [X300] Maximum frame size: 1472 bytes.
[WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a send
frame size of at least 8000 for best
performance, but your configuration will only allow 1472.This may
negatively impact your maximum achievable sample rate.
Check the MTU on the interface and/or the send_frame_size argument.
[WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a receive
frame size of at least 8000 for best
performance, but your configuration will only allow 1472.This may
negatively impact your maximum achievable sample rate.
Check the MTU on the interface and/or the recv_frame_size argument.
[INFO] [GPS] No GPSDO found
[INFO] [X300] Radio 1x clock: 200 MHz
[WARNING] [UDP] The send buffer could not be resized sufficiently.
Target sock buff size: 24912805 bytes.
Actual sock buff size: 1048576 bytes.
See the transport application notes on buffer resizing.
Please run: sudo sysctl -w net.core.wmem_max=24912805
Sat Apr 26 06:30:34 2025 [00] [+] Created USRP with args
Sat Apr 26 06:30:34 2025 [00] [+] Master clock is at 200 Mhz
Sat Apr 26 06:30:34 2025 [00] [+] Tuner[0] gain set to 30 (30) dB
[WARNING] [UDP] The send buffer could not be resized sufficiently.
Target sock buff size: 24912805 bytes.
Actual sock buff size: 1048576 bytes.
See the transport application notes on buffer resizing.
Please run: sudo sysctl -w net.core.wmem_max=24912805
Sat Apr 26 06:30:34 2025 [00] [*] scanner.l:1446:main Incorrect maxsamples
(364). Expected 19960.
Sat Apr 26 06:30:34 2025 [00] [+] Max samples/buffer[0]: 364
[WARNING] [0/Radio#0] Ignoring stream command for finite acquisition of
zero sam

Nikos

On Sat, Apr 26, 2025 at 5:46 AM Marcus D. Leech patchvonbraun@gmail.com
wrote:

On 25/04/2025 22:26, Nikos Balkanas wrote:

Thanks Marcus,

for your fast reply.

On Sat, Apr 26, 2025 at 4:08 AM Marcus D. Leech patchvonbraun@gmail.com
wrote:

On 25/04/2025 20:50, Nikos Balkanas wrote:

Hello,

I need to buy a new NIC. What would you suggest?
The one I use is an old Mellanox 10 Gbs, before the Connect-4 series.
It can only do 1996 S/s, need 19960 (10x more) to work with latest uhd.
Using Ubuntu 24.04 and uhd 4.6.0

So, 1.996ksps vs 19.960ksps?  You hardly need a 10Gbit link to support
that.  So, perhaps something
is being lost here in your requirements?

True. Can't explain it in terms of bandwidth. 16 * 1996 = 31.936 Kbps, 16

On a related question. it seems that the streamer doesn't crash anymore
when receiving less than MAXSPS samples, instead it reads 0:(
This was due to the sse2 code not aligned in convert.
I change my stream args to cpu_format=sc16, otw=sc16, so no conversion
required.
Streamer still doesn't read anything. Is there a reason for it?

You'd need to share more of your code.  This should just work as far as I
can tell.

Thanks. these are just the usrp code:

int main()
{
uhd_stream_args_t stream_args =
{
.cpu_format
= "sc16",
.otw_format
= "sc16",
.args = "",
.n_channels
= 1,

.channel_list = &channel
};
..uhd_stream_cmd_t stream_cmd =
{

.stream_mode = UHD_STREAM_MODE_NUM_SAMPS_AND_DONE,

.stream_now = true
};

 if (uhd_init(0, 0, gain)) do_exit(20);
 if ((err = uhd_usrp_get_rx_stream(dev[0], &stream_args,

rx_streamer[0])))
{
uhd_get_last_error(errmsg, 127);
error(log, "Failed to get streamer[0] (%d). %s.\n", 0, FL, LN,
FN, err, errmsg);
uhd_rx_streamer_free(&rx_streamer[0]);
rx_streamer[0] = NULL;
uhd_rx_metadata_free(&md[0]);
md[0] = NULL;
do_exit(30);
}
if ((err = uhd_rx_streamer_max_num_samps(rx_streamer[0],
&maxsamps)))

  {
      uhd_get_last_error(errmsg, 127);
      error(log, "Failed to get max samples/buffer[0] (%d). %s.\n",

0, FL, LN, FN, err,
..errmsg);
do_exit(35);
}
if (maxsamps != MAXSMPS)
warn(log, "Incorrect maxsamples (%ld). Expected %d.\n", 0, FL,
LN, FN, maxsamps,
MAXSMPS);
info(log, "Max samples/buffer[0]: %ld\n", 0, maxsamps);

 if ((err = uhd_rx_streamer_issue_stream_cmd(rx_streamer[0],

&stream_cmd)))

 {
     uhd_get_last_error(errmsg, 127);
     error(log, "Failed to start streamer[0] (%d). %s.\n", 0, FL, LN,

FN, err, errmsg);
do_exit(40);
}

      [...]
      do_exit(0)
  }

bool uhd_init(size_t channel, double srate, double gain)
{
double tmp;
uhd_rx_metadata_error_code_t err;

  if ((err = uhd_set_thread_priority(uhd_default_thread_priority,

true)))
warn(log, "Unable to set  main thread priority (%d). %s.\n",
0, FL, LN, FN,
err, uhdError(err));
/* Create USRP */
f ((err = uhd_usrp_make(&dev[channel], "type=x300")))
{
error(log, "Failed to create USRP (%d). %s.\n", 0, FL, LN, FN,
err,
uhdError(err));
dev[channel] = NULL;
return(FAIL);

      }
      info(stderr, "Created USRP with args\n", 0);

 /* Create RX streamer */
 if ((err = uhd_rx_streamer_make(&rx_streamer[channel])))
 {
     error(log, "Failed to create rx_streamer[%d] (%d). %s.\n", 0,

FL, LN, FN,
channel, err, uhdError(err));
return(FAIL);
}
/* Create RX metadata */
if ((err = uhd_rx_metadata_make(&md[channel])))
{
error(log, "Failed to create md[%d] (%d). %s.\n", 0, FL, LN, FN,
channel,
err, uhdError(err));
return(FAIL);
}

 /* Get master clock rate */
  if ((err = uhd_usrp_get_master_clock_rate(dev[channel], 0, &tmp)))
   {
        error(log, "Failed to set master clock to %.0lf Mhz (%d).

%s.\n", 0, FL,
LN, FN, tmp/1000000, err, uhdError(err));
return(FAIL);
}
info(stderr, "Master clock is at %.0lf Mhz\n", 0, tmp/1000000);
/* Set the sample rate /
if (srate && !uhd_set_rx_rate_check(channel, srate)) return(FAIL);
/
Set the tuner gain SBX-120 is 0-31.5 in .5 db steps */

    if ((err = uhd_usrp_set_rx_gain(dev[channel], gain, channel, "")))
    {
         error(log, "Failed to set tuner[%d] gain to %.0lf db (%d).

%s.\n", 0, FL,
LN, FN, channel, gain, err, uhdError(err));
return(FAIL);
}
if (!(err = uhd_usrp_get_rx_gain(dev[channel], channel, "",
&tmp)))
info(log, "Tuner[%d] gain set to %.0lf (%.0lf) dB\n", 0,
channel, tmp, gain);

     ./* Set channel bw to conserve tuner resources. Not needed, set

by srate /
uhd_usrp_set_rx_bandwidth(dev[channel], srate, channel);
./
Disable subtracting constant averaged background. Signal
looks cleaner */
if ((err = uhd_usrp_set_rx_dc_offset_enabled(dev[channel],
false, channel)))
{
warn(log, "Failed to disable FPGA DC offset on channel
%d(%d). %s.\n", 0,
FL, LN, FN, channel, err, uhdError(err));
}
info(stderr, "Disabled FPGA DC offset on channel %d\n", 0,
channel);
return(SUCCESS);
}

This is the generated output:

[INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300;
UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1
[INFO] [X300] X300 initialization sequence...
[INFO] [X300] Maximum frame size: 8000 bytes.
[INFO] [X300] Radio 1x clock: 200 MHz
Sat Apr 26 03:33:48 2025 [00] [+] Created USRP with args
Sat Apr 26 03:33:48 2025 [00] [+] Master clock is at 200 Mhz
Sat Apr 26 03:33:48 2025 [00] [+] Tuner[0] gain set to 30 (30) dB
Sat Apr 26 03:33:48 2025 [00] [*] scanner.l:1446:main Incorrect maxsamples
(1996). Expected 19960.
Sat Apr 26 03:33:48 2025 [00] [+] Max samples/buffer[0]: 1996
[WARNING] [0/Radio#0] Ignoring stream command for finite acquisition of
zero samples
I hope this reads OK. Maybe next time I should attach the code:)

TIA
Nikos


USRP-users mailing list -- usrp-users@lists.ettus.com
To unsubscribe send an email to usrp-users-leave@lists.ettus.com

I believe that max number of samples-per-buffer is limited by MTU size.

Which is typically around 8000 or so for "jumbo frames".

Actually MTU is 9000. This is one of the recommendations... I tried it with MTU 1500. It was worse:( maxsamples dropped to 364... [INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300; UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1 [INFO] [X300] X300 initialization sequence... [INFO] [X300] Maximum frame size: 1472 bytes. [WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a send frame size of at least 8000 for best performance, but your configuration will only allow 1472.This may negatively impact your maximum achievable sample rate. Check the MTU on the interface and/or the send_frame_size argument. [WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a receive frame size of at least 8000 for best performance, but your configuration will only allow 1472.This may negatively impact your maximum achievable sample rate. Check the MTU on the interface and/or the recv_frame_size argument. [INFO] [GPS] No GPSDO found [INFO] [X300] Radio 1x clock: 200 MHz [WARNING] [UDP] The send buffer could not be resized sufficiently. Target sock buff size: 24912805 bytes. Actual sock buff size: 1048576 bytes. See the transport application notes on buffer resizing. Please run: sudo sysctl -w net.core.wmem_max=24912805 Sat Apr 26 06:30:34 2025 [00] [+] Created USRP with args Sat Apr 26 06:30:34 2025 [00] [+] Master clock is at 200 Mhz Sat Apr 26 06:30:34 2025 [00] [+] Tuner[0] gain set to 30 (30) dB [WARNING] [UDP] The send buffer could not be resized sufficiently. Target sock buff size: 24912805 bytes. Actual sock buff size: 1048576 bytes. See the transport application notes on buffer resizing. Please run: sudo sysctl -w net.core.wmem_max=24912805 Sat Apr 26 06:30:34 2025 [00] [*] scanner.l:1446:main Incorrect maxsamples (364). Expected 19960. Sat Apr 26 06:30:34 2025 [00] [+] Max samples/buffer[0]: 364 [WARNING] [0/Radio#0] Ignoring stream command for finite acquisition of zero sam Nikos On Sat, Apr 26, 2025 at 5:46 AM Marcus D. Leech <patchvonbraun@gmail.com> wrote: > On 25/04/2025 22:26, Nikos Balkanas wrote: > > Thanks Marcus, > > for your fast reply. > > On Sat, Apr 26, 2025 at 4:08 AM Marcus D. Leech <patchvonbraun@gmail.com> > wrote: > >> On 25/04/2025 20:50, Nikos Balkanas wrote: >> >> Hello, >> >> I need to buy a new NIC. What would you suggest? >> The one I use is an old Mellanox 10 Gbs, before the Connect-4 series. >> It can only do 1996 S/s, need 19960 (10x more) to work with latest uhd. >> Using Ubuntu 24.04 and uhd 4.6.0 >> >> So, 1.996ksps vs 19.960ksps? You hardly need a 10Gbit link to support >> that. So, perhaps something >> is being lost here in your requirements? >> > > True. Can't explain it in terms of bandwidth. 16 * 1996 = 31.936 Kbps, 16 > * 19960 = 319.360 Kbps well short of a 10 Gbps line:( > Does a complex pair count as 1 sample, or 2? > I have followed all the instructions in > https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks, > Even installed the DPDK drivers. My Mellanox is too old to use their OFED > drivers:( > >> >> On a related question. it seems that the streamer doesn't crash anymore >> when receiving less than MAXSPS samples, instead it reads 0:( >> This was due to the sse2 code not aligned in convert. >> I change my stream args to cpu_format=sc16, otw=sc16, so no conversion >> required. >> Streamer still doesn't read anything. Is there a reason for it? >> >> You'd need to share more of your code. This should just work as far as I >> can tell. >> >> Thanks. these are just the usrp code: > > int main() > { > uhd_stream_args_t stream_args = > { > .cpu_format > = "sc16", > .otw_format > = "sc16", > .args = "", > .n_channels > = 1, > > .channel_list = &channel > }; > ..uhd_stream_cmd_t stream_cmd = > { > > .stream_mode = UHD_STREAM_MODE_NUM_SAMPS_AND_DONE, > > .stream_now = true > }; > > if (uhd_init(0, 0, gain)) do_exit(20); >> if ((err = uhd_usrp_get_rx_stream(dev[0], &stream_args, >> rx_streamer[0]))) >> { >> uhd_get_last_error(errmsg, 127); >> error(log, "Failed to get streamer[0] (%d). %s.\n", 0, FL, LN, >> FN, err, errmsg); >> uhd_rx_streamer_free(&rx_streamer[0]); >> rx_streamer[0] = NULL; >> uhd_rx_metadata_free(&md[0]); >> md[0] = NULL; >> do_exit(30); >> } >> if ((err = uhd_rx_streamer_max_num_samps(rx_streamer[0], >> &maxsamps))) >> > { >> uhd_get_last_error(errmsg, 127); >> error(log, "Failed to get max samples/buffer[0] (%d). %s.\n", >> 0, FL, LN, FN, err, >> ..errmsg); >> do_exit(35); >> } >> if (maxsamps != MAXSMPS) >> warn(log, "Incorrect maxsamples (%ld). Expected %d.\n", 0, FL, >> LN, FN, maxsamps, >> MAXSMPS); >> info(log, "Max samples/buffer[0]: %ld\n", 0, maxsamps); >> >> if ((err = uhd_rx_streamer_issue_stream_cmd(rx_streamer[0], >> &stream_cmd))) >> > { >> uhd_get_last_error(errmsg, 127); >> error(log, "Failed to start streamer[0] (%d). %s.\n", 0, FL, LN, >> FN, err, errmsg); >> do_exit(40); >> } >> > [...] > do_exit(0) > } > > >> bool uhd_init(size_t channel, double srate, double gain) >> { >> double tmp; >> uhd_rx_metadata_error_code_t err; >> >> if ((err = uhd_set_thread_priority(uhd_default_thread_priority, >> true))) >> warn(log, "Unable to set main thread priority (%d). %s.\n", >> 0, FL, LN, FN, >> err, uhdError(err)); >> /* Create USRP */ >> f ((err = uhd_usrp_make(&dev[channel], "type=x300"))) >> { >> error(log, "Failed to create USRP (%d). %s.\n", 0, FL, LN, FN, >> err, >> uhdError(err)); >> dev[channel] = NULL; >> return(FAIL); >> > } >> info(stderr, "Created USRP with args\n", 0); >> >> /* Create RX streamer */ >> if ((err = uhd_rx_streamer_make(&rx_streamer[channel]))) >> { >> error(log, "Failed to create rx_streamer[%d] (%d). %s.\n", 0, >> FL, LN, FN, >> channel, err, uhdError(err)); >> return(FAIL); >> } >> /* Create RX metadata */ >> if ((err = uhd_rx_metadata_make(&md[channel]))) >> { >> error(log, "Failed to create md[%d] (%d). %s.\n", 0, FL, LN, FN, >> channel, >> err, uhdError(err)); >> return(FAIL); >> } >> >> /* Get master clock rate */ >> if ((err = uhd_usrp_get_master_clock_rate(dev[channel], 0, &tmp))) >> > { >> error(log, "Failed to set master clock to %.0lf Mhz (%d). >> %s.\n", 0, FL, >> LN, FN, tmp/1000000, err, uhdError(err)); >> return(FAIL); >> } >> info(stderr, "Master clock is at %.0lf Mhz\n", 0, tmp/1000000); >> /* Set the sample rate */ >> if (srate && !uhd_set_rx_rate_check(channel, srate)) return(FAIL); >> /* Set the tuner gain SBX-120 is 0-31.5 in .5 db steps */ >> > if ((err = uhd_usrp_set_rx_gain(dev[channel], gain, channel, ""))) >> { >> error(log, "Failed to set tuner[%d] gain to %.0lf db (%d). >> %s.\n", 0, FL, >> LN, FN, channel, gain, err, uhdError(err)); >> return(FAIL); >> } >> if (!(err = uhd_usrp_get_rx_gain(dev[channel], channel, "", >> &tmp))) >> info(log, "Tuner[%d] gain set to %.0lf (%.0lf) dB\n", 0, >> channel, tmp, gain); >> > ./* Set channel bw to conserve tuner resources. Not needed, set > by srate */ > uhd_usrp_set_rx_bandwidth(dev[channel], srate, channel); > ./* Disable subtracting constant averaged background. Signal > looks cleaner */ > if ((err = uhd_usrp_set_rx_dc_offset_enabled(dev[channel], > false, channel))) > { > warn(log, "Failed to disable FPGA DC offset on channel > %d(%d). %s.\n", 0, > FL, LN, FN, channel, err, uhdError(err)); > } > info(stderr, "Disabled FPGA DC offset on channel %d\n", 0, > channel); > return(SUCCESS); > } > > This is the generated output: > > [INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300; > UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1 > [INFO] [X300] X300 initialization sequence... > [INFO] [X300] Maximum frame size: 8000 bytes. > [INFO] [X300] Radio 1x clock: 200 MHz > Sat Apr 26 03:33:48 2025 [00] [+] Created USRP with args > Sat Apr 26 03:33:48 2025 [00] [+] Master clock is at 200 Mhz > Sat Apr 26 03:33:48 2025 [00] [+] Tuner[0] gain set to 30 (30) dB > Sat Apr 26 03:33:48 2025 [00] [*] scanner.l:1446:main Incorrect maxsamples > (1996). Expected 19960. > Sat Apr 26 03:33:48 2025 [00] [+] Max samples/buffer[0]: 1996 > [WARNING] [0/Radio#0] Ignoring stream command for finite acquisition of > zero samples > I hope this reads OK. Maybe next time I should attach the code:) > >> TIA >> Nikos >> >> _______________________________________________ >> USRP-users mailing list -- usrp-users@lists.ettus.com >> To unsubscribe send an email to usrp-users-leave@lists.ettus.com >> >> >> I believe that max number of samples-per-buffer is limited by MTU size. > Which is typically around 8000 or so for "jumbo frames". > > >
MD
Marcus D. Leech
Sat, Apr 26, 2025 3:45 AM

On 25/04/2025 23:33, Nikos Balkanas wrote:

Actually MTU is 9000. This is one of the recommendations...
I tried it with MTU 1500. It was worse:(
maxsamples dropped to 364...

Right, 9000, rather than 8000.

Upgrading to 10Gbit wont' give you larger MTU.

What you're trying to do, I think, is to solve a buffer-management
problem in your application at entirely the wrong
  level in the stack.

It is EXCEEDINGLY COMMON for hardware drivers to only be able to deliver
in chunks that may not be perfectly adapted to
  the requirements of your application.  So, a common programming
pattern is to deal with this in your application.

You should probably look at example code like rx_samples_to_file

[INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300;
UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1
[INFO] [X300] X300 initialization sequence...
[INFO] [X300] Maximum frame size: 1472 bytes.
[WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a
send frame size of at least 8000 for best
performance, but your configuration will only allow 1472.This may
negatively impact your maximum achievable sample rate.
Check the MTU on the interface and/or the send_frame_size argument.
[WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a
receive frame size of at least 8000 for best
performance, but your configuration will only allow 1472.This may
negatively impact your maximum achievable sample rate.
Check the MTU on the interface and/or the recv_frame_size argument.
[INFO] [GPS] No GPSDO found
[INFO] [X300] Radio 1x clock: 200 MHz
[WARNING] [UDP] The send buffer could not be resized sufficiently.
Target sock buff size: 24912805 bytes.
Actual sock buff size: 1048576 bytes.
See the transport application notes on buffer resizing.
Please run: sudo sysctl -w net.core.wmem_max=24912805
Sat Apr 26 06:30:34 2025 [00] [+] Created USRP with args
Sat Apr 26 06:30:34 2025 [00] [+] Master clock is at 200 Mhz
Sat Apr 26 06:30:34 2025 [00] [+] Tuner[0] gain set to 30 (30) dB
[WARNING] [UDP] The send buffer could not be resized sufficiently.
Target sock buff size: 24912805 bytes.
Actual sock buff size: 1048576 bytes.
See the transport application notes on buffer resizing.
Please run: sudo sysctl -w net.core.wmem_max=24912805
Sat Apr 26 06:30:34 2025 [00] [*] scanner.l:1446:main Incorrect
maxsamples (364). Expected 19960.
Sat Apr 26 06:30:34 2025 [00] [+] Max samples/buffer[0]: 364
[WARNING] [0/Radio#0] Ignoring stream command for finite acquisition
of zero sam

Nikos

On Sat, Apr 26, 2025 at 5:46 AM Marcus D. Leech
patchvonbraun@gmail.com wrote:

 On 25/04/2025 22:26, Nikos Balkanas wrote:
 Thanks Marcus,

 for your fast reply.

 On Sat, Apr 26, 2025 at 4:08 AM Marcus D. Leech
 <patchvonbraun@gmail.com> wrote:

     On 25/04/2025 20:50, Nikos Balkanas wrote:
     Hello,

     I need to buy a new NIC. What would you suggest?
     The one I use is an old Mellanox 10 Gbs, before the
     Connect-4 series.
     It can only do 1996 S/s, need 19960 (10x more) to work with
     latest uhd.
     Using Ubuntu 24.04 and uhd 4.6.0
     So, 1.996ksps vs 19.960ksps?   You hardly need a 10Gbit link
     to support that.  So, perhaps something
       is being lost here in your requirements?


 True. Can't explain it in terms of bandwidth. 16 * 1996 = 31.936
 Kbps, 16 * 19960 = 319.360 Kbps well short of a 10 Gbps line:(
 Does a complex pair count as 1 sample, or 2?
 I have followed all the instructions in
 https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks,
 Even installed the DPDK drivers. My Mellanox is too old to use
 their OFED drivers:(
     On a related question. it seems that the streamer doesn't
     crash anymore
     when receiving less than MAXSPS samples, instead it reads 0:(
     This was due to the sse2 code not aligned in convert.
     I change my stream args to cpu_format=sc16, otw=sc16, so no
     conversion required.
     Streamer still doesn't read anything. Is there a reason for it?
     You'd need to share more of your code.  This should just work
     as far as I can tell.

 Thanks. these are just the usrp code:

 int main()
 {
   uhd_stream_args_t stream_args =
        {
           .cpu_format = "sc16",
           .otw_format = "sc16",
           .args = "",
           .n_channels = 1,
            .channel_list = &channel
          };
 ..uhd_stream_cmd_t stream_cmd =
          {
            .stream_mode = UHD_STREAM_MODE_NUM_SAMPS_AND_DONE,
             .stream_now = true
           };

     if (uhd_init(0, 0, gain)) do_exit(20);
     if ((err = uhd_usrp_get_rx_stream(dev[0], &stream_args,
     rx_streamer[0])))
     {
     uhd_get_last_error(errmsg, 127);
     error(log, "Failed to get streamer[0] (%d). %s.\n", 0, FL,
     LN, FN, err, errmsg);
     uhd_rx_streamer_free(&rx_streamer[0]);
     rx_streamer[0] = NULL;
     uhd_rx_metadata_free(&md[0]);
     md[0] = NULL;
     do_exit(30);
     }
     if ((err = uhd_rx_streamer_max_num_samps(rx_streamer[0],
     &maxsamps)))

     {
     uhd_get_last_error(errmsg, 127);
     error(log, "Failed to get max samples/buffer[0] (%d). %s.\n",
     0, FL, LN, FN, err,
     ..errmsg);
     do_exit(35);
     }
     if (maxsamps != MAXSMPS)
     warn(log, "Incorrect maxsamples (%ld). Expected %d.\n", 0,
     FL, LN, FN, maxsamps,
     MAXSMPS);
     info(log, "Max samples/buffer[0]: %ld\n", 0, maxsamps);

         if ((err =
     uhd_rx_streamer_issue_stream_cmd(rx_streamer[0], &stream_cmd)))

     {
     uhd_get_last_error(errmsg, 127);
     error(log, "Failed to start streamer[0] (%d). %s.\n", 0, FL,
     LN, FN, err, errmsg);
     do_exit(40);
     }

          [...]
      do_exit(0)
  }

     bool uhd_init(size_t channel, double srate, double gain)
     {
     double tmp;
     uhd_rx_metadata_error_code_t err;

     if ((err =
     uhd_set_thread_priority(uhd_default_thread_priority, true)))
     warn(log, "Unable to set  main thread priority (%d). %s.\n",
     0, FL, LN, FN,
     err, uhdError(err));
     /* Create USRP */
     f ((err = uhd_usrp_make(&dev[channel], "type=x300")))
     {
     error(log, "Failed to create USRP (%d). %s.\n", 0, FL, LN,
     FN, err,
     uhdError(err));
     dev[channel] = NULL;
                 return(FAIL);

     }
     info(stderr, "Created USRP with args\n", 0);

     /* Create RX streamer */
     if ((err = uhd_rx_streamer_make(&rx_streamer[channel])))
     {
     error(log, "Failed to create rx_streamer[%d] (%d). %s.\n", 0,
     FL, LN, FN,
     channel, err, uhdError(err));
     return(FAIL);
     }
     /* Create RX metadata */
     if ((err = uhd_rx_metadata_make(&md[channel])))
     {
     error(log, "Failed to create md[%d] (%d). %s.\n", 0, FL, LN,
     FN, channel,
     err, uhdError(err));
     return(FAIL);
     }

     /* Get master clock rate */
     if ((err = uhd_usrp_get_master_clock_rate(dev[channel], 0,
     &tmp)))

     {
     error(log, "Failed to set master clock to %.0lf Mhz (%d).
     %s.\n", 0, FL,
     LN, FN, tmp/1000000, err, uhdError(err));
     return(FAIL);
     }
     info(stderr, "Master clock is at %.0lf Mhz\n", 0, tmp/1000000);
     /* Set the sample rate */
     if (srate && !uhd_set_rx_rate_check(channel, srate))
     return(FAIL);
     /* Set the tuner gain SBX-120 is 0-31.5 in .5 db steps */

            if ((err = uhd_usrp_set_rx_gain(dev[channel], gain,
     channel, "")))
     {
     error(log, "Failed to set tuner[%d] gain to %.0lf db (%d).
     %s.\n", 0, FL,
     LN, FN, channel, gain, err, uhdError(err));
     return(FAIL);
     }
              if (!(err = uhd_usrp_get_rx_gain(dev[channel],
     channel, "", &tmp)))
     info(log, "Tuner[%d] gain set to %.0lf (%.0lf) dB\n", 0,
     channel, tmp,gain);

 ./* Set channel bw to conserve tuner resources. Not needed, set
 by srate */
 uhd_usrp_set_rx_bandwidth(dev[channel], srate, channel);
 ./* Disable subtracting constant averaged background. Signal
 looks cleaner */
 if ((err = uhd_usrp_set_rx_dc_offset_enabled(dev[channel], false,
 channel)))
 {
 warn(log, "Failed to disable FPGA DC offset on channel %d(%d).
 %s.\n", 0,
 FL, LN, FN, channel, err, uhdError(err));
 }
 info(stderr, "Disabled FPGA DC offset on channel %d\n", 0, channel);
 return(SUCCESS);
          }

 This is the generated output:

 [INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300;
 UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1
 [INFO] [X300] X300 initialization sequence...
 [INFO] [X300] Maximum frame size: 8000 bytes.
 [INFO] [X300] Radio 1x clock: 200 MHz
 Sat Apr 26 03:33:48 2025 [00] [+] Created USRP with args
 Sat Apr 26 03:33:48 2025 [00] [+] Master clock is at 200 Mhz
 Sat Apr 26 03:33:48 2025 [00] [+] Tuner[0] gain set to 30 (30) dB
 Sat Apr 26 03:33:48 2025 [00] [*] scanner.l:1446:main Incorrect
 maxsamples (1996). Expected 19960.
 Sat Apr 26 03:33:48 2025 [00] [+] Max samples/buffer[0]: 1996
 [WARNING] [0/Radio#0] Ignoring stream command for finite
 acquisition of zero samples
 I hope this reads OK. Maybe next time I should attach the code:)
     TIA
     Nikos

     _______________________________________________
     USRP-users mailing list --usrp-users@lists.ettus.com
     To unsubscribe send an email tousrp-users-leave@lists.ettus.com
 I believe that max number of samples-per-buffer is limited by MTU
 size.   Which is typically around 8000 or so for "jumbo frames".
On 25/04/2025 23:33, Nikos Balkanas wrote: > Actually MTU is 9000. This is one of the recommendations... > I tried it with MTU 1500. It was worse:( > maxsamples dropped to 364... Right, 9000, rather than 8000. Upgrading to 10Gbit wont' give you larger MTU. What you're trying to do, I think, is to solve a buffer-management problem in your *application* at entirely the wrong   level in the stack. It is EXCEEDINGLY COMMON for hardware drivers to only be able to deliver in chunks that may not be perfectly adapted to   the requirements of your application.  So, a common programming pattern is to deal with this in your application. You should probably look at example code like rx_samples_to_file > > [INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300; > UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1 > [INFO] [X300] X300 initialization sequence... > [INFO] [X300] Maximum frame size: 1472 bytes. > [WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a > send frame size of at least 8000 for best > performance, but your configuration will only allow 1472.This may > negatively impact your maximum achievable sample rate. > Check the MTU on the interface and/or the send_frame_size argument. > [WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a > receive frame size of at least 8000 for best > performance, but your configuration will only allow 1472.This may > negatively impact your maximum achievable sample rate. > Check the MTU on the interface and/or the recv_frame_size argument. > [INFO] [GPS] No GPSDO found > [INFO] [X300] Radio 1x clock: 200 MHz > [WARNING] [UDP] The send buffer could not be resized sufficiently. > Target sock buff size: 24912805 bytes. > Actual sock buff size: 1048576 bytes. > See the transport application notes on buffer resizing. > Please run: sudo sysctl -w net.core.wmem_max=24912805 > Sat Apr 26 06:30:34 2025 [00] [+] Created USRP with args > Sat Apr 26 06:30:34 2025 [00] [+] Master clock is at 200 Mhz > Sat Apr 26 06:30:34 2025 [00] [+] Tuner[0] gain set to 30 (30) dB > [WARNING] [UDP] The send buffer could not be resized sufficiently. > Target sock buff size: 24912805 bytes. > Actual sock buff size: 1048576 bytes. > See the transport application notes on buffer resizing. > Please run: sudo sysctl -w net.core.wmem_max=24912805 > Sat Apr 26 06:30:34 2025 [00] [*] scanner.l:1446:main Incorrect > maxsamples (364). Expected 19960. > Sat Apr 26 06:30:34 2025 [00] [+] Max samples/buffer[0]: 364 > [WARNING] [0/Radio#0] Ignoring stream command for finite acquisition > of zero sam > > Nikos > > On Sat, Apr 26, 2025 at 5:46 AM Marcus D. Leech > <patchvonbraun@gmail.com> wrote: > > On 25/04/2025 22:26, Nikos Balkanas wrote: >> Thanks Marcus, >> >> for your fast reply. >> >> On Sat, Apr 26, 2025 at 4:08 AM Marcus D. Leech >> <patchvonbraun@gmail.com> wrote: >> >> On 25/04/2025 20:50, Nikos Balkanas wrote: >>> Hello, >>> >>> I need to buy a new NIC. What would you suggest? >>> The one I use is an old Mellanox 10 Gbs, before the >>> Connect-4 series. >>> It can only do 1996 S/s, need 19960 (10x more) to work with >>> latest uhd. >>> Using Ubuntu 24.04 and uhd 4.6.0 >> So, 1.996ksps vs 19.960ksps?   You hardly need a 10Gbit link >> to support that.  So, perhaps something >>   is being lost here in your requirements? >> >> >> True. Can't explain it in terms of bandwidth. 16 * 1996 = 31.936 >> Kbps, 16 * 19960 = 319.360 Kbps well short of a 10 Gbps line:( >> Does a complex pair count as 1 sample, or 2? >> I have followed all the instructions in >> https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks, >> Even installed the DPDK drivers. My Mellanox is too old to use >> their OFED drivers:( >> >>> >>> On a related question. it seems that the streamer doesn't >>> crash anymore >>> when receiving less than MAXSPS samples, instead it reads 0:( >>> This was due to the sse2 code not aligned in convert. >>> I change my stream args to cpu_format=sc16, otw=sc16, so no >>> conversion required. >>> Streamer still doesn't read anything. Is there a reason for it? >>> >> You'd need to share more of your code.  This should just work >> as far as I can tell. >> >> Thanks. these are just the usrp code: >> >> int main() >> { >>   uhd_stream_args_t stream_args = >>        { >>           .cpu_format = "sc16", >>           .otw_format = "sc16", >>           .args = "", >>           .n_channels = 1, >>            .channel_list = &channel >>          }; >> ..uhd_stream_cmd_t stream_cmd = >>          { >>            .stream_mode = UHD_STREAM_MODE_NUM_SAMPS_AND_DONE, >>             .stream_now = true >>           }; >> >> if (uhd_init(0, 0, gain)) do_exit(20); >> if ((err = uhd_usrp_get_rx_stream(dev[0], &stream_args, >> rx_streamer[0]))) >> { >> uhd_get_last_error(errmsg, 127); >> error(log, "Failed to get streamer[0] (%d). %s.\n", 0, FL, >> LN, FN, err, errmsg); >> uhd_rx_streamer_free(&rx_streamer[0]); >> rx_streamer[0] = NULL; >> uhd_rx_metadata_free(&md[0]); >> md[0] = NULL; >> do_exit(30); >> } >> if ((err = uhd_rx_streamer_max_num_samps(rx_streamer[0], >> &maxsamps))) >> >> { >> uhd_get_last_error(errmsg, 127); >> error(log, "Failed to get max samples/buffer[0] (%d). %s.\n", >> 0, FL, LN, FN, err, >> ..errmsg); >> do_exit(35); >> } >> if (maxsamps != MAXSMPS) >> warn(log, "Incorrect maxsamples (%ld). Expected %d.\n", 0, >> FL, LN, FN, maxsamps, >> MAXSMPS); >> info(log, "Max samples/buffer[0]: %ld\n", 0, maxsamps); >> >>     if ((err = >> uhd_rx_streamer_issue_stream_cmd(rx_streamer[0], &stream_cmd))) >> >> { >> uhd_get_last_error(errmsg, 127); >> error(log, "Failed to start streamer[0] (%d). %s.\n", 0, FL, >> LN, FN, err, errmsg); >> do_exit(40); >> } >> >>          [...] >>      do_exit(0) >>  } >> >> bool uhd_init(size_t channel, double srate, double gain) >> { >> double tmp; >> uhd_rx_metadata_error_code_t err; >> >> if ((err = >> uhd_set_thread_priority(uhd_default_thread_priority, true))) >> warn(log, "Unable to set  main thread priority (%d). %s.\n", >> 0, FL, LN, FN, >> err, uhdError(err)); >> /* Create USRP */ >> f ((err = uhd_usrp_make(&dev[channel], "type=x300"))) >> { >> error(log, "Failed to create USRP (%d). %s.\n", 0, FL, LN, >> FN, err, >> uhdError(err)); >> dev[channel] = NULL; >>             return(FAIL); >> >> } >> info(stderr, "Created USRP with args\n", 0); >> >> /* Create RX streamer */ >> if ((err = uhd_rx_streamer_make(&rx_streamer[channel]))) >> { >> error(log, "Failed to create rx_streamer[%d] (%d). %s.\n", 0, >> FL, LN, FN, >> channel, err, uhdError(err)); >> return(FAIL); >> } >> /* Create RX metadata */ >> if ((err = uhd_rx_metadata_make(&md[channel]))) >> { >> error(log, "Failed to create md[%d] (%d). %s.\n", 0, FL, LN, >> FN, channel, >> err, uhdError(err)); >> return(FAIL); >> } >> >> /* Get master clock rate */ >> if ((err = uhd_usrp_get_master_clock_rate(dev[channel], 0, >> &tmp))) >> >> { >> error(log, "Failed to set master clock to %.0lf Mhz (%d). >> %s.\n", 0, FL, >> LN, FN, tmp/1000000, err, uhdError(err)); >> return(FAIL); >> } >> info(stderr, "Master clock is at %.0lf Mhz\n", 0, tmp/1000000); >> /* Set the sample rate */ >> if (srate && !uhd_set_rx_rate_check(channel, srate)) >> return(FAIL); >> /* Set the tuner gain SBX-120 is 0-31.5 in .5 db steps */ >> >>        if ((err = uhd_usrp_set_rx_gain(dev[channel], gain, >> channel, ""))) >> { >> error(log, "Failed to set tuner[%d] gain to %.0lf db (%d). >> %s.\n", 0, FL, >> LN, FN, channel, gain, err, uhdError(err)); >> return(FAIL); >> } >>          if (!(err = uhd_usrp_get_rx_gain(dev[channel], >> channel, "", &tmp))) >> info(log, "Tuner[%d] gain set to %.0lf (%.0lf) dB\n", 0, >> channel, tmp,gain); >> >> ./* Set channel bw to conserve tuner resources. Not needed, set >> by srate */ >> uhd_usrp_set_rx_bandwidth(dev[channel], srate, channel); >> ./* Disable subtracting constant averaged background. Signal >> looks cleaner */ >> if ((err = uhd_usrp_set_rx_dc_offset_enabled(dev[channel], false, >> channel))) >> { >> warn(log, "Failed to disable FPGA DC offset on channel %d(%d). >> %s.\n", 0, >> FL, LN, FN, channel, err, uhdError(err)); >> } >> info(stderr, "Disabled FPGA DC offset on channel %d\n", 0, channel); >> return(SUCCESS); >>          } >> >> This is the generated output: >> >> [INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300; >> UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1 >> [INFO] [X300] X300 initialization sequence... >> [INFO] [X300] Maximum frame size: 8000 bytes. >> [INFO] [X300] Radio 1x clock: 200 MHz >> Sat Apr 26 03:33:48 2025 [00] [+] Created USRP with args >> Sat Apr 26 03:33:48 2025 [00] [+] Master clock is at 200 Mhz >> Sat Apr 26 03:33:48 2025 [00] [+] Tuner[0] gain set to 30 (30) dB >> Sat Apr 26 03:33:48 2025 [00] [*] scanner.l:1446:main Incorrect >> maxsamples (1996). Expected 19960. >> Sat Apr 26 03:33:48 2025 [00] [+] Max samples/buffer[0]: 1996 >> [WARNING] [0/Radio#0] Ignoring stream command for finite >> acquisition of zero samples >> I hope this reads OK. Maybe next time I should attach the code:) >> >>> TIA >>> Nikos >>> >>> _______________________________________________ >>> USRP-users mailing list --usrp-users@lists.ettus.com >>> To unsubscribe send an email tousrp-users-leave@lists.ettus.com >> > I believe that max number of samples-per-buffer is limited by MTU > size.   Which is typically around 8000 or so for "jumbo frames". > >
NB
Nikos Balkanas
Sat, Apr 26, 2025 4:02 AM

Thanks for your time.
I will check out the example.
This is not a buffer problem. I just need 1024 Samples (real+imaginary) for
FFT...
I should be able to get them in a single pass.
You saw my code, not a smoking gun there.

This is probably is a physical problem.
Cable is an SFP fiber dedicated line. Cannot go bad.
Maybe the connections are not sitting right :(...

BR
Nikos

On Sat, Apr 26, 2025 at 6:45 AM Marcus D. Leech patchvonbraun@gmail.com
wrote:

On 25/04/2025 23:33, Nikos Balkanas wrote:

Actually MTU is 9000. This is one of the recommendations...
I tried it with MTU 1500. It was worse:(
maxsamples dropped to 364...

Right, 9000, rather than 8000.

Upgrading to 10Gbit wont' give you larger MTU.

What you're trying to do, I think, is to solve a buffer-management problem
in your application at entirely the wrong
level in the stack.

It is EXCEEDINGLY COMMON for hardware drivers to only be able to deliver
in chunks that may not be perfectly adapted to
the requirements of your application.  So, a common programming pattern
is to deal with this in your application.

You should probably look at example code like rx_samples_to_file

[INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300;
UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1
[INFO] [X300] X300 initialization sequence...
[INFO] [X300] Maximum frame size: 1472 bytes.
[WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a send
frame size of at least 8000 for best
performance, but your configuration will only allow 1472.This may
negatively impact your maximum achievable sample rate.
Check the MTU on the interface and/or the send_frame_size argument.
[WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a receive
frame size of at least 8000 for best
performance, but your configuration will only allow 1472.This may
negatively impact your maximum achievable sample rate.
Check the MTU on the interface and/or the recv_frame_size argument.
[INFO] [GPS] No GPSDO found
[INFO] [X300] Radio 1x clock: 200 MHz
[WARNING] [UDP] The send buffer could not be resized sufficiently.
Target sock buff size: 24912805 bytes.
Actual sock buff size: 1048576 bytes.
See the transport application notes on buffer resizing.
Please run: sudo sysctl -w net.core.wmem_max=24912805
Sat Apr 26 06:30:34 2025 [00] [+] Created USRP with args
Sat Apr 26 06:30:34 2025 [00] [+] Master clock is at 200 Mhz
Sat Apr 26 06:30:34 2025 [00] [+] Tuner[0] gain set to 30 (30) dB
[WARNING] [UDP] The send buffer could not be resized sufficiently.
Target sock buff size: 24912805 bytes.
Actual sock buff size: 1048576 bytes.
See the transport application notes on buffer resizing.
Please run: sudo sysctl -w net.core.wmem_max=24912805
Sat Apr 26 06:30:34 2025 [00] [*] scanner.l:1446:main Incorrect maxsamples
(364). Expected 19960.
Sat Apr 26 06:30:34 2025 [00] [+] Max samples/buffer[0]: 364
[WARNING] [0/Radio#0] Ignoring stream command for finite acquisition of
zero sam

Nikos

On Sat, Apr 26, 2025 at 5:46 AM Marcus D. Leech patchvonbraun@gmail.com
wrote:

On 25/04/2025 22:26, Nikos Balkanas wrote:

Thanks Marcus,

for your fast reply.

On Sat, Apr 26, 2025 at 4:08 AM Marcus D. Leech patchvonbraun@gmail.com
wrote:

On 25/04/2025 20:50, Nikos Balkanas wrote:

Hello,

I need to buy a new NIC. What would you suggest?
The one I use is an old Mellanox 10 Gbs, before the Connect-4 series.
It can only do 1996 S/s, need 19960 (10x more) to work with latest uhd.
Using Ubuntu 24.04 and uhd 4.6.0

So, 1.996ksps vs 19.960ksps?  You hardly need a 10Gbit link to support
that.  So, perhaps something
is being lost here in your requirements?

True. Can't explain it in terms of bandwidth. 16 * 1996 = 31.936 Kbps, 16

On a related question. it seems that the streamer doesn't crash anymore
when receiving less than MAXSPS samples, instead it reads 0:(
This was due to the sse2 code not aligned in convert.
I change my stream args to cpu_format=sc16, otw=sc16, so no conversion
required.
Streamer still doesn't read anything. Is there a reason for it?

You'd need to share more of your code.  This should just work as far as
I can tell.

Thanks. these are just the usrp code:

int main()
{
uhd_stream_args_t stream_args =
{
.cpu_format
= "sc16",
.otw_format
= "sc16",
.args = "",
.n_channels
= 1,

.channel_list = &channel
};
..uhd_stream_cmd_t stream_cmd =
{

.stream_mode = UHD_STREAM_MODE_NUM_SAMPS_AND_DONE,

.stream_now = true
};

 if (uhd_init(0, 0, gain)) do_exit(20);
 if ((err = uhd_usrp_get_rx_stream(dev[0], &stream_args,

rx_streamer[0])))
{
uhd_get_last_error(errmsg, 127);
error(log, "Failed to get streamer[0] (%d). %s.\n", 0, FL, LN,
FN, err, errmsg);
uhd_rx_streamer_free(&rx_streamer[0]);
rx_streamer[0] = NULL;
uhd_rx_metadata_free(&md[0]);
md[0] = NULL;
do_exit(30);
}
if ((err = uhd_rx_streamer_max_num_samps(rx_streamer[0],
&maxsamps)))

  {
      uhd_get_last_error(errmsg, 127);
      error(log, "Failed to get max samples/buffer[0] (%d). %s.\n",

0, FL, LN, FN, err,
..errmsg);
do_exit(35);
}
if (maxsamps != MAXSMPS)
warn(log, "Incorrect maxsamples (%ld). Expected %d.\n", 0, FL,
LN, FN, maxsamps,
MAXSMPS);
info(log, "Max samples/buffer[0]: %ld\n", 0, maxsamps);

 if ((err = uhd_rx_streamer_issue_stream_cmd(rx_streamer[0],

&stream_cmd)))

 {
     uhd_get_last_error(errmsg, 127);
     error(log, "Failed to start streamer[0] (%d). %s.\n", 0, FL,

LN, FN, err, errmsg);
do_exit(40);
}

      [...]
      do_exit(0)
  }

bool uhd_init(size_t channel, double srate, double gain)
{
double tmp;
uhd_rx_metadata_error_code_t err;

  if ((err = uhd_set_thread_priority(uhd_default_thread_priority,

true)))
warn(log, "Unable to set  main thread priority (%d).
%s.\n", 0, FL, LN, FN,
err, uhdError(err));
/* Create USRP */
f ((err = uhd_usrp_make(&dev[channel], "type=x300")))
{
error(log, "Failed to create USRP (%d). %s.\n", 0, FL, LN,
FN, err,
uhdError(err));
dev[channel] = NULL;
return(FAIL);

      }
      info(stderr, "Created USRP with args\n", 0);

 /* Create RX streamer */
 if ((err = uhd_rx_streamer_make(&rx_streamer[channel])))
 {
     error(log, "Failed to create rx_streamer[%d] (%d). %s.\n", 0,

FL, LN, FN,
channel, err, uhdError(err));
return(FAIL);
}
/* Create RX metadata */
if ((err = uhd_rx_metadata_make(&md[channel])))
{
error(log, "Failed to create md[%d] (%d). %s.\n", 0, FL, LN, FN,
channel,
err, uhdError(err));
return(FAIL);
}

 /* Get master clock rate */
  if ((err = uhd_usrp_get_master_clock_rate(dev[channel], 0, &tmp)))
   {
        error(log, "Failed to set master clock to %.0lf Mhz (%d).

%s.\n", 0, FL,
LN, FN, tmp/1000000, err, uhdError(err));
return(FAIL);
}
info(stderr, "Master clock is at %.0lf Mhz\n", 0, tmp/1000000);
/* Set the sample rate /
if (srate && !uhd_set_rx_rate_check(channel, srate)) return(FAIL);
/
Set the tuner gain SBX-120 is 0-31.5 in .5 db steps */

    if ((err = uhd_usrp_set_rx_gain(dev[channel], gain, channel, "")))
    {
         error(log, "Failed to set tuner[%d] gain to %.0lf db (%d).

%s.\n", 0, FL,
LN, FN, channel, gain, err, uhdError(err));
return(FAIL);
}
if (!(err = uhd_usrp_get_rx_gain(dev[channel], channel, "",
&tmp)))
info(log, "Tuner[%d] gain set to %.0lf (%.0lf) dB\n", 0,
channel, tmp, gain);

     ./* Set channel bw to conserve tuner resources. Not needed, set

by srate /
uhd_usrp_set_rx_bandwidth(dev[channel], srate, channel);
./
Disable subtracting constant averaged background. Signal
looks cleaner */
if ((err = uhd_usrp_set_rx_dc_offset_enabled(dev[channel],
false, channel)))
{
warn(log, "Failed to disable FPGA DC offset on channel
%d(%d). %s.\n", 0,
FL, LN, FN, channel, err, uhdError(err));
}
info(stderr, "Disabled FPGA DC offset on channel %d\n",
0, channel);
return(SUCCESS);
}

This is the generated output:

[INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300;
UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1
[INFO] [X300] X300 initialization sequence...
[INFO] [X300] Maximum frame size: 8000 bytes.
[INFO] [X300] Radio 1x clock: 200 MHz
Sat Apr 26 03:33:48 2025 [00] [+] Created USRP with args
Sat Apr 26 03:33:48 2025 [00] [+] Master clock is at 200 Mhz
Sat Apr 26 03:33:48 2025 [00] [+] Tuner[0] gain set to 30 (30) dB
Sat Apr 26 03:33:48 2025 [00] [*] scanner.l:1446:main Incorrect
maxsamples (1996). Expected 19960.
Sat Apr 26 03:33:48 2025 [00] [+] Max samples/buffer[0]: 1996
[WARNING] [0/Radio#0] Ignoring stream command for finite acquisition of
zero samples
I hope this reads OK. Maybe next time I should attach the code:)

TIA
Nikos


USRP-users mailing list -- usrp-users@lists.ettus.com
To unsubscribe send an email to usrp-users-leave@lists.ettus.com

I believe that max number of samples-per-buffer is limited by MTU

size.  Which is typically around 8000 or so for "jumbo frames".

Thanks for your time. I will check out the example. This is not a buffer problem. I just need 1024 Samples (real+imaginary) for FFT... I should be able to get them in a single pass. You saw my code, not a smoking gun there. This is probably is a physical problem. Cable is an SFP fiber dedicated line. Cannot go bad. Maybe the connections are not sitting right :(... BR Nikos On Sat, Apr 26, 2025 at 6:45 AM Marcus D. Leech <patchvonbraun@gmail.com> wrote: > On 25/04/2025 23:33, Nikos Balkanas wrote: > > Actually MTU is 9000. This is one of the recommendations... > I tried it with MTU 1500. It was worse:( > maxsamples dropped to 364... > > Right, 9000, rather than 8000. > > Upgrading to 10Gbit wont' give you larger MTU. > > What you're trying to do, I think, is to solve a buffer-management problem > in your *application* at entirely the wrong > level in the stack. > > It is EXCEEDINGLY COMMON for hardware drivers to only be able to deliver > in chunks that may not be perfectly adapted to > the requirements of your application. So, a common programming pattern > is to deal with this in your application. > > You should probably look at example code like rx_samples_to_file > > > > [INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300; > UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1 > [INFO] [X300] X300 initialization sequence... > [INFO] [X300] Maximum frame size: 1472 bytes. > [WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a send > frame size of at least 8000 for best > performance, but your configuration will only allow 1472.This may > negatively impact your maximum achievable sample rate. > Check the MTU on the interface and/or the send_frame_size argument. > [WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a receive > frame size of at least 8000 for best > performance, but your configuration will only allow 1472.This may > negatively impact your maximum achievable sample rate. > Check the MTU on the interface and/or the recv_frame_size argument. > [INFO] [GPS] No GPSDO found > [INFO] [X300] Radio 1x clock: 200 MHz > [WARNING] [UDP] The send buffer could not be resized sufficiently. > Target sock buff size: 24912805 bytes. > Actual sock buff size: 1048576 bytes. > See the transport application notes on buffer resizing. > Please run: sudo sysctl -w net.core.wmem_max=24912805 > Sat Apr 26 06:30:34 2025 [00] [+] Created USRP with args > Sat Apr 26 06:30:34 2025 [00] [+] Master clock is at 200 Mhz > Sat Apr 26 06:30:34 2025 [00] [+] Tuner[0] gain set to 30 (30) dB > [WARNING] [UDP] The send buffer could not be resized sufficiently. > Target sock buff size: 24912805 bytes. > Actual sock buff size: 1048576 bytes. > See the transport application notes on buffer resizing. > Please run: sudo sysctl -w net.core.wmem_max=24912805 > Sat Apr 26 06:30:34 2025 [00] [*] scanner.l:1446:main Incorrect maxsamples > (364). Expected 19960. > Sat Apr 26 06:30:34 2025 [00] [+] Max samples/buffer[0]: 364 > [WARNING] [0/Radio#0] Ignoring stream command for finite acquisition of > zero sam > > Nikos > > On Sat, Apr 26, 2025 at 5:46 AM Marcus D. Leech <patchvonbraun@gmail.com> > wrote: > >> On 25/04/2025 22:26, Nikos Balkanas wrote: >> >> Thanks Marcus, >> >> for your fast reply. >> >> On Sat, Apr 26, 2025 at 4:08 AM Marcus D. Leech <patchvonbraun@gmail.com> >> wrote: >> >>> On 25/04/2025 20:50, Nikos Balkanas wrote: >>> >>> Hello, >>> >>> I need to buy a new NIC. What would you suggest? >>> The one I use is an old Mellanox 10 Gbs, before the Connect-4 series. >>> It can only do 1996 S/s, need 19960 (10x more) to work with latest uhd. >>> Using Ubuntu 24.04 and uhd 4.6.0 >>> >>> So, 1.996ksps vs 19.960ksps? You hardly need a 10Gbit link to support >>> that. So, perhaps something >>> is being lost here in your requirements? >>> >> >> True. Can't explain it in terms of bandwidth. 16 * 1996 = 31.936 Kbps, 16 >> * 19960 = 319.360 Kbps well short of a 10 Gbps line:( >> Does a complex pair count as 1 sample, or 2? >> I have followed all the instructions in >> https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks, >> Even installed the DPDK drivers. My Mellanox is too old to use their OFED >> drivers:( >> >>> >>> On a related question. it seems that the streamer doesn't crash anymore >>> when receiving less than MAXSPS samples, instead it reads 0:( >>> This was due to the sse2 code not aligned in convert. >>> I change my stream args to cpu_format=sc16, otw=sc16, so no conversion >>> required. >>> Streamer still doesn't read anything. Is there a reason for it? >>> >>> You'd need to share more of your code. This should just work as far as >>> I can tell. >>> >>> Thanks. these are just the usrp code: >> >> int main() >> { >> uhd_stream_args_t stream_args = >> { >> .cpu_format >> = "sc16", >> .otw_format >> = "sc16", >> .args = "", >> .n_channels >> = 1, >> >> .channel_list = &channel >> }; >> ..uhd_stream_cmd_t stream_cmd = >> { >> >> .stream_mode = UHD_STREAM_MODE_NUM_SAMPS_AND_DONE, >> >> .stream_now = true >> }; >> >> if (uhd_init(0, 0, gain)) do_exit(20); >>> if ((err = uhd_usrp_get_rx_stream(dev[0], &stream_args, >>> rx_streamer[0]))) >>> { >>> uhd_get_last_error(errmsg, 127); >>> error(log, "Failed to get streamer[0] (%d). %s.\n", 0, FL, LN, >>> FN, err, errmsg); >>> uhd_rx_streamer_free(&rx_streamer[0]); >>> rx_streamer[0] = NULL; >>> uhd_rx_metadata_free(&md[0]); >>> md[0] = NULL; >>> do_exit(30); >>> } >>> if ((err = uhd_rx_streamer_max_num_samps(rx_streamer[0], >>> &maxsamps))) >>> >> { >>> uhd_get_last_error(errmsg, 127); >>> error(log, "Failed to get max samples/buffer[0] (%d). %s.\n", >>> 0, FL, LN, FN, err, >>> ..errmsg); >>> do_exit(35); >>> } >>> if (maxsamps != MAXSMPS) >>> warn(log, "Incorrect maxsamples (%ld). Expected %d.\n", 0, FL, >>> LN, FN, maxsamps, >>> MAXSMPS); >>> info(log, "Max samples/buffer[0]: %ld\n", 0, maxsamps); >>> >>> if ((err = uhd_rx_streamer_issue_stream_cmd(rx_streamer[0], >>> &stream_cmd))) >>> >> { >>> uhd_get_last_error(errmsg, 127); >>> error(log, "Failed to start streamer[0] (%d). %s.\n", 0, FL, >>> LN, FN, err, errmsg); >>> do_exit(40); >>> } >>> >> [...] >> do_exit(0) >> } >> >> >>> bool uhd_init(size_t channel, double srate, double gain) >>> { >>> double tmp; >>> uhd_rx_metadata_error_code_t err; >>> >>> if ((err = uhd_set_thread_priority(uhd_default_thread_priority, >>> true))) >>> warn(log, "Unable to set main thread priority (%d). >>> %s.\n", 0, FL, LN, FN, >>> err, uhdError(err)); >>> /* Create USRP */ >>> f ((err = uhd_usrp_make(&dev[channel], "type=x300"))) >>> { >>> error(log, "Failed to create USRP (%d). %s.\n", 0, FL, LN, >>> FN, err, >>> uhdError(err)); >>> dev[channel] = NULL; >>> return(FAIL); >>> >> } >>> info(stderr, "Created USRP with args\n", 0); >>> >>> /* Create RX streamer */ >>> if ((err = uhd_rx_streamer_make(&rx_streamer[channel]))) >>> { >>> error(log, "Failed to create rx_streamer[%d] (%d). %s.\n", 0, >>> FL, LN, FN, >>> channel, err, uhdError(err)); >>> return(FAIL); >>> } >>> /* Create RX metadata */ >>> if ((err = uhd_rx_metadata_make(&md[channel]))) >>> { >>> error(log, "Failed to create md[%d] (%d). %s.\n", 0, FL, LN, FN, >>> channel, >>> err, uhdError(err)); >>> return(FAIL); >>> } >>> >>> /* Get master clock rate */ >>> if ((err = uhd_usrp_get_master_clock_rate(dev[channel], 0, &tmp))) >>> >> { >>> error(log, "Failed to set master clock to %.0lf Mhz (%d). >>> %s.\n", 0, FL, >>> LN, FN, tmp/1000000, err, uhdError(err)); >>> return(FAIL); >>> } >>> info(stderr, "Master clock is at %.0lf Mhz\n", 0, tmp/1000000); >>> /* Set the sample rate */ >>> if (srate && !uhd_set_rx_rate_check(channel, srate)) return(FAIL); >>> /* Set the tuner gain SBX-120 is 0-31.5 in .5 db steps */ >>> >> if ((err = uhd_usrp_set_rx_gain(dev[channel], gain, channel, ""))) >>> { >>> error(log, "Failed to set tuner[%d] gain to %.0lf db (%d). >>> %s.\n", 0, FL, >>> LN, FN, channel, gain, err, uhdError(err)); >>> return(FAIL); >>> } >>> if (!(err = uhd_usrp_get_rx_gain(dev[channel], channel, "", >>> &tmp))) >>> info(log, "Tuner[%d] gain set to %.0lf (%.0lf) dB\n", 0, >>> channel, tmp, gain); >>> >> ./* Set channel bw to conserve tuner resources. Not needed, set >> by srate */ >> uhd_usrp_set_rx_bandwidth(dev[channel], srate, channel); >> ./* Disable subtracting constant averaged background. Signal >> looks cleaner */ >> if ((err = uhd_usrp_set_rx_dc_offset_enabled(dev[channel], >> false, channel))) >> { >> warn(log, "Failed to disable FPGA DC offset on channel >> %d(%d). %s.\n", 0, >> FL, LN, FN, channel, err, uhdError(err)); >> } >> info(stderr, "Disabled FPGA DC offset on channel %d\n", >> 0, channel); >> return(SUCCESS); >> } >> >> This is the generated output: >> >> [INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300; >> UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1 >> [INFO] [X300] X300 initialization sequence... >> [INFO] [X300] Maximum frame size: 8000 bytes. >> [INFO] [X300] Radio 1x clock: 200 MHz >> Sat Apr 26 03:33:48 2025 [00] [+] Created USRP with args >> Sat Apr 26 03:33:48 2025 [00] [+] Master clock is at 200 Mhz >> Sat Apr 26 03:33:48 2025 [00] [+] Tuner[0] gain set to 30 (30) dB >> Sat Apr 26 03:33:48 2025 [00] [*] scanner.l:1446:main Incorrect >> maxsamples (1996). Expected 19960. >> Sat Apr 26 03:33:48 2025 [00] [+] Max samples/buffer[0]: 1996 >> [WARNING] [0/Radio#0] Ignoring stream command for finite acquisition of >> zero samples >> I hope this reads OK. Maybe next time I should attach the code:) >> >>> TIA >>> Nikos >>> >>> _______________________________________________ >>> USRP-users mailing list -- usrp-users@lists.ettus.com >>> To unsubscribe send an email to usrp-users-leave@lists.ettus.com >>> >>> >>> I believe that max number of samples-per-buffer is limited by MTU >> size. Which is typically around 8000 or so for "jumbo frames". >> >> >> >
NB
Nikos Balkanas
Sun, Apr 27, 2025 9:37 PM

Hi Marcus,

You were right. No need to change NIC:)
This is not a software issue. uhd_rx_streamer_max_num_samps runs right
after uhd initialization before
any other code had the chance to run.
Link capacity doesn't seem to be the issue either...
Running pchar on the link, descendant of pathchar, reports a throughput of
5.619 Kb/s requesting ICMP replies,
to varying packet sizes (32->9000 (MTU), incr by 32).
sudo pchar -m 9000 -p ipv4icmp usrp
https://www.kitchenlab.org/www/bmah/Software/pchar/

It corresponds to 351.218.019 16-bit samples or 175,609.044 32-bit samples,
if each sample is 32-bit(real + imag)
Seems that uhd is not running at link capacity but is doing smt else.
I will have  to download and check with the sources...
The package version for Ubuntu 24.04 is uhd 4.6.0.
Where can I download the sources for uhd 4.6.0?

BR
Nikos

On Sat, Apr 26, 2025 at 7:02 AM Nikos Balkanas nbalkanas@gmail.com wrote:

Thanks for your time.
I will check out the example.
This is not a buffer problem. I just need 1024 Samples (real+imaginary)
for FFT...
I should be able to get them in a single pass.
You saw my code, not a smoking gun there.

This is probably is a physical problem.
Cable is an SFP fiber dedicated line. Cannot go bad.
Maybe the connections are not sitting right :(...

BR
Nikos

On Sat, Apr 26, 2025 at 6:45 AM Marcus D. Leech patchvonbraun@gmail.com
wrote:

On 25/04/2025 23:33, Nikos Balkanas wrote:

Actually MTU is 9000. This is one of the recommendations...
I tried it with MTU 1500. It was worse:(
maxsamples dropped to 364...

Right, 9000, rather than 8000.

Upgrading to 10Gbit wont' give you larger MTU.

What you're trying to do, I think, is to solve a buffer-management
problem in your application at entirely the wrong
level in the stack.

It is EXCEEDINGLY COMMON for hardware drivers to only be able to deliver
in chunks that may not be perfectly adapted to
the requirements of your application.  So, a common programming pattern
is to deal with this in your application.

You should probably look at example code like rx_samples_to_file

[INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300;
UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1
[INFO] [X300] X300 initialization sequence...
[INFO] [X300] Maximum frame size: 1472 bytes.
[WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a send
frame size of at least 8000 for best
performance, but your configuration will only allow 1472.This may
negatively impact your maximum achievable sample rate.
Check the MTU on the interface and/or the send_frame_size argument.
[WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a
receive frame size of at least 8000 for best
performance, but your configuration will only allow 1472.This may
negatively impact your maximum achievable sample rate.
Check the MTU on the interface and/or the recv_frame_size argument.
[INFO] [GPS] No GPSDO found
[INFO] [X300] Radio 1x clock: 200 MHz
[WARNING] [UDP] The send buffer could not be resized sufficiently.
Target sock buff size: 24912805 bytes.
Actual sock buff size: 1048576 bytes.
See the transport application notes on buffer resizing.
Please run: sudo sysctl -w net.core.wmem_max=24912805
Sat Apr 26 06:30:34 2025 [00] [+] Created USRP with args
Sat Apr 26 06:30:34 2025 [00] [+] Master clock is at 200 Mhz
Sat Apr 26 06:30:34 2025 [00] [+] Tuner[0] gain set to 30 (30) dB
[WARNING] [UDP] The send buffer could not be resized sufficiently.
Target sock buff size: 24912805 bytes.
Actual sock buff size: 1048576 bytes.
See the transport application notes on buffer resizing.
Please run: sudo sysctl -w net.core.wmem_max=24912805
Sat Apr 26 06:30:34 2025 [00] [*] scanner.l:1446:main Incorrect
maxsamples (364). Expected 19960.
Sat Apr 26 06:30:34 2025 [00] [+] Max samples/buffer[0]: 364
[WARNING] [0/Radio#0] Ignoring stream command for finite acquisition of
zero sam

Nikos

On Sat, Apr 26, 2025 at 5:46 AM Marcus D. Leech patchvonbraun@gmail.com
wrote:

On 25/04/2025 22:26, Nikos Balkanas wrote:

Thanks Marcus,

for your fast reply.

On Sat, Apr 26, 2025 at 4:08 AM Marcus D. Leech patchvonbraun@gmail.com
wrote:

On 25/04/2025 20:50, Nikos Balkanas wrote:

Hello,

I need to buy a new NIC. What would you suggest?
The one I use is an old Mellanox 10 Gbs, before the Connect-4 series.
It can only do 1996 S/s, need 19960 (10x more) to work with latest uhd.
Using Ubuntu 24.04 and uhd 4.6.0

So, 1.996ksps vs 19.960ksps?  You hardly need a 10Gbit link to support
that.  So, perhaps something
is being lost here in your requirements?

True. Can't explain it in terms of bandwidth. 16 * 1996 = 31.936 Kbps,
16 * 19960 = 319.360 Kbps well short of a 10 Gbps line:(
Does a complex pair count as 1 sample, or 2?
I have followed all the instructions in
https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks,
Even installed the DPDK drivers. My Mellanox is too old to use their
OFED drivers:(

On a related question. it seems that the streamer doesn't crash anymore
when receiving less than MAXSPS samples, instead it reads 0:(
This was due to the sse2 code not aligned in convert.
I change my stream args to cpu_format=sc16, otw=sc16, so no conversion
required.
Streamer still doesn't read anything. Is there a reason for it?

You'd need to share more of your code.  This should just work as far as
I can tell.

Thanks. these are just the usrp code:

int main()
{
uhd_stream_args_t stream_args =
{

.cpu_format = "sc16",

.otw_format = "sc16",
.args = "",

.n_channels = 1,

.channel_list = &channel
};
..uhd_stream_cmd_t stream_cmd =
{

.stream_mode = UHD_STREAM_MODE_NUM_SAMPS_AND_DONE,

.stream_now = true
};

 if (uhd_init(0, 0, gain)) do_exit(20);
 if ((err = uhd_usrp_get_rx_stream(dev[0], &stream_args,

rx_streamer[0])))
{
uhd_get_last_error(errmsg, 127);
error(log, "Failed to get streamer[0] (%d). %s.\n", 0, FL,
LN, FN, err, errmsg);
uhd_rx_streamer_free(&rx_streamer[0]);
rx_streamer[0] = NULL;
uhd_rx_metadata_free(&md[0]);
md[0] = NULL;
do_exit(30);
}
if ((err = uhd_rx_streamer_max_num_samps(rx_streamer[0],
&maxsamps)))

  {
      uhd_get_last_error(errmsg, 127);
      error(log, "Failed to get max samples/buffer[0] (%d). %s.\n",

0, FL, LN, FN, err,
..errmsg);
do_exit(35);
}
if (maxsamps != MAXSMPS)
warn(log, "Incorrect maxsamples (%ld). Expected %d.\n", 0, FL,
LN, FN, maxsamps,
MAXSMPS);
info(log, "Max samples/buffer[0]: %ld\n", 0, maxsamps);

 if ((err = uhd_rx_streamer_issue_stream_cmd(rx_streamer[0],

&stream_cmd)))

 {
     uhd_get_last_error(errmsg, 127);
     error(log, "Failed to start streamer[0] (%d). %s.\n", 0, FL,

LN, FN, err, errmsg);
do_exit(40);
}

      [...]
      do_exit(0)
  }

bool uhd_init(size_t channel, double srate, double gain)
{
double tmp;
uhd_rx_metadata_error_code_t err;

  if ((err = uhd_set_thread_priority(uhd_default_thread_priority,

true)))
warn(log, "Unable to set  main thread priority (%d).
%s.\n", 0, FL, LN, FN,
err, uhdError(err));
/* Create USRP */
f ((err = uhd_usrp_make(&dev[channel], "type=x300")))
{
error(log, "Failed to create USRP (%d). %s.\n", 0, FL, LN,
FN, err,
uhdError(err));
dev[channel] = NULL;
return(FAIL);

      }
      info(stderr, "Created USRP with args\n", 0);

 /* Create RX streamer */
 if ((err = uhd_rx_streamer_make(&rx_streamer[channel])))
 {
     error(log, "Failed to create rx_streamer[%d] (%d). %s.\n", 0,

FL, LN, FN,
channel, err, uhdError(err));
return(FAIL);
}
/* Create RX metadata */
if ((err = uhd_rx_metadata_make(&md[channel])))
{
error(log, "Failed to create md[%d] (%d). %s.\n", 0, FL, LN,
FN, channel,
err, uhdError(err));
return(FAIL);
}

 /* Get master clock rate */
  if ((err = uhd_usrp_get_master_clock_rate(dev[channel], 0,

&tmp)))

   {
        error(log, "Failed to set master clock to %.0lf Mhz (%d).

%s.\n", 0, FL,
LN, FN, tmp/1000000, err, uhdError(err));
return(FAIL);
}
info(stderr, "Master clock is at %.0lf Mhz\n", 0, tmp/1000000);
/* Set the sample rate /
if (srate && !uhd_set_rx_rate_check(channel, srate)) return(FAIL);
/
Set the tuner gain SBX-120 is 0-31.5 in .5 db steps */

    if ((err = uhd_usrp_set_rx_gain(dev[channel], gain, channel,

"")))
{
error(log, "Failed to set tuner[%d] gain to %.0lf db (%d).
%s.\n", 0, FL,
LN, FN, channel, gain, err, uhdError(err));
return(FAIL);
}
if (!(err = uhd_usrp_get_rx_gain(dev[channel], channel, "",
&tmp)))
info(log, "Tuner[%d] gain set to %.0lf (%.0lf) dB\n", 0,
channel, tmp, gain);

     ./* Set channel bw to conserve tuner resources. Not needed, set

by srate /
uhd_usrp_set_rx_bandwidth(dev[channel], srate, channel);
./
Disable subtracting constant averaged background. Signal
looks cleaner */
if ((err = uhd_usrp_set_rx_dc_offset_enabled(dev[channel],
false, channel)))
{
warn(log, "Failed to disable FPGA DC offset on channel
%d(%d). %s.\n", 0,
FL, LN, FN, channel, err, uhdError(err));
}
info(stderr, "Disabled FPGA DC offset on channel %d\n",
0, channel);
return(SUCCESS);
}

This is the generated output:

[INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300;
UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1
[INFO] [X300] X300 initialization sequence...
[INFO] [X300] Maximum frame size: 8000 bytes.
[INFO] [X300] Radio 1x clock: 200 MHz
Sat Apr 26 03:33:48 2025 [00] [+] Created USRP with args
Sat Apr 26 03:33:48 2025 [00] [+] Master clock is at 200 Mhz
Sat Apr 26 03:33:48 2025 [00] [+] Tuner[0] gain set to 30 (30) dB
Sat Apr 26 03:33:48 2025 [00] [*] scanner.l:1446:main Incorrect
maxsamples (1996). Expected 19960.
Sat Apr 26 03:33:48 2025 [00] [+] Max samples/buffer[0]: 1996
[WARNING] [0/Radio#0] Ignoring stream command for finite acquisition of
zero samples
I hope this reads OK. Maybe next time I should attach the code:)

TIA
Nikos


USRP-users mailing list -- usrp-users@lists.ettus.com
To unsubscribe send an email to usrp-users-leave@lists.ettus.com

I believe that max number of samples-per-buffer is limited by MTU

size.  Which is typically around 8000 or so for "jumbo frames".

Hi Marcus, You were right. No need to change NIC:) This is not a software issue. uhd_rx_streamer_max_num_samps runs right after uhd initialization before any other code had the chance to run. Link capacity doesn't seem to be the issue either... Running pchar on the link, descendant of pathchar, reports a throughput of 5.619 Kb/s requesting ICMP replies, to varying packet sizes (32->9000 (MTU), incr by 32). sudo pchar -m 9000 -p ipv4icmp usrp https://www.kitchenlab.org/www/bmah/Software/pchar/ It corresponds to 351.218.019 16-bit samples or 175,609.044 32-bit samples, if each sample is 32-bit(real + imag) Seems that uhd is not running at link capacity but is doing smt else. I will have to download and check with the sources... The package version for Ubuntu 24.04 is uhd 4.6.0. Where can I download the sources for uhd 4.6.0? BR Nikos On Sat, Apr 26, 2025 at 7:02 AM Nikos Balkanas <nbalkanas@gmail.com> wrote: > Thanks for your time. > I will check out the example. > This is not a buffer problem. I just need 1024 Samples (real+imaginary) > for FFT... > I should be able to get them in a single pass. > You saw my code, not a smoking gun there. > > This is probably is a physical problem. > Cable is an SFP fiber dedicated line. Cannot go bad. > Maybe the connections are not sitting right :(... > > BR > Nikos > > On Sat, Apr 26, 2025 at 6:45 AM Marcus D. Leech <patchvonbraun@gmail.com> > wrote: > >> On 25/04/2025 23:33, Nikos Balkanas wrote: >> >> Actually MTU is 9000. This is one of the recommendations... >> I tried it with MTU 1500. It was worse:( >> maxsamples dropped to 364... >> >> Right, 9000, rather than 8000. >> >> Upgrading to 10Gbit wont' give you larger MTU. >> >> What you're trying to do, I think, is to solve a buffer-management >> problem in your *application* at entirely the wrong >> level in the stack. >> >> It is EXCEEDINGLY COMMON for hardware drivers to only be able to deliver >> in chunks that may not be perfectly adapted to >> the requirements of your application. So, a common programming pattern >> is to deal with this in your application. >> >> You should probably look at example code like rx_samples_to_file >> >> >> >> [INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300; >> UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1 >> [INFO] [X300] X300 initialization sequence... >> [INFO] [X300] Maximum frame size: 1472 bytes. >> [WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a send >> frame size of at least 8000 for best >> performance, but your configuration will only allow 1472.This may >> negatively impact your maximum achievable sample rate. >> Check the MTU on the interface and/or the send_frame_size argument. >> [WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a >> receive frame size of at least 8000 for best >> performance, but your configuration will only allow 1472.This may >> negatively impact your maximum achievable sample rate. >> Check the MTU on the interface and/or the recv_frame_size argument. >> [INFO] [GPS] No GPSDO found >> [INFO] [X300] Radio 1x clock: 200 MHz >> [WARNING] [UDP] The send buffer could not be resized sufficiently. >> Target sock buff size: 24912805 bytes. >> Actual sock buff size: 1048576 bytes. >> See the transport application notes on buffer resizing. >> Please run: sudo sysctl -w net.core.wmem_max=24912805 >> Sat Apr 26 06:30:34 2025 [00] [+] Created USRP with args >> Sat Apr 26 06:30:34 2025 [00] [+] Master clock is at 200 Mhz >> Sat Apr 26 06:30:34 2025 [00] [+] Tuner[0] gain set to 30 (30) dB >> [WARNING] [UDP] The send buffer could not be resized sufficiently. >> Target sock buff size: 24912805 bytes. >> Actual sock buff size: 1048576 bytes. >> See the transport application notes on buffer resizing. >> Please run: sudo sysctl -w net.core.wmem_max=24912805 >> Sat Apr 26 06:30:34 2025 [00] [*] scanner.l:1446:main Incorrect >> maxsamples (364). Expected 19960. >> Sat Apr 26 06:30:34 2025 [00] [+] Max samples/buffer[0]: 364 >> [WARNING] [0/Radio#0] Ignoring stream command for finite acquisition of >> zero sam >> >> Nikos >> >> On Sat, Apr 26, 2025 at 5:46 AM Marcus D. Leech <patchvonbraun@gmail.com> >> wrote: >> >>> On 25/04/2025 22:26, Nikos Balkanas wrote: >>> >>> Thanks Marcus, >>> >>> for your fast reply. >>> >>> On Sat, Apr 26, 2025 at 4:08 AM Marcus D. Leech <patchvonbraun@gmail.com> >>> wrote: >>> >>>> On 25/04/2025 20:50, Nikos Balkanas wrote: >>>> >>>> Hello, >>>> >>>> I need to buy a new NIC. What would you suggest? >>>> The one I use is an old Mellanox 10 Gbs, before the Connect-4 series. >>>> It can only do 1996 S/s, need 19960 (10x more) to work with latest uhd. >>>> Using Ubuntu 24.04 and uhd 4.6.0 >>>> >>>> So, 1.996ksps vs 19.960ksps? You hardly need a 10Gbit link to support >>>> that. So, perhaps something >>>> is being lost here in your requirements? >>>> >>> >>> True. Can't explain it in terms of bandwidth. 16 * 1996 = 31.936 Kbps, >>> 16 * 19960 = 319.360 Kbps well short of a 10 Gbps line:( >>> Does a complex pair count as 1 sample, or 2? >>> I have followed all the instructions in >>> https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks, >>> Even installed the DPDK drivers. My Mellanox is too old to use their >>> OFED drivers:( >>> >>>> >>>> On a related question. it seems that the streamer doesn't crash anymore >>>> when receiving less than MAXSPS samples, instead it reads 0:( >>>> This was due to the sse2 code not aligned in convert. >>>> I change my stream args to cpu_format=sc16, otw=sc16, so no conversion >>>> required. >>>> Streamer still doesn't read anything. Is there a reason for it? >>>> >>>> You'd need to share more of your code. This should just work as far as >>>> I can tell. >>>> >>>> Thanks. these are just the usrp code: >>> >>> int main() >>> { >>> uhd_stream_args_t stream_args = >>> { >>> >>> .cpu_format = "sc16", >>> >>> .otw_format = "sc16", >>> .args = "", >>> >>> .n_channels = 1, >>> >>> .channel_list = &channel >>> }; >>> ..uhd_stream_cmd_t stream_cmd = >>> { >>> >>> .stream_mode = UHD_STREAM_MODE_NUM_SAMPS_AND_DONE, >>> >>> .stream_now = true >>> }; >>> >>> if (uhd_init(0, 0, gain)) do_exit(20); >>>> if ((err = uhd_usrp_get_rx_stream(dev[0], &stream_args, >>>> rx_streamer[0]))) >>>> { >>>> uhd_get_last_error(errmsg, 127); >>>> error(log, "Failed to get streamer[0] (%d). %s.\n", 0, FL, >>>> LN, FN, err, errmsg); >>>> uhd_rx_streamer_free(&rx_streamer[0]); >>>> rx_streamer[0] = NULL; >>>> uhd_rx_metadata_free(&md[0]); >>>> md[0] = NULL; >>>> do_exit(30); >>>> } >>>> if ((err = uhd_rx_streamer_max_num_samps(rx_streamer[0], >>>> &maxsamps))) >>>> >>> { >>>> uhd_get_last_error(errmsg, 127); >>>> error(log, "Failed to get max samples/buffer[0] (%d). %s.\n", >>>> 0, FL, LN, FN, err, >>>> ..errmsg); >>>> do_exit(35); >>>> } >>>> if (maxsamps != MAXSMPS) >>>> warn(log, "Incorrect maxsamples (%ld). Expected %d.\n", 0, FL, >>>> LN, FN, maxsamps, >>>> MAXSMPS); >>>> info(log, "Max samples/buffer[0]: %ld\n", 0, maxsamps); >>>> >>>> if ((err = uhd_rx_streamer_issue_stream_cmd(rx_streamer[0], >>>> &stream_cmd))) >>>> >>> { >>>> uhd_get_last_error(errmsg, 127); >>>> error(log, "Failed to start streamer[0] (%d). %s.\n", 0, FL, >>>> LN, FN, err, errmsg); >>>> do_exit(40); >>>> } >>>> >>> [...] >>> do_exit(0) >>> } >>> >>> >>>> bool uhd_init(size_t channel, double srate, double gain) >>>> { >>>> double tmp; >>>> uhd_rx_metadata_error_code_t err; >>>> >>>> if ((err = uhd_set_thread_priority(uhd_default_thread_priority, >>>> true))) >>>> warn(log, "Unable to set main thread priority (%d). >>>> %s.\n", 0, FL, LN, FN, >>>> err, uhdError(err)); >>>> /* Create USRP */ >>>> f ((err = uhd_usrp_make(&dev[channel], "type=x300"))) >>>> { >>>> error(log, "Failed to create USRP (%d). %s.\n", 0, FL, LN, >>>> FN, err, >>>> uhdError(err)); >>>> dev[channel] = NULL; >>>> return(FAIL); >>>> >>> } >>>> info(stderr, "Created USRP with args\n", 0); >>>> >>>> /* Create RX streamer */ >>>> if ((err = uhd_rx_streamer_make(&rx_streamer[channel]))) >>>> { >>>> error(log, "Failed to create rx_streamer[%d] (%d). %s.\n", 0, >>>> FL, LN, FN, >>>> channel, err, uhdError(err)); >>>> return(FAIL); >>>> } >>>> /* Create RX metadata */ >>>> if ((err = uhd_rx_metadata_make(&md[channel]))) >>>> { >>>> error(log, "Failed to create md[%d] (%d). %s.\n", 0, FL, LN, >>>> FN, channel, >>>> err, uhdError(err)); >>>> return(FAIL); >>>> } >>>> >>>> /* Get master clock rate */ >>>> if ((err = uhd_usrp_get_master_clock_rate(dev[channel], 0, >>>> &tmp))) >>>> >>> { >>>> error(log, "Failed to set master clock to %.0lf Mhz (%d). >>>> %s.\n", 0, FL, >>>> LN, FN, tmp/1000000, err, uhdError(err)); >>>> return(FAIL); >>>> } >>>> info(stderr, "Master clock is at %.0lf Mhz\n", 0, tmp/1000000); >>>> /* Set the sample rate */ >>>> if (srate && !uhd_set_rx_rate_check(channel, srate)) return(FAIL); >>>> /* Set the tuner gain SBX-120 is 0-31.5 in .5 db steps */ >>>> >>> if ((err = uhd_usrp_set_rx_gain(dev[channel], gain, channel, >>>> ""))) >>>> { >>>> error(log, "Failed to set tuner[%d] gain to %.0lf db (%d). >>>> %s.\n", 0, FL, >>>> LN, FN, channel, gain, err, uhdError(err)); >>>> return(FAIL); >>>> } >>>> if (!(err = uhd_usrp_get_rx_gain(dev[channel], channel, "", >>>> &tmp))) >>>> info(log, "Tuner[%d] gain set to %.0lf (%.0lf) dB\n", 0, >>>> channel, tmp, gain); >>>> >>> ./* Set channel bw to conserve tuner resources. Not needed, set >>> by srate */ >>> uhd_usrp_set_rx_bandwidth(dev[channel], srate, channel); >>> ./* Disable subtracting constant averaged background. Signal >>> looks cleaner */ >>> if ((err = uhd_usrp_set_rx_dc_offset_enabled(dev[channel], >>> false, channel))) >>> { >>> warn(log, "Failed to disable FPGA DC offset on channel >>> %d(%d). %s.\n", 0, >>> FL, LN, FN, channel, err, uhdError(err)); >>> } >>> info(stderr, "Disabled FPGA DC offset on channel %d\n", >>> 0, channel); >>> return(SUCCESS); >>> } >>> >>> This is the generated output: >>> >>> [INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300; >>> UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1 >>> [INFO] [X300] X300 initialization sequence... >>> [INFO] [X300] Maximum frame size: 8000 bytes. >>> [INFO] [X300] Radio 1x clock: 200 MHz >>> Sat Apr 26 03:33:48 2025 [00] [+] Created USRP with args >>> Sat Apr 26 03:33:48 2025 [00] [+] Master clock is at 200 Mhz >>> Sat Apr 26 03:33:48 2025 [00] [+] Tuner[0] gain set to 30 (30) dB >>> Sat Apr 26 03:33:48 2025 [00] [*] scanner.l:1446:main Incorrect >>> maxsamples (1996). Expected 19960. >>> Sat Apr 26 03:33:48 2025 [00] [+] Max samples/buffer[0]: 1996 >>> [WARNING] [0/Radio#0] Ignoring stream command for finite acquisition of >>> zero samples >>> I hope this reads OK. Maybe next time I should attach the code:) >>> >>>> TIA >>>> Nikos >>>> >>>> _______________________________________________ >>>> USRP-users mailing list -- usrp-users@lists.ettus.com >>>> To unsubscribe send an email to usrp-users-leave@lists.ettus.com >>>> >>>> >>>> I believe that max number of samples-per-buffer is limited by MTU >>> size. Which is typically around 8000 or so for "jumbo frames". >>> >>> >>> >>
MD
Marcus D. Leech
Sun, Apr 27, 2025 9:39 PM

On 27/04/2025 17:37, Nikos Balkanas wrote:

Hi Marcus,

You were right. No need to change NIC:)
This is not a software issue. uhd_rx_streamer_max_num_samps runs right
after uhd initialization before
any other code had the chance to run.
Link capacity doesn't seem to be the issue either...
Running pchar on the link, descendant of pathchar, reports a
throughput of 5.619 Kb/s requesting ICMP replies,
to varying packet sizes (32->9000 (MTU), incr by 32).
sudo pchar -m 9000 -p ipv4icmp usrp
https://www.kitchenlab.org/www/bmah/Software/pchar/

It corresponds to 351.218.019 16-bit samples or 175,609.044 32-bit
samples, if each sample is 32-bit(real + imag)
Seems that uhd is not running at link capacity but is doing smt else.
I will have to download and check with the sources...
The package version for Ubuntu 24.04 is uhd 4.6.0.
Where can I download the sources for uhd 4.6.0?

BR
Nikos

YOu CANNOT use ICMP tests to determine link capacity with a USRP -- ICMP
is processed via  completely different
  "stack" in the radio.

Use "benchmark_rate" instead.

On Sat, Apr 26, 2025 at 7:02 AM Nikos Balkanas nbalkanas@gmail.com
wrote:

 Thanks for your time.
 I will check out the example.
 This is not a buffer problem. I just need 1024 Samples
 (real+imaginary) for FFT...
 I should be able to get them in a single pass.
 You saw my code, not a smoking gun there.

 This is probably is a physical problem.
 Cable is an SFP fiber dedicated line. Cannot go bad.
 Maybe the connections are not sitting right :(...

 BR
 Nikos

 On Sat, Apr 26, 2025 at 6:45 AM Marcus D. Leech
 <patchvonbraun@gmail.com> wrote:

     On 25/04/2025 23:33, Nikos Balkanas wrote:
     Actually MTU is 9000. This is one of the recommendations...
     I tried it with MTU 1500. It was worse:(
     maxsamples dropped to 364...
     Right, 9000, rather than 8000.

     Upgrading to 10Gbit wont' give you larger MTU.

     What you're trying to do, I think, is to solve a
     buffer-management problem in your *application* at entirely
     the wrong
       level in the stack.

     It is EXCEEDINGLY COMMON for hardware drivers to only be able
     to deliver in chunks that may not be perfectly adapted to
       the requirements of your application.  So, a common
     programming pattern is to deal with this in your application.

     You should probably look at example code like rx_samples_to_file
     [INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300;
     UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1
     [INFO] [X300] X300 initialization sequence...
     [INFO] [X300] Maximum frame size: 1472 bytes.
     [WARNING] [X300] For the 192.168.40.2 connection, UHD
     recommends a send frame size of at least 8000 for best
     performance, but your configuration will only allow 1472.This
     may negatively impact your maximum achievable sample rate.
     Check the MTU on the interface and/or the send_frame_size
     argument.
     [WARNING] [X300] For the 192.168.40.2 connection, UHD
     recommends a receive frame size of at least 8000 for best
     performance, but your configuration will only allow 1472.This
     may negatively impact your maximum achievable sample rate.
     Check the MTU on the interface and/or the recv_frame_size
     argument.
     [INFO] [GPS] No GPSDO found
     [INFO] [X300] Radio 1x clock: 200 MHz
     [WARNING] [UDP] The send buffer could not be resized
     sufficiently.
     Target sock buff size: 24912805 bytes.
     Actual sock buff size: 1048576 bytes.
     See the transport application notes on buffer resizing.
     Please run: sudo sysctl -w net.core.wmem_max=24912805
     Sat Apr 26 06:30:34 2025 [00] [+] Created USRP with args
     Sat Apr 26 06:30:34 2025 [00] [+] Master clock is at 200 Mhz
     Sat Apr 26 06:30:34 2025 [00] [+] Tuner[0] gain set to 30 (30) dB
     [WARNING] [UDP] The send buffer could not be resized
     sufficiently.
     Target sock buff size: 24912805 bytes.
     Actual sock buff size: 1048576 bytes.
     See the transport application notes on buffer resizing.
     Please run: sudo sysctl -w net.core.wmem_max=24912805
     Sat Apr 26 06:30:34 2025 [00] [*] scanner.l:1446:main
     Incorrect maxsamples (364). Expected 19960.
     Sat Apr 26 06:30:34 2025 [00] [+] Max samples/buffer[0]: 364
     [WARNING] [0/Radio#0] Ignoring stream command for finite
     acquisition of zero sam

     Nikos

     On Sat, Apr 26, 2025 at 5:46 AM Marcus D. Leech
     <patchvonbraun@gmail.com> wrote:

         On 25/04/2025 22:26, Nikos Balkanas wrote:
         Thanks Marcus,

         for your fast reply.

         On Sat, Apr 26, 2025 at 4:08 AM Marcus D. Leech
         <patchvonbraun@gmail.com> wrote:

             On 25/04/2025 20:50, Nikos Balkanas wrote:
             Hello,

             I need to buy a new NIC. What would you suggest?
             The one I use is an old Mellanox 10 Gbs, before the
             Connect-4 series.
             It can only do 1996 S/s, need 19960 (10x more) to
             work with latest uhd.
             Using Ubuntu 24.04 and uhd 4.6.0
             So, 1.996ksps vs 19.960ksps?   You hardly need a
             10Gbit link to support that.  So, perhaps something
               is being lost here in your requirements?


         True. Can't explain it in terms of bandwidth. 16 * 1996
         = 31.936 Kbps, 16 * 19960 = 319.360 Kbps well short of a
         10 Gbps line:(
         Does a complex pair count as 1 sample, or 2?
         I have followed all the instructions in
         https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks,
         Even installed the DPDK drivers. My Mellanox is too old
         to use their OFED drivers:(
             On a related question. it seems that the streamer
             doesn't crash anymore
             when receiving less than MAXSPS samples, instead it
             reads 0:(
             This was due to the sse2 code not aligned in convert.
             I change my stream args to cpu_format=sc16,
             otw=sc16, so no conversion required.
             Streamer still doesn't read anything. Is there a
             reason for it?
             You'd need to share more of your code.  This should
             just work as far as I can tell.

         Thanks. these are just the usrp code:

         int main()
         {
         uhd_stream_args_t stream_args =
                            {
                               .cpu_format = "sc16",
                               .otw_format = "sc16",
                               .args = "",
                               .n_channels = 1,
                                .channel_list = &channel
                              };
         ..uhd_stream_cmd_t stream_cmd =
                              {
                                .stream_mode =
         UHD_STREAM_MODE_NUM_SAMPS_AND_DONE,
                                 .stream_now = true
                               };

             if (uhd_init(0, 0, gain)) do_exit(20);
             if ((err = uhd_usrp_get_rx_stream(dev[0],
             &stream_args, rx_streamer[0])))
             {
             uhd_get_last_error(errmsg, 127);
             error(log, "Failed to get streamer[0] (%d). %s.\n",
             0, FL, LN, FN, err, errmsg);
             uhd_rx_streamer_free(&rx_streamer[0]);
             rx_streamer[0] = NULL;
             uhd_rx_metadata_free(&md[0]);
             md[0] = NULL;
             do_exit(30);
             }
             if ((err =
             uhd_rx_streamer_max_num_samps(rx_streamer[0],
             &maxsamps)))

             {
             uhd_get_last_error(errmsg, 127);
             error(log, "Failed to get max samples/buffer[0]
             (%d). %s.\n", 0, FL, LN, FN, err,
             ..errmsg);
             do_exit(35);
             }
             if (maxsamps != MAXSMPS)
             warn(log, "Incorrect maxsamples (%ld). Expected
             %d.\n", 0, FL, LN, FN, maxsamps,
             MAXSMPS);
             info(log, "Max samples/buffer[0]: %ld\n", 0, maxsamps);

                 if ((err =
             uhd_rx_streamer_issue_stream_cmd(rx_streamer[0],
             &stream_cmd)))

             {
             uhd_get_last_error(errmsg, 127);
             error(log, "Failed to start streamer[0] (%d).
             %s.\n", 0, FL, LN, FN, err, errmsg);
             do_exit(40);
             }

                  [...]
          do_exit(0)
              }

             bool uhd_init(size_t channel, double srate, double gain)
             {
             double tmp;
             uhd_rx_metadata_error_code_t err;

             if ((err =
             uhd_set_thread_priority(uhd_default_thread_priority,
             true)))
             warn(log, "Unable to set  main thread priority (%d).
             %s.\n", 0, FL, LN, FN,
             err, uhdError(err));
             /* Create USRP */
             f ((err = uhd_usrp_make(&dev[channel], "type=x300")))
             {
             error(log, "Failed to create USRP (%d). %s.\n", 0,
             FL, LN, FN, err,
             uhdError(err));
             dev[channel] = NULL;
             return(FAIL);

             }
             info(stderr, "Created USRP with args\n", 0);

             /* Create RX streamer */
             if ((err = uhd_rx_streamer_make(&rx_streamer[channel])))
             {
             error(log, "Failed to create rx_streamer[%d] (%d).
             %s.\n", 0, FL, LN, FN,
             channel, err, uhdError(err));
             return(FAIL);
             }
             /* Create RX metadata */
             if ((err = uhd_rx_metadata_make(&md[channel])))
             {
             error(log, "Failed to create md[%d] (%d). %s.\n", 0,
             FL, LN, FN, channel,
             err, uhdError(err));
             return(FAIL);
             }

             /* Get master clock rate */
             if ((err =
             uhd_usrp_get_master_clock_rate(dev[channel], 0, &tmp)))

             {
             error(log, "Failed to set master clock to %.0lf Mhz
             (%d). %s.\n", 0, FL,
             LN, FN, tmp/1000000, err, uhdError(err));
             return(FAIL);
             }
             info(stderr, "Master clock is at %.0lf Mhz\n", 0,
             tmp/1000000);
             /* Set the sample rate */
             if (srate && !uhd_set_rx_rate_check(channel, srate))
             return(FAIL);
             /* Set the tuner gain SBX-120 is 0-31.5 in .5 db
             steps */

                    if ((err = uhd_usrp_set_rx_gain(dev[channel],
             gain, channel, "")))
             {
             error(log, "Failed to set tuner[%d] gain to %.0lf db
             (%d). %s.\n", 0, FL,
             LN, FN, channel, gain, err, uhdError(err));
             return(FAIL);
             }
                      if (!(err =
             uhd_usrp_get_rx_gain(dev[channel], channel, "", &tmp)))
             info(log, "Tuner[%d] gain set to %.0lf (%.0lf)
             dB\n", 0, channel, tmp,gain);

         ./* Set channel bw to conserve tuner resources. Not
         needed, set by srate */
         uhd_usrp_set_rx_bandwidth(dev[channel], srate, channel);
         ./* Disable subtracting constant averaged background.
         Signal looks cleaner */
         if ((err =
         uhd_usrp_set_rx_dc_offset_enabled(dev[channel], false,
         channel)))
         {
         warn(log, "Failed to disable FPGA DC offset on channel
         %d(%d). %s.\n", 0,
         FL, LN, FN, channel, err, uhdError(err));
         }
         info(stderr, "Disabled FPGA DC offset on channel %d\n",
         0, channel);
         return(SUCCESS);
                  }

         This is the generated output:

         [INFO] [UHD] linux; GNU C++ version 13.2.0;
         Boost_108300; UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1
         [INFO] [X300] X300 initialization sequence...
         [INFO] [X300] Maximum frame size: 8000 bytes.
         [INFO] [X300] Radio 1x clock: 200 MHz
         Sat Apr 26 03:33:48 2025 [00] [+] Created USRP with args
         Sat Apr 26 03:33:48 2025 [00] [+] Master clock is at 200 Mhz
         Sat Apr 26 03:33:48 2025 [00] [+] Tuner[0] gain set to
         30 (30) dB
         Sat Apr 26 03:33:48 2025 [00] [*] scanner.l:1446:main
         Incorrect maxsamples (1996). Expected 19960.
         Sat Apr 26 03:33:48 2025 [00] [+] Max samples/buffer[0]:
         1996
         [WARNING] [0/Radio#0] Ignoring stream command for finite
         acquisition of zero samples
         I hope this reads OK. Maybe next time I should attach
         the code:)
             TIA
             Nikos

             _______________________________________________
             USRP-users mailing list --usrp-users@lists.ettus.com
             To unsubscribe send an email tousrp-users-leave@lists.ettus.com
         I believe that max number of samples-per-buffer is
         limited by MTU size.   Which is typically around 8000 or
         so for "jumbo frames".
On 27/04/2025 17:37, Nikos Balkanas wrote: > Hi Marcus, > > You were right. No need to change NIC:) > This is not a software issue. uhd_rx_streamer_max_num_samps runs right > after uhd initialization before > any other code had the chance to run. > Link capacity doesn't seem to be the issue either... > Running pchar on the link, descendant of pathchar, reports a > throughput of 5.619 Kb/s requesting ICMP replies, > to varying packet sizes (32->9000 (MTU), incr by 32). > sudo pchar -m 9000 -p ipv4icmp usrp > https://www.kitchenlab.org/www/bmah/Software/pchar/ > > It corresponds to 351.218.019 16-bit samples or 175,609.044 32-bit > samples, if each sample is 32-bit(real + imag) > Seems that uhd is not running at link capacity but is doing smt else. > I will have to download and check with the sources... > The package version for Ubuntu 24.04 is uhd 4.6.0. > Where can I download the sources for uhd 4.6.0? > > BR > Nikos YOu CANNOT use ICMP tests to determine link capacity with a USRP -- ICMP is processed via  completely different   "stack" in the radio. Use "benchmark_rate" instead. > > On Sat, Apr 26, 2025 at 7:02 AM Nikos Balkanas <nbalkanas@gmail.com> > wrote: > > Thanks for your time. > I will check out the example. > This is not a buffer problem. I just need 1024 Samples > (real+imaginary) for FFT... > I should be able to get them in a single pass. > You saw my code, not a smoking gun there. > > This is probably is a physical problem. > Cable is an SFP fiber dedicated line. Cannot go bad. > Maybe the connections are not sitting right :(... > > BR > Nikos > > On Sat, Apr 26, 2025 at 6:45 AM Marcus D. Leech > <patchvonbraun@gmail.com> wrote: > > On 25/04/2025 23:33, Nikos Balkanas wrote: >> Actually MTU is 9000. This is one of the recommendations... >> I tried it with MTU 1500. It was worse:( >> maxsamples dropped to 364... > Right, 9000, rather than 8000. > > Upgrading to 10Gbit wont' give you larger MTU. > > What you're trying to do, I think, is to solve a > buffer-management problem in your *application* at entirely > the wrong >   level in the stack. > > It is EXCEEDINGLY COMMON for hardware drivers to only be able > to deliver in chunks that may not be perfectly adapted to >   the requirements of your application.  So, a common > programming pattern is to deal with this in your application. > > You should probably look at example code like rx_samples_to_file > > >> >> [INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300; >> UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1 >> [INFO] [X300] X300 initialization sequence... >> [INFO] [X300] Maximum frame size: 1472 bytes. >> [WARNING] [X300] For the 192.168.40.2 connection, UHD >> recommends a send frame size of at least 8000 for best >> performance, but your configuration will only allow 1472.This >> may negatively impact your maximum achievable sample rate. >> Check the MTU on the interface and/or the send_frame_size >> argument. >> [WARNING] [X300] For the 192.168.40.2 connection, UHD >> recommends a receive frame size of at least 8000 for best >> performance, but your configuration will only allow 1472.This >> may negatively impact your maximum achievable sample rate. >> Check the MTU on the interface and/or the recv_frame_size >> argument. >> [INFO] [GPS] No GPSDO found >> [INFO] [X300] Radio 1x clock: 200 MHz >> [WARNING] [UDP] The send buffer could not be resized >> sufficiently. >> Target sock buff size: 24912805 bytes. >> Actual sock buff size: 1048576 bytes. >> See the transport application notes on buffer resizing. >> Please run: sudo sysctl -w net.core.wmem_max=24912805 >> Sat Apr 26 06:30:34 2025 [00] [+] Created USRP with args >> Sat Apr 26 06:30:34 2025 [00] [+] Master clock is at 200 Mhz >> Sat Apr 26 06:30:34 2025 [00] [+] Tuner[0] gain set to 30 (30) dB >> [WARNING] [UDP] The send buffer could not be resized >> sufficiently. >> Target sock buff size: 24912805 bytes. >> Actual sock buff size: 1048576 bytes. >> See the transport application notes on buffer resizing. >> Please run: sudo sysctl -w net.core.wmem_max=24912805 >> Sat Apr 26 06:30:34 2025 [00] [*] scanner.l:1446:main >> Incorrect maxsamples (364). Expected 19960. >> Sat Apr 26 06:30:34 2025 [00] [+] Max samples/buffer[0]: 364 >> [WARNING] [0/Radio#0] Ignoring stream command for finite >> acquisition of zero sam >> >> Nikos >> >> On Sat, Apr 26, 2025 at 5:46 AM Marcus D. Leech >> <patchvonbraun@gmail.com> wrote: >> >> On 25/04/2025 22:26, Nikos Balkanas wrote: >>> Thanks Marcus, >>> >>> for your fast reply. >>> >>> On Sat, Apr 26, 2025 at 4:08 AM Marcus D. Leech >>> <patchvonbraun@gmail.com> wrote: >>> >>> On 25/04/2025 20:50, Nikos Balkanas wrote: >>>> Hello, >>>> >>>> I need to buy a new NIC. What would you suggest? >>>> The one I use is an old Mellanox 10 Gbs, before the >>>> Connect-4 series. >>>> It can only do 1996 S/s, need 19960 (10x more) to >>>> work with latest uhd. >>>> Using Ubuntu 24.04 and uhd 4.6.0 >>> So, 1.996ksps vs 19.960ksps?   You hardly need a >>> 10Gbit link to support that.  So, perhaps something >>>   is being lost here in your requirements? >>> >>> >>> True. Can't explain it in terms of bandwidth. 16 * 1996 >>> = 31.936 Kbps, 16 * 19960 = 319.360 Kbps well short of a >>> 10 Gbps line:( >>> Does a complex pair count as 1 sample, or 2? >>> I have followed all the instructions in >>> https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks, >>> Even installed the DPDK drivers. My Mellanox is too old >>> to use their OFED drivers:( >>> >>>> >>>> On a related question. it seems that the streamer >>>> doesn't crash anymore >>>> when receiving less than MAXSPS samples, instead it >>>> reads 0:( >>>> This was due to the sse2 code not aligned in convert. >>>> I change my stream args to cpu_format=sc16, >>>> otw=sc16, so no conversion required. >>>> Streamer still doesn't read anything. Is there a >>>> reason for it? >>>> >>> You'd need to share more of your code.  This should >>> just work as far as I can tell. >>> >>> Thanks. these are just the usrp code: >>> >>> int main() >>> { >>> uhd_stream_args_t stream_args = >>>                    { >>>                       .cpu_format = "sc16", >>>                       .otw_format = "sc16", >>>                       .args = "", >>>                       .n_channels = 1, >>>                        .channel_list = &channel >>>                      }; >>> ..uhd_stream_cmd_t stream_cmd = >>>                      { >>>                        .stream_mode = >>> UHD_STREAM_MODE_NUM_SAMPS_AND_DONE, >>>                         .stream_now = true >>>                       }; >>> >>> if (uhd_init(0, 0, gain)) do_exit(20); >>> if ((err = uhd_usrp_get_rx_stream(dev[0], >>> &stream_args, rx_streamer[0]))) >>> { >>> uhd_get_last_error(errmsg, 127); >>> error(log, "Failed to get streamer[0] (%d). %s.\n", >>> 0, FL, LN, FN, err, errmsg); >>> uhd_rx_streamer_free(&rx_streamer[0]); >>> rx_streamer[0] = NULL; >>> uhd_rx_metadata_free(&md[0]); >>> md[0] = NULL; >>> do_exit(30); >>> } >>> if ((err = >>> uhd_rx_streamer_max_num_samps(rx_streamer[0], >>> &maxsamps))) >>> >>> { >>> uhd_get_last_error(errmsg, 127); >>> error(log, "Failed to get max samples/buffer[0] >>> (%d). %s.\n", 0, FL, LN, FN, err, >>> ..errmsg); >>> do_exit(35); >>> } >>> if (maxsamps != MAXSMPS) >>> warn(log, "Incorrect maxsamples (%ld). Expected >>> %d.\n", 0, FL, LN, FN, maxsamps, >>> MAXSMPS); >>> info(log, "Max samples/buffer[0]: %ld\n", 0, maxsamps); >>> >>>     if ((err = >>> uhd_rx_streamer_issue_stream_cmd(rx_streamer[0], >>> &stream_cmd))) >>> >>> { >>> uhd_get_last_error(errmsg, 127); >>> error(log, "Failed to start streamer[0] (%d). >>> %s.\n", 0, FL, LN, FN, err, errmsg); >>> do_exit(40); >>> } >>> >>>          [...] >>>  do_exit(0) >>>      } >>> >>> bool uhd_init(size_t channel, double srate, double gain) >>> { >>> double tmp; >>> uhd_rx_metadata_error_code_t err; >>> >>> if ((err = >>> uhd_set_thread_priority(uhd_default_thread_priority, >>> true))) >>> warn(log, "Unable to set  main thread priority (%d). >>> %s.\n", 0, FL, LN, FN, >>> err, uhdError(err)); >>> /* Create USRP */ >>> f ((err = uhd_usrp_make(&dev[channel], "type=x300"))) >>> { >>> error(log, "Failed to create USRP (%d). %s.\n", 0, >>> FL, LN, FN, err, >>> uhdError(err)); >>> dev[channel] = NULL; >>> return(FAIL); >>> >>> } >>> info(stderr, "Created USRP with args\n", 0); >>> >>> /* Create RX streamer */ >>> if ((err = uhd_rx_streamer_make(&rx_streamer[channel]))) >>> { >>> error(log, "Failed to create rx_streamer[%d] (%d). >>> %s.\n", 0, FL, LN, FN, >>> channel, err, uhdError(err)); >>> return(FAIL); >>> } >>> /* Create RX metadata */ >>> if ((err = uhd_rx_metadata_make(&md[channel]))) >>> { >>> error(log, "Failed to create md[%d] (%d). %s.\n", 0, >>> FL, LN, FN, channel, >>> err, uhdError(err)); >>> return(FAIL); >>> } >>> >>> /* Get master clock rate */ >>> if ((err = >>> uhd_usrp_get_master_clock_rate(dev[channel], 0, &tmp))) >>> >>> { >>> error(log, "Failed to set master clock to %.0lf Mhz >>> (%d). %s.\n", 0, FL, >>> LN, FN, tmp/1000000, err, uhdError(err)); >>> return(FAIL); >>> } >>> info(stderr, "Master clock is at %.0lf Mhz\n", 0, >>> tmp/1000000); >>> /* Set the sample rate */ >>> if (srate && !uhd_set_rx_rate_check(channel, srate)) >>> return(FAIL); >>> /* Set the tuner gain SBX-120 is 0-31.5 in .5 db >>> steps */ >>> >>>        if ((err = uhd_usrp_set_rx_gain(dev[channel], >>> gain, channel, ""))) >>> { >>> error(log, "Failed to set tuner[%d] gain to %.0lf db >>> (%d). %s.\n", 0, FL, >>> LN, FN, channel, gain, err, uhdError(err)); >>> return(FAIL); >>> } >>>          if (!(err = >>> uhd_usrp_get_rx_gain(dev[channel], channel, "", &tmp))) >>> info(log, "Tuner[%d] gain set to %.0lf (%.0lf) >>> dB\n", 0, channel, tmp,gain); >>> >>> ./* Set channel bw to conserve tuner resources. Not >>> needed, set by srate */ >>> uhd_usrp_set_rx_bandwidth(dev[channel], srate, channel); >>> ./* Disable subtracting constant averaged background. >>> Signal looks cleaner */ >>> if ((err = >>> uhd_usrp_set_rx_dc_offset_enabled(dev[channel], false, >>> channel))) >>> { >>> warn(log, "Failed to disable FPGA DC offset on channel >>> %d(%d). %s.\n", 0, >>> FL, LN, FN, channel, err, uhdError(err)); >>> } >>> info(stderr, "Disabled FPGA DC offset on channel %d\n", >>> 0, channel); >>> return(SUCCESS); >>>          } >>> >>> This is the generated output: >>> >>> [INFO] [UHD] linux; GNU C++ version 13.2.0; >>> Boost_108300; UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1 >>> [INFO] [X300] X300 initialization sequence... >>> [INFO] [X300] Maximum frame size: 8000 bytes. >>> [INFO] [X300] Radio 1x clock: 200 MHz >>> Sat Apr 26 03:33:48 2025 [00] [+] Created USRP with args >>> Sat Apr 26 03:33:48 2025 [00] [+] Master clock is at 200 Mhz >>> Sat Apr 26 03:33:48 2025 [00] [+] Tuner[0] gain set to >>> 30 (30) dB >>> Sat Apr 26 03:33:48 2025 [00] [*] scanner.l:1446:main >>> Incorrect maxsamples (1996). Expected 19960. >>> Sat Apr 26 03:33:48 2025 [00] [+] Max samples/buffer[0]: >>> 1996 >>> [WARNING] [0/Radio#0] Ignoring stream command for finite >>> acquisition of zero samples >>> I hope this reads OK. Maybe next time I should attach >>> the code:) >>> >>>> TIA >>>> Nikos >>>> >>>> _______________________________________________ >>>> USRP-users mailing list --usrp-users@lists.ettus.com >>>> To unsubscribe send an email tousrp-users-leave@lists.ettus.com >>> >> I believe that max number of samples-per-buffer is >> limited by MTU size.   Which is typically around 8000 or >> so for "jumbo frames". >> >> >
NB
Nikos Balkanas
Sun, Apr 27, 2025 11:34 PM

For that i will need the sources.
Do you know where can I download the UHD 4.6.0 sources?

TIA
Nikos

On Mon, Apr 28, 2025 at 12:39 AM Marcus D. Leech patchvonbraun@gmail.com
wrote:

On 27/04/2025 17:37, Nikos Balkanas wrote:

Hi Marcus,

You were right. No need to change NIC:)
This is not a software issue. uhd_rx_streamer_max_num_samps runs right
after uhd initialization before
any other code had the chance to run.
Link capacity doesn't seem to be the issue either...
Running pchar on the link, descendant of pathchar, reports a throughput of
5.619 Kb/s requesting ICMP replies,
to varying packet sizes (32->9000 (MTU), incr by 32).
sudo pchar -m 9000 -p ipv4icmp usrp
https://www.kitchenlab.org/www/bmah/Software/pchar/

It corresponds to 351.218.019 16-bit samples or 175,609.044 32-bit
samples, if each sample is 32-bit(real + imag)
Seems that uhd is not running at link capacity but is doing smt else.
I will have  to download and check with the sources...
The package version for Ubuntu 24.04 is uhd 4.6.0.
Where can I download the sources for uhd 4.6.0?

BR
Nikos

YOu CANNOT use ICMP tests to determine link capacity with a USRP -- ICMP
is processed via  completely different
"stack" in the radio.

Use "benchmark_rate" instead.

On Sat, Apr 26, 2025 at 7:02 AM Nikos Balkanas nbalkanas@gmail.com
wrote:

Thanks for your time.
I will check out the example.
This is not a buffer problem. I just need 1024 Samples (real+imaginary)
for FFT...
I should be able to get them in a single pass.
You saw my code, not a smoking gun there.

This is probably is a physical problem.
Cable is an SFP fiber dedicated line. Cannot go bad.
Maybe the connections are not sitting right :(...

BR
Nikos

On Sat, Apr 26, 2025 at 6:45 AM Marcus D. Leech patchvonbraun@gmail.com
wrote:

On 25/04/2025 23:33, Nikos Balkanas wrote:

Actually MTU is 9000. This is one of the recommendations...
I tried it with MTU 1500. It was worse:(
maxsamples dropped to 364...

Right, 9000, rather than 8000.

Upgrading to 10Gbit wont' give you larger MTU.

What you're trying to do, I think, is to solve a buffer-management
problem in your application at entirely the wrong
level in the stack.

It is EXCEEDINGLY COMMON for hardware drivers to only be able to deliver
in chunks that may not be perfectly adapted to
the requirements of your application.  So, a common programming
pattern is to deal with this in your application.

You should probably look at example code like rx_samples_to_file

[INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300;
UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1
[INFO] [X300] X300 initialization sequence...
[INFO] [X300] Maximum frame size: 1472 bytes.
[WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a send
frame size of at least 8000 for best
performance, but your configuration will only allow 1472.This may
negatively impact your maximum achievable sample rate.
Check the MTU on the interface and/or the send_frame_size argument.
[WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a
receive frame size of at least 8000 for best
performance, but your configuration will only allow 1472.This may
negatively impact your maximum achievable sample rate.
Check the MTU on the interface and/or the recv_frame_size argument.
[INFO] [GPS] No GPSDO found
[INFO] [X300] Radio 1x clock: 200 MHz
[WARNING] [UDP] The send buffer could not be resized sufficiently.
Target sock buff size: 24912805 bytes.
Actual sock buff size: 1048576 bytes.
See the transport application notes on buffer resizing.
Please run: sudo sysctl -w net.core.wmem_max=24912805
Sat Apr 26 06:30:34 2025 [00] [+] Created USRP with args
Sat Apr 26 06:30:34 2025 [00] [+] Master clock is at 200 Mhz
Sat Apr 26 06:30:34 2025 [00] [+] Tuner[0] gain set to 30 (30) dB
[WARNING] [UDP] The send buffer could not be resized sufficiently.
Target sock buff size: 24912805 bytes.
Actual sock buff size: 1048576 bytes.
See the transport application notes on buffer resizing.
Please run: sudo sysctl -w net.core.wmem_max=24912805
Sat Apr 26 06:30:34 2025 [00] [*] scanner.l:1446:main Incorrect
maxsamples (364). Expected 19960.
Sat Apr 26 06:30:34 2025 [00] [+] Max samples/buffer[0]: 364
[WARNING] [0/Radio#0] Ignoring stream command for finite acquisition of
zero sam

Nikos

On Sat, Apr 26, 2025 at 5:46 AM Marcus D. Leech patchvonbraun@gmail.com
wrote:

On 25/04/2025 22:26, Nikos Balkanas wrote:

Thanks Marcus,

for your fast reply.

On Sat, Apr 26, 2025 at 4:08 AM Marcus D. Leech <
patchvonbraun@gmail.com> wrote:

On 25/04/2025 20:50, Nikos Balkanas wrote:

Hello,

I need to buy a new NIC. What would you suggest?
The one I use is an old Mellanox 10 Gbs, before the Connect-4 series.
It can only do 1996 S/s, need 19960 (10x more) to work with latest uhd.
Using Ubuntu 24.04 and uhd 4.6.0

So, 1.996ksps vs 19.960ksps?  You hardly need a 10Gbit link to
support that.  So, perhaps something
is being lost here in your requirements?

True. Can't explain it in terms of bandwidth. 16 * 1996 = 31.936 Kbps,
16 * 19960 = 319.360 Kbps well short of a 10 Gbps line:(
Does a complex pair count as 1 sample, or 2?
I have followed all the instructions in
https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks,
Even installed the DPDK drivers. My Mellanox is too old to use their
OFED drivers:(

On a related question. it seems that the streamer doesn't crash anymore
when receiving less than MAXSPS samples, instead it reads 0:(
This was due to the sse2 code not aligned in convert.
I change my stream args to cpu_format=sc16, otw=sc16, so no conversion
required.
Streamer still doesn't read anything. Is there a reason for it?

You'd need to share more of your code.  This should just work as far
as I can tell.

Thanks. these are just the usrp code:

int main()
{
uhd_stream_args_t stream_args =
{

.cpu_format = "sc16",

.otw_format = "sc16",
.args =
"",

.n_channels = 1,

.channel_list = &channel
};
..uhd_stream_cmd_t stream_cmd =
{

.stream_mode = UHD_STREAM_MODE_NUM_SAMPS_AND_DONE,

.stream_now = true
};

 if (uhd_init(0, 0, gain)) do_exit(20);
 if ((err = uhd_usrp_get_rx_stream(dev[0], &stream_args,

rx_streamer[0])))
{
uhd_get_last_error(errmsg, 127);
error(log, "Failed to get streamer[0] (%d). %s.\n", 0, FL,
LN, FN, err, errmsg);
uhd_rx_streamer_free(&rx_streamer[0]);
rx_streamer[0] = NULL;
uhd_rx_metadata_free(&md[0]);
md[0] = NULL;
do_exit(30);
}
if ((err = uhd_rx_streamer_max_num_samps(rx_streamer[0],
&maxsamps)))

  {
      uhd_get_last_error(errmsg, 127);
      error(log, "Failed to get max samples/buffer[0] (%d).

%s.\n", 0, FL, LN, FN, err,
..errmsg);
do_exit(35);
}
if (maxsamps != MAXSMPS)
warn(log, "Incorrect maxsamples (%ld). Expected %d.\n", 0,
FL, LN, FN, maxsamps,
MAXSMPS);
info(log, "Max samples/buffer[0]: %ld\n", 0, maxsamps);

 if ((err = uhd_rx_streamer_issue_stream_cmd(rx_streamer[0],

&stream_cmd)))

 {
     uhd_get_last_error(errmsg, 127);
     error(log, "Failed to start streamer[0] (%d). %s.\n", 0, FL,

LN, FN, err, errmsg);
do_exit(40);
}

      [...]
      do_exit(0)
  }

bool uhd_init(size_t channel, double srate, double gain)
{
double tmp;
uhd_rx_metadata_error_code_t err;

  if ((err = uhd_set_thread_priority(uhd_default_thread_priority,

true)))
warn(log, "Unable to set  main thread priority (%d).
%s.\n", 0, FL, LN, FN,
err, uhdError(err));
/* Create USRP */
f ((err = uhd_usrp_make(&dev[channel], "type=x300")))
{
error(log, "Failed to create USRP (%d). %s.\n", 0, FL, LN,
FN, err,
uhdError(err));
dev[channel] = NULL;
return(FAIL);

      }
      info(stderr, "Created USRP with args\n", 0);

 /* Create RX streamer */
 if ((err = uhd_rx_streamer_make(&rx_streamer[channel])))
 {
     error(log, "Failed to create rx_streamer[%d] (%d). %s.\n", 0,

FL, LN, FN,
channel, err, uhdError(err));
return(FAIL);
}
/* Create RX metadata */
if ((err = uhd_rx_metadata_make(&md[channel])))
{
error(log, "Failed to create md[%d] (%d). %s.\n", 0, FL, LN,
FN, channel,
err, uhdError(err));
return(FAIL);
}

 /* Get master clock rate */
  if ((err = uhd_usrp_get_master_clock_rate(dev[channel], 0,

&tmp)))

   {
        error(log, "Failed to set master clock to %.0lf Mhz (%d).

%s.\n", 0, FL,
LN, FN, tmp/1000000, err, uhdError(err));
return(FAIL);
}
info(stderr, "Master clock is at %.0lf Mhz\n", 0, tmp/1000000);
/* Set the sample rate /
if (srate && !uhd_set_rx_rate_check(channel, srate))
return(FAIL);
/
Set the tuner gain SBX-120 is 0-31.5 in .5 db steps */

    if ((err = uhd_usrp_set_rx_gain(dev[channel], gain, channel,

"")))
{
error(log, "Failed to set tuner[%d] gain to %.0lf db
(%d). %s.\n", 0, FL,
LN, FN, channel, gain, err, uhdError(err));
return(FAIL);
}
if (!(err = uhd_usrp_get_rx_gain(dev[channel], channel, "",
&tmp)))
info(log, "Tuner[%d] gain set to %.0lf (%.0lf) dB\n",
0, channel, tmp, gain);

     ./* Set channel bw to conserve tuner resources. Not needed,

set by srate /
uhd_usrp_set_rx_bandwidth(dev[channel], srate, channel);
./
Disable subtracting constant averaged background. Signal
looks cleaner */
if ((err = uhd_usrp_set_rx_dc_offset_enabled(dev[channel],
false, channel)))
{
warn(log, "Failed to disable FPGA DC offset on
channel %d(%d). %s.\n", 0,
FL, LN, FN, channel, err, uhdError(err));
}
info(stderr, "Disabled FPGA DC offset on channel %d\n",
0, channel);
return(SUCCESS);
}

This is the generated output:

[INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300;
UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1
[INFO] [X300] X300 initialization sequence...
[INFO] [X300] Maximum frame size: 8000 bytes.
[INFO] [X300] Radio 1x clock: 200 MHz
Sat Apr 26 03:33:48 2025 [00] [+] Created USRP with args
Sat Apr 26 03:33:48 2025 [00] [+] Master clock is at 200 Mhz
Sat Apr 26 03:33:48 2025 [00] [+] Tuner[0] gain set to 30 (30) dB
Sat Apr 26 03:33:48 2025 [00] [*] scanner.l:1446:main Incorrect
maxsamples (1996). Expected 19960.
Sat Apr 26 03:33:48 2025 [00] [+] Max samples/buffer[0]: 1996
[WARNING] [0/Radio#0] Ignoring stream command for finite acquisition of
zero samples
I hope this reads OK. Maybe next time I should attach the code:)

TIA
Nikos


USRP-users mailing list -- usrp-users@lists.ettus.com
To unsubscribe send an email to usrp-users-leave@lists.ettus.com

I believe that max number of samples-per-buffer is limited by MTU

size.  Which is typically around 8000 or so for "jumbo frames".

For that i will need the sources. Do you know where can I download the UHD 4.6.0 sources? TIA Nikos On Mon, Apr 28, 2025 at 12:39 AM Marcus D. Leech <patchvonbraun@gmail.com> wrote: > On 27/04/2025 17:37, Nikos Balkanas wrote: > > Hi Marcus, > > You were right. No need to change NIC:) > This is not a software issue. uhd_rx_streamer_max_num_samps runs right > after uhd initialization before > any other code had the chance to run. > Link capacity doesn't seem to be the issue either... > Running pchar on the link, descendant of pathchar, reports a throughput of > 5.619 Kb/s requesting ICMP replies, > to varying packet sizes (32->9000 (MTU), incr by 32). > sudo pchar -m 9000 -p ipv4icmp usrp > https://www.kitchenlab.org/www/bmah/Software/pchar/ > > It corresponds to 351.218.019 16-bit samples or 175,609.044 32-bit > samples, if each sample is 32-bit(real + imag) > Seems that uhd is not running at link capacity but is doing smt else. > I will have to download and check with the sources... > The package version for Ubuntu 24.04 is uhd 4.6.0. > Where can I download the sources for uhd 4.6.0? > > BR > Nikos > > YOu CANNOT use ICMP tests to determine link capacity with a USRP -- ICMP > is processed via completely different > "stack" in the radio. > > Use "benchmark_rate" instead. > > > > On Sat, Apr 26, 2025 at 7:02 AM Nikos Balkanas <nbalkanas@gmail.com> > wrote: > >> Thanks for your time. >> I will check out the example. >> This is not a buffer problem. I just need 1024 Samples (real+imaginary) >> for FFT... >> I should be able to get them in a single pass. >> You saw my code, not a smoking gun there. >> >> This is probably is a physical problem. >> Cable is an SFP fiber dedicated line. Cannot go bad. >> Maybe the connections are not sitting right :(... >> >> BR >> Nikos >> >> On Sat, Apr 26, 2025 at 6:45 AM Marcus D. Leech <patchvonbraun@gmail.com> >> wrote: >> >>> On 25/04/2025 23:33, Nikos Balkanas wrote: >>> >>> Actually MTU is 9000. This is one of the recommendations... >>> I tried it with MTU 1500. It was worse:( >>> maxsamples dropped to 364... >>> >>> Right, 9000, rather than 8000. >>> >>> Upgrading to 10Gbit wont' give you larger MTU. >>> >>> What you're trying to do, I think, is to solve a buffer-management >>> problem in your *application* at entirely the wrong >>> level in the stack. >>> >>> It is EXCEEDINGLY COMMON for hardware drivers to only be able to deliver >>> in chunks that may not be perfectly adapted to >>> the requirements of your application. So, a common programming >>> pattern is to deal with this in your application. >>> >>> You should probably look at example code like rx_samples_to_file >>> >>> >>> >>> [INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300; >>> UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1 >>> [INFO] [X300] X300 initialization sequence... >>> [INFO] [X300] Maximum frame size: 1472 bytes. >>> [WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a send >>> frame size of at least 8000 for best >>> performance, but your configuration will only allow 1472.This may >>> negatively impact your maximum achievable sample rate. >>> Check the MTU on the interface and/or the send_frame_size argument. >>> [WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a >>> receive frame size of at least 8000 for best >>> performance, but your configuration will only allow 1472.This may >>> negatively impact your maximum achievable sample rate. >>> Check the MTU on the interface and/or the recv_frame_size argument. >>> [INFO] [GPS] No GPSDO found >>> [INFO] [X300] Radio 1x clock: 200 MHz >>> [WARNING] [UDP] The send buffer could not be resized sufficiently. >>> Target sock buff size: 24912805 bytes. >>> Actual sock buff size: 1048576 bytes. >>> See the transport application notes on buffer resizing. >>> Please run: sudo sysctl -w net.core.wmem_max=24912805 >>> Sat Apr 26 06:30:34 2025 [00] [+] Created USRP with args >>> Sat Apr 26 06:30:34 2025 [00] [+] Master clock is at 200 Mhz >>> Sat Apr 26 06:30:34 2025 [00] [+] Tuner[0] gain set to 30 (30) dB >>> [WARNING] [UDP] The send buffer could not be resized sufficiently. >>> Target sock buff size: 24912805 bytes. >>> Actual sock buff size: 1048576 bytes. >>> See the transport application notes on buffer resizing. >>> Please run: sudo sysctl -w net.core.wmem_max=24912805 >>> Sat Apr 26 06:30:34 2025 [00] [*] scanner.l:1446:main Incorrect >>> maxsamples (364). Expected 19960. >>> Sat Apr 26 06:30:34 2025 [00] [+] Max samples/buffer[0]: 364 >>> [WARNING] [0/Radio#0] Ignoring stream command for finite acquisition of >>> zero sam >>> >>> Nikos >>> >>> On Sat, Apr 26, 2025 at 5:46 AM Marcus D. Leech <patchvonbraun@gmail.com> >>> wrote: >>> >>>> On 25/04/2025 22:26, Nikos Balkanas wrote: >>>> >>>> Thanks Marcus, >>>> >>>> for your fast reply. >>>> >>>> On Sat, Apr 26, 2025 at 4:08 AM Marcus D. Leech < >>>> patchvonbraun@gmail.com> wrote: >>>> >>>>> On 25/04/2025 20:50, Nikos Balkanas wrote: >>>>> >>>>> Hello, >>>>> >>>>> I need to buy a new NIC. What would you suggest? >>>>> The one I use is an old Mellanox 10 Gbs, before the Connect-4 series. >>>>> It can only do 1996 S/s, need 19960 (10x more) to work with latest uhd. >>>>> Using Ubuntu 24.04 and uhd 4.6.0 >>>>> >>>>> So, 1.996ksps vs 19.960ksps? You hardly need a 10Gbit link to >>>>> support that. So, perhaps something >>>>> is being lost here in your requirements? >>>>> >>>> >>>> True. Can't explain it in terms of bandwidth. 16 * 1996 = 31.936 Kbps, >>>> 16 * 19960 = 319.360 Kbps well short of a 10 Gbps line:( >>>> Does a complex pair count as 1 sample, or 2? >>>> I have followed all the instructions in >>>> https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks, >>>> Even installed the DPDK drivers. My Mellanox is too old to use their >>>> OFED drivers:( >>>> >>>>> >>>>> On a related question. it seems that the streamer doesn't crash anymore >>>>> when receiving less than MAXSPS samples, instead it reads 0:( >>>>> This was due to the sse2 code not aligned in convert. >>>>> I change my stream args to cpu_format=sc16, otw=sc16, so no conversion >>>>> required. >>>>> Streamer still doesn't read anything. Is there a reason for it? >>>>> >>>>> You'd need to share more of your code. This should just work as far >>>>> as I can tell. >>>>> >>>>> Thanks. these are just the usrp code: >>>> >>>> int main() >>>> { >>>> uhd_stream_args_t stream_args = >>>> { >>>> >>>> .cpu_format = "sc16", >>>> >>>> .otw_format = "sc16", >>>> .args = >>>> "", >>>> >>>> .n_channels = 1, >>>> >>>> .channel_list = &channel >>>> }; >>>> ..uhd_stream_cmd_t stream_cmd = >>>> { >>>> >>>> .stream_mode = UHD_STREAM_MODE_NUM_SAMPS_AND_DONE, >>>> >>>> .stream_now = true >>>> }; >>>> >>>> if (uhd_init(0, 0, gain)) do_exit(20); >>>>> if ((err = uhd_usrp_get_rx_stream(dev[0], &stream_args, >>>>> rx_streamer[0]))) >>>>> { >>>>> uhd_get_last_error(errmsg, 127); >>>>> error(log, "Failed to get streamer[0] (%d). %s.\n", 0, FL, >>>>> LN, FN, err, errmsg); >>>>> uhd_rx_streamer_free(&rx_streamer[0]); >>>>> rx_streamer[0] = NULL; >>>>> uhd_rx_metadata_free(&md[0]); >>>>> md[0] = NULL; >>>>> do_exit(30); >>>>> } >>>>> if ((err = uhd_rx_streamer_max_num_samps(rx_streamer[0], >>>>> &maxsamps))) >>>>> >>>> { >>>>> uhd_get_last_error(errmsg, 127); >>>>> error(log, "Failed to get max samples/buffer[0] (%d). >>>>> %s.\n", 0, FL, LN, FN, err, >>>>> ..errmsg); >>>>> do_exit(35); >>>>> } >>>>> if (maxsamps != MAXSMPS) >>>>> warn(log, "Incorrect maxsamples (%ld). Expected %d.\n", 0, >>>>> FL, LN, FN, maxsamps, >>>>> MAXSMPS); >>>>> info(log, "Max samples/buffer[0]: %ld\n", 0, maxsamps); >>>>> >>>>> if ((err = uhd_rx_streamer_issue_stream_cmd(rx_streamer[0], >>>>> &stream_cmd))) >>>>> >>>> { >>>>> uhd_get_last_error(errmsg, 127); >>>>> error(log, "Failed to start streamer[0] (%d). %s.\n", 0, FL, >>>>> LN, FN, err, errmsg); >>>>> do_exit(40); >>>>> } >>>>> >>>> [...] >>>> do_exit(0) >>>> } >>>> >>>> >>>>> bool uhd_init(size_t channel, double srate, double gain) >>>>> { >>>>> double tmp; >>>>> uhd_rx_metadata_error_code_t err; >>>>> >>>>> if ((err = uhd_set_thread_priority(uhd_default_thread_priority, >>>>> true))) >>>>> warn(log, "Unable to set main thread priority (%d). >>>>> %s.\n", 0, FL, LN, FN, >>>>> err, uhdError(err)); >>>>> /* Create USRP */ >>>>> f ((err = uhd_usrp_make(&dev[channel], "type=x300"))) >>>>> { >>>>> error(log, "Failed to create USRP (%d). %s.\n", 0, FL, LN, >>>>> FN, err, >>>>> uhdError(err)); >>>>> dev[channel] = NULL; >>>>> return(FAIL); >>>>> >>>> } >>>>> info(stderr, "Created USRP with args\n", 0); >>>>> >>>>> /* Create RX streamer */ >>>>> if ((err = uhd_rx_streamer_make(&rx_streamer[channel]))) >>>>> { >>>>> error(log, "Failed to create rx_streamer[%d] (%d). %s.\n", 0, >>>>> FL, LN, FN, >>>>> channel, err, uhdError(err)); >>>>> return(FAIL); >>>>> } >>>>> /* Create RX metadata */ >>>>> if ((err = uhd_rx_metadata_make(&md[channel]))) >>>>> { >>>>> error(log, "Failed to create md[%d] (%d). %s.\n", 0, FL, LN, >>>>> FN, channel, >>>>> err, uhdError(err)); >>>>> return(FAIL); >>>>> } >>>>> >>>>> /* Get master clock rate */ >>>>> if ((err = uhd_usrp_get_master_clock_rate(dev[channel], 0, >>>>> &tmp))) >>>>> >>>> { >>>>> error(log, "Failed to set master clock to %.0lf Mhz (%d). >>>>> %s.\n", 0, FL, >>>>> LN, FN, tmp/1000000, err, uhdError(err)); >>>>> return(FAIL); >>>>> } >>>>> info(stderr, "Master clock is at %.0lf Mhz\n", 0, tmp/1000000); >>>>> /* Set the sample rate */ >>>>> if (srate && !uhd_set_rx_rate_check(channel, srate)) >>>>> return(FAIL); >>>>> /* Set the tuner gain SBX-120 is 0-31.5 in .5 db steps */ >>>>> >>>> if ((err = uhd_usrp_set_rx_gain(dev[channel], gain, channel, >>>>> ""))) >>>>> { >>>>> error(log, "Failed to set tuner[%d] gain to %.0lf db >>>>> (%d). %s.\n", 0, FL, >>>>> LN, FN, channel, gain, err, uhdError(err)); >>>>> return(FAIL); >>>>> } >>>>> if (!(err = uhd_usrp_get_rx_gain(dev[channel], channel, "", >>>>> &tmp))) >>>>> info(log, "Tuner[%d] gain set to %.0lf (%.0lf) dB\n", >>>>> 0, channel, tmp, gain); >>>>> >>>> ./* Set channel bw to conserve tuner resources. Not needed, >>>> set by srate */ >>>> uhd_usrp_set_rx_bandwidth(dev[channel], srate, channel); >>>> ./* Disable subtracting constant averaged background. Signal >>>> looks cleaner */ >>>> if ((err = uhd_usrp_set_rx_dc_offset_enabled(dev[channel], >>>> false, channel))) >>>> { >>>> warn(log, "Failed to disable FPGA DC offset on >>>> channel %d(%d). %s.\n", 0, >>>> FL, LN, FN, channel, err, uhdError(err)); >>>> } >>>> info(stderr, "Disabled FPGA DC offset on channel %d\n", >>>> 0, channel); >>>> return(SUCCESS); >>>> } >>>> >>>> This is the generated output: >>>> >>>> [INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300; >>>> UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1 >>>> [INFO] [X300] X300 initialization sequence... >>>> [INFO] [X300] Maximum frame size: 8000 bytes. >>>> [INFO] [X300] Radio 1x clock: 200 MHz >>>> Sat Apr 26 03:33:48 2025 [00] [+] Created USRP with args >>>> Sat Apr 26 03:33:48 2025 [00] [+] Master clock is at 200 Mhz >>>> Sat Apr 26 03:33:48 2025 [00] [+] Tuner[0] gain set to 30 (30) dB >>>> Sat Apr 26 03:33:48 2025 [00] [*] scanner.l:1446:main Incorrect >>>> maxsamples (1996). Expected 19960. >>>> Sat Apr 26 03:33:48 2025 [00] [+] Max samples/buffer[0]: 1996 >>>> [WARNING] [0/Radio#0] Ignoring stream command for finite acquisition of >>>> zero samples >>>> I hope this reads OK. Maybe next time I should attach the code:) >>>> >>>>> TIA >>>>> Nikos >>>>> >>>>> _______________________________________________ >>>>> USRP-users mailing list -- usrp-users@lists.ettus.com >>>>> To unsubscribe send an email to usrp-users-leave@lists.ettus.com >>>>> >>>>> >>>>> I believe that max number of samples-per-buffer is limited by MTU >>>> size. Which is typically around 8000 or so for "jumbo frames". >>>> >>>> >>>> >>> >
MD
Marcus D. Leech
Sun, Apr 27, 2025 11:45 PM

On 27/04/2025 19:34, Nikos Balkanas wrote:

For that i will need the sources.
Do you know where can I download the UHD 4.6.0 sources?

TIA
Nikos

If you have an installed version of UHD on your system, then the
examples should also have been installed.  How did you install
  UHD?

You might need to install "uhd-host" if you installed from packaged
binaries, but all the examples and utilities should be
  there along with the libraries.

But the GIT repo for the UHD source is here:

https://github.com/EttusResearch/uhd

These days, most distros package UHD, so in many cases you don't need to
build from source.

On Mon, Apr 28, 2025 at 12:39 AM Marcus D. Leech
patchvonbraun@gmail.com wrote:

 On 27/04/2025 17:37, Nikos Balkanas wrote:
 Hi Marcus,

 You were right. No need to change NIC:)
 This is not a software issue. uhd_rx_streamer_max_num_samps runs
 right after uhd initialization before
 any other code had the chance to run.
 Link capacity doesn't seem to be the issue either...
 Running pchar on the link, descendant of pathchar, reports a
 throughput of 5.619 Kb/s requesting ICMP replies,
 to varying packet sizes (32->9000 (MTU), incr by 32).
 sudo pchar -m 9000 -p ipv4icmp usrp
 https://www.kitchenlab.org/www/bmah/Software/pchar/

 It corresponds to 351.218.019 16-bit samples or 175,609.044
 32-bit samples, if each sample is 32-bit(real + imag)
 Seems that uhd is not running at link capacity but is doing smt else.
 I will have  to download and check with the sources...
 The package version for Ubuntu 24.04 is uhd 4.6.0.
 Where can I download the sources for uhd 4.6.0?

 BR
 Nikos
 YOu CANNOT use ICMP tests to determine link capacity with a USRP
 -- ICMP is processed via  completely different
   "stack" in the radio.

 Use "benchmark_rate" instead.
 On Sat, Apr 26, 2025 at 7:02 AM Nikos Balkanas
 <nbalkanas@gmail.com> wrote:

     Thanks for your time.
     I will check out the example.
     This is not a buffer problem. I just need 1024 Samples
     (real+imaginary) for FFT...
     I should be able to get them in a single pass.
     You saw my code, not a smoking gun there.

     This is probably is a physical problem.
     Cable is an SFP fiber dedicated line. Cannot go bad.
     Maybe the connections are not sitting right :(...

     BR
     Nikos

     On Sat, Apr 26, 2025 at 6:45 AM Marcus D. Leech
     <patchvonbraun@gmail.com> wrote:

         On 25/04/2025 23:33, Nikos Balkanas wrote:
         Actually MTU is 9000. This is one of the recommendations...
         I tried it with MTU 1500. It was worse:(
         maxsamples dropped to 364...
         Right, 9000, rather than 8000.

         Upgrading to 10Gbit wont' give you larger MTU.

         What you're trying to do, I think, is to solve a
         buffer-management problem in your *application* at
         entirely the wrong
           level in the stack.

         It is EXCEEDINGLY COMMON for hardware drivers to only be
         able to deliver in chunks that may not be perfectly
         adapted to
           the requirements of your application.  So, a common
         programming pattern is to deal with this in your application.

         You should probably look at example code like
         rx_samples_to_file
         [INFO] [UHD] linux; GNU C++ version 13.2.0;
         Boost_108300; UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1
         [INFO] [X300] X300 initialization sequence...
         [INFO] [X300] Maximum frame size: 1472 bytes.
         [WARNING] [X300] For the 192.168.40.2 connection, UHD
         recommends a send frame size of at least 8000 for best
         performance, but your configuration will only allow
         1472.This may negatively impact your maximum achievable
         sample rate.
         Check the MTU on the interface and/or the
         send_frame_size argument.
         [WARNING] [X300] For the 192.168.40.2 connection, UHD
         recommends a receive frame size of at least 8000 for best
         performance, but your configuration will only allow
         1472.This may negatively impact your maximum achievable
         sample rate.
         Check the MTU on the interface and/or the
         recv_frame_size argument.
         [INFO] [GPS] No GPSDO found
         [INFO] [X300] Radio 1x clock: 200 MHz
         [WARNING] [UDP] The send buffer could not be resized
         sufficiently.
         Target sock buff size: 24912805 bytes.
         Actual sock buff size: 1048576 bytes.
         See the transport application notes on buffer resizing.
         Please run: sudo sysctl -w net.core.wmem_max=24912805
         Sat Apr 26 06:30:34 2025 [00] [+] Created USRP with args
         Sat Apr 26 06:30:34 2025 [00] [+] Master clock is at 200 Mhz
         Sat Apr 26 06:30:34 2025 [00] [+] Tuner[0] gain set to
         30 (30) dB
         [WARNING] [UDP] The send buffer could not be resized
         sufficiently.
         Target sock buff size: 24912805 bytes.
         Actual sock buff size: 1048576 bytes.
         See the transport application notes on buffer resizing.
         Please run: sudo sysctl -w net.core.wmem_max=24912805
         Sat Apr 26 06:30:34 2025 [00] [*] scanner.l:1446:main
         Incorrect maxsamples (364). Expected 19960.
         Sat Apr 26 06:30:34 2025 [00] [+] Max samples/buffer[0]: 364
         [WARNING] [0/Radio#0] Ignoring stream command for finite
         acquisition of zero sam

         Nikos

         On Sat, Apr 26, 2025 at 5:46 AM Marcus D. Leech
         <patchvonbraun@gmail.com> wrote:

             On 25/04/2025 22:26, Nikos Balkanas wrote:
             Thanks Marcus,

             for your fast reply.

             On Sat, Apr 26, 2025 at 4:08 AM Marcus D. Leech
             <patchvonbraun@gmail.com> wrote:

                 On 25/04/2025 20:50, Nikos Balkanas wrote:
                 Hello,

                 I need to buy a new NIC. What would you suggest?
                 The one I use is an old Mellanox 10 Gbs,
                 before the Connect-4 series.
                 It can only do 1996 S/s, need 19960 (10x more)
                 to work with latest uhd.
                 Using Ubuntu 24.04 and uhd 4.6.0
                 So, 1.996ksps vs 19.960ksps? You hardly need a
                 10Gbit link to support that.  So, perhaps something
                   is being lost here in your requirements?


             True. Can't explain it in terms of bandwidth. 16 *
             1996 = 31.936 Kbps, 16 * 19960 = 319.360 Kbps well
             short of a 10 Gbps line:(
             Does a complex pair count as 1 sample, or 2?
             I have followed all the instructions in
             https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks,
             Even installed the DPDK drivers. My Mellanox is too
             old to use their OFED drivers:(
                 On a related question. it seems that the
                 streamer doesn't crash anymore
                 when receiving less than MAXSPS samples,
                 instead it reads 0:(
                 This was due to the sse2 code not aligned in
                 convert.
                 I change my stream args to cpu_format=sc16,
                 otw=sc16, so no conversion required.
                 Streamer still doesn't read anything. Is there
                 a reason for it?
                 You'd need to share more of your code.  This
                 should just work as far as I can tell.

             Thanks. these are just the usrp code:

             int main()
             {
             uhd_stream_args_t stream_args =
                                        {
             .cpu_format = "sc16",
             .otw_format = "sc16",
             .args = "",
             .n_channels = 1,
              .channel_list = &channel
                                          };
             ..uhd_stream_cmd_t stream_cmd =
                                          {
              .stream_mode = UHD_STREAM_MODE_NUM_SAMPS_AND_DONE,
             .stream_now = true
                                           };

                 if (uhd_init(0, 0, gain)) do_exit(20);
                 if ((err = uhd_usrp_get_rx_stream(dev[0],
                 &stream_args, rx_streamer[0])))
                 {
                 uhd_get_last_error(errmsg, 127);
                 error(log, "Failed to get streamer[0] (%d).
                 %s.\n", 0, FL, LN, FN, err, errmsg);
                 uhd_rx_streamer_free(&rx_streamer[0]);
                 rx_streamer[0] = NULL;
                 uhd_rx_metadata_free(&md[0]);
                 md[0] = NULL;
                 do_exit(30);
                 }
                 if ((err =
                 uhd_rx_streamer_max_num_samps(rx_streamer[0],
                 &maxsamps)))

                 {
                 uhd_get_last_error(errmsg, 127);
                 error(log, "Failed to get max samples/buffer[0]
                 (%d). %s.\n", 0, FL, LN, FN, err,
                 ..errmsg);
                 do_exit(35);
                 }
                 if (maxsamps != MAXSMPS)
                 warn(log, "Incorrect maxsamples (%ld). Expected
                 %d.\n", 0, FL, LN, FN, maxsamps,
                 MAXSMPS);
                 info(log, "Max samples/buffer[0]: %ld\n", 0,
                 maxsamps);

                 if ((err =
                 uhd_rx_streamer_issue_stream_cmd(rx_streamer[0],
                 &stream_cmd)))

                 {
                 uhd_get_last_error(errmsg, 127);
                 error(log, "Failed to start streamer[0] (%d).
                 %s.\n", 0, FL, LN, FN, err, errmsg);
                 do_exit(40);
                 }

                [...]
              do_exit(0)
                  }

                 bool uhd_init(size_t channel, double srate,
                 double gain)
                 {
                 double tmp;
                 uhd_rx_metadata_error_code_t err;

                 if ((err =
                 uhd_set_thread_priority(uhd_default_thread_priority,
                 true)))
                 warn(log, "Unable to set  main thread priority
                 (%d). %s.\n", 0, FL, LN, FN,
                 err, uhdError(err));
                 /* Create USRP */
                 f ((err = uhd_usrp_make(&dev[channel],
                 "type=x300")))
                 {
                 error(log, "Failed to create USRP (%d). %s.\n",
                 0, FL, LN, FN, err,
                 uhdError(err));
                 dev[channel] = NULL;
                         return(FAIL);

                 }
                 info(stderr, "Created USRP with args\n", 0);

                 /* Create RX streamer */
                 if ((err =
                 uhd_rx_streamer_make(&rx_streamer[channel])))
                 {
                 error(log, "Failed to create rx_streamer[%d]
                 (%d). %s.\n", 0, FL, LN, FN,
                 channel, err, uhdError(err));
                 return(FAIL);
                 }
                 /* Create RX metadata */
                 if ((err = uhd_rx_metadata_make(&md[channel])))
                 {
                 error(log, "Failed to create md[%d] (%d).
                 %s.\n", 0, FL, LN, FN, channel,
                 err, uhdError(err));
                 return(FAIL);
                 }

                 /* Get master clock rate */
                 if ((err =
                 uhd_usrp_get_master_clock_rate(dev[channel], 0,
                 &tmp)))

                 {
                 error(log, "Failed to set master clock to %.0lf
                 Mhz (%d). %s.\n", 0, FL,
                 LN, FN, tmp/1000000, err, uhdError(err));
                 return(FAIL);
                 }
                 info(stderr, "Master clock is at %.0lf Mhz\n",
                 0, tmp/1000000);
                 /* Set the sample rate */
                 if (srate && !uhd_set_rx_rate_check(channel,
                 srate)) return(FAIL);
                 /* Set the tuner gain SBX-120 is 0-31.5 in .5
                 db steps */

                    if ((err =
                 uhd_usrp_set_rx_gain(dev[channel], gain,
                 channel, "")))
                 {
                 error(log, "Failed to set tuner[%d] gain to
                 %.0lf db (%d). %s.\n", 0, FL,
                 LN, FN, channel, gain, err, uhdError(err));
                 return(FAIL);
                 }
                      if (!(err =
                 uhd_usrp_get_rx_gain(dev[channel], channel, "",
                 &tmp)))
                 info(log, "Tuner[%d] gain set to %.0lf (%.0lf)
                 dB\n", 0, channel, tmp,gain);

             ./* Set channel bw to conserve tuner resources. Not
             needed, set by srate */
             uhd_usrp_set_rx_bandwidth(dev[channel], srate,
             channel);
             ./* Disable subtracting constant averaged
             background. Signal looks cleaner */
             if ((err =
             uhd_usrp_set_rx_dc_offset_enabled(dev[channel],
             false, channel)))
             {
             warn(log, "Failed to disable FPGA DC offset on
             channel %d(%d). %s.\n", 0,
             FL, LN, FN, channel, err, uhdError(err));
             }
             info(stderr, "Disabled FPGA DC offset on channel
             %d\n", 0, channel);
             return(SUCCESS);
                }

             This is the generated output:

             [INFO] [UHD] linux; GNU C++ version 13.2.0;
             Boost_108300; UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1
             [INFO] [X300] X300 initialization sequence...
             [INFO] [X300] Maximum frame size: 8000 bytes.
             [INFO] [X300] Radio 1x clock: 200 MHz
             Sat Apr 26 03:33:48 2025 [00] [+] Created USRP with
             args
             Sat Apr 26 03:33:48 2025 [00] [+] Master clock is
             at 200 Mhz
             Sat Apr 26 03:33:48 2025 [00] [+] Tuner[0] gain set
             to 30 (30) dB
             Sat Apr 26 03:33:48 2025 [00] [*]
             scanner.l:1446:main Incorrect maxsamples (1996).
             Expected 19960.
             Sat Apr 26 03:33:48 2025 [00] [+] Max
             samples/buffer[0]: 1996
             [WARNING] [0/Radio#0] Ignoring stream command for
             finite acquisition of zero samples
             I hope this reads OK. Maybe next time I should
             attach the code:)
                 TIA
                 Nikos

                 _______________________________________________
                 USRP-users mailing list --usrp-users@lists.ettus.com
                 To unsubscribe send an email tousrp-users-leave@lists.ettus.com
             I believe that max number of samples-per-buffer is
             limited by MTU size.   Which is typically around
             8000 or so for "jumbo frames".
On 27/04/2025 19:34, Nikos Balkanas wrote: > For that i will need the sources. > Do you know where can I download the UHD 4.6.0 sources? > > TIA > Nikos If you have an installed version of UHD on your system, then the examples should also have been installed.  How did you install   UHD? You might need to install "uhd-host" if you installed from packaged binaries, but all the examples and utilities should be   there along with the libraries. But the GIT repo for the UHD source is here: https://github.com/EttusResearch/uhd These days, most distros package UHD, so in many cases you don't need to build from source. > > > On Mon, Apr 28, 2025 at 12:39 AM Marcus D. Leech > <patchvonbraun@gmail.com> wrote: > > On 27/04/2025 17:37, Nikos Balkanas wrote: >> Hi Marcus, >> >> You were right. No need to change NIC:) >> This is not a software issue. uhd_rx_streamer_max_num_samps runs >> right after uhd initialization before >> any other code had the chance to run. >> Link capacity doesn't seem to be the issue either... >> Running pchar on the link, descendant of pathchar, reports a >> throughput of 5.619 Kb/s requesting ICMP replies, >> to varying packet sizes (32->9000 (MTU), incr by 32). >> sudo pchar -m 9000 -p ipv4icmp usrp >> https://www.kitchenlab.org/www/bmah/Software/pchar/ >> >> It corresponds to 351.218.019 16-bit samples or 175,609.044 >> 32-bit samples, if each sample is 32-bit(real + imag) >> Seems that uhd is not running at link capacity but is doing smt else. >> I will have  to download and check with the sources... >> The package version for Ubuntu 24.04 is uhd 4.6.0. >> Where can I download the sources for uhd 4.6.0? >> >> BR >> Nikos > YOu CANNOT use ICMP tests to determine link capacity with a USRP > -- ICMP is processed via  completely different >   "stack" in the radio. > > Use "benchmark_rate" instead. > > >> >> On Sat, Apr 26, 2025 at 7:02 AM Nikos Balkanas >> <nbalkanas@gmail.com> wrote: >> >> Thanks for your time. >> I will check out the example. >> This is not a buffer problem. I just need 1024 Samples >> (real+imaginary) for FFT... >> I should be able to get them in a single pass. >> You saw my code, not a smoking gun there. >> >> This is probably is a physical problem. >> Cable is an SFP fiber dedicated line. Cannot go bad. >> Maybe the connections are not sitting right :(... >> >> BR >> Nikos >> >> On Sat, Apr 26, 2025 at 6:45 AM Marcus D. Leech >> <patchvonbraun@gmail.com> wrote: >> >> On 25/04/2025 23:33, Nikos Balkanas wrote: >>> Actually MTU is 9000. This is one of the recommendations... >>> I tried it with MTU 1500. It was worse:( >>> maxsamples dropped to 364... >> Right, 9000, rather than 8000. >> >> Upgrading to 10Gbit wont' give you larger MTU. >> >> What you're trying to do, I think, is to solve a >> buffer-management problem in your *application* at >> entirely the wrong >>   level in the stack. >> >> It is EXCEEDINGLY COMMON for hardware drivers to only be >> able to deliver in chunks that may not be perfectly >> adapted to >>   the requirements of your application.  So, a common >> programming pattern is to deal with this in your application. >> >> You should probably look at example code like >> rx_samples_to_file >> >> >>> >>> [INFO] [UHD] linux; GNU C++ version 13.2.0; >>> Boost_108300; UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1 >>> [INFO] [X300] X300 initialization sequence... >>> [INFO] [X300] Maximum frame size: 1472 bytes. >>> [WARNING] [X300] For the 192.168.40.2 connection, UHD >>> recommends a send frame size of at least 8000 for best >>> performance, but your configuration will only allow >>> 1472.This may negatively impact your maximum achievable >>> sample rate. >>> Check the MTU on the interface and/or the >>> send_frame_size argument. >>> [WARNING] [X300] For the 192.168.40.2 connection, UHD >>> recommends a receive frame size of at least 8000 for best >>> performance, but your configuration will only allow >>> 1472.This may negatively impact your maximum achievable >>> sample rate. >>> Check the MTU on the interface and/or the >>> recv_frame_size argument. >>> [INFO] [GPS] No GPSDO found >>> [INFO] [X300] Radio 1x clock: 200 MHz >>> [WARNING] [UDP] The send buffer could not be resized >>> sufficiently. >>> Target sock buff size: 24912805 bytes. >>> Actual sock buff size: 1048576 bytes. >>> See the transport application notes on buffer resizing. >>> Please run: sudo sysctl -w net.core.wmem_max=24912805 >>> Sat Apr 26 06:30:34 2025 [00] [+] Created USRP with args >>> Sat Apr 26 06:30:34 2025 [00] [+] Master clock is at 200 Mhz >>> Sat Apr 26 06:30:34 2025 [00] [+] Tuner[0] gain set to >>> 30 (30) dB >>> [WARNING] [UDP] The send buffer could not be resized >>> sufficiently. >>> Target sock buff size: 24912805 bytes. >>> Actual sock buff size: 1048576 bytes. >>> See the transport application notes on buffer resizing. >>> Please run: sudo sysctl -w net.core.wmem_max=24912805 >>> Sat Apr 26 06:30:34 2025 [00] [*] scanner.l:1446:main >>> Incorrect maxsamples (364). Expected 19960. >>> Sat Apr 26 06:30:34 2025 [00] [+] Max samples/buffer[0]: 364 >>> [WARNING] [0/Radio#0] Ignoring stream command for finite >>> acquisition of zero sam >>> >>> Nikos >>> >>> On Sat, Apr 26, 2025 at 5:46 AM Marcus D. Leech >>> <patchvonbraun@gmail.com> wrote: >>> >>> On 25/04/2025 22:26, Nikos Balkanas wrote: >>>> Thanks Marcus, >>>> >>>> for your fast reply. >>>> >>>> On Sat, Apr 26, 2025 at 4:08 AM Marcus D. Leech >>>> <patchvonbraun@gmail.com> wrote: >>>> >>>> On 25/04/2025 20:50, Nikos Balkanas wrote: >>>>> Hello, >>>>> >>>>> I need to buy a new NIC. What would you suggest? >>>>> The one I use is an old Mellanox 10 Gbs, >>>>> before the Connect-4 series. >>>>> It can only do 1996 S/s, need 19960 (10x more) >>>>> to work with latest uhd. >>>>> Using Ubuntu 24.04 and uhd 4.6.0 >>>> So, 1.996ksps vs 19.960ksps? You hardly need a >>>> 10Gbit link to support that.  So, perhaps something >>>>   is being lost here in your requirements? >>>> >>>> >>>> True. Can't explain it in terms of bandwidth. 16 * >>>> 1996 = 31.936 Kbps, 16 * 19960 = 319.360 Kbps well >>>> short of a 10 Gbps line:( >>>> Does a complex pair count as 1 sample, or 2? >>>> I have followed all the instructions in >>>> https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks, >>>> Even installed the DPDK drivers. My Mellanox is too >>>> old to use their OFED drivers:( >>>> >>>>> >>>>> On a related question. it seems that the >>>>> streamer doesn't crash anymore >>>>> when receiving less than MAXSPS samples, >>>>> instead it reads 0:( >>>>> This was due to the sse2 code not aligned in >>>>> convert. >>>>> I change my stream args to cpu_format=sc16, >>>>> otw=sc16, so no conversion required. >>>>> Streamer still doesn't read anything. Is there >>>>> a reason for it? >>>>> >>>> You'd need to share more of your code.  This >>>> should just work as far as I can tell. >>>> >>>> Thanks. these are just the usrp code: >>>> >>>> int main() >>>> { >>>> uhd_stream_args_t stream_args = >>>>                            { >>>> .cpu_format = "sc16", >>>> .otw_format = "sc16", >>>> .args = "", >>>> .n_channels = 1, >>>>  .channel_list = &channel >>>>                              }; >>>> ..uhd_stream_cmd_t stream_cmd = >>>>                              { >>>>  .stream_mode = UHD_STREAM_MODE_NUM_SAMPS_AND_DONE, >>>> .stream_now = true >>>>                               }; >>>> >>>> if (uhd_init(0, 0, gain)) do_exit(20); >>>> if ((err = uhd_usrp_get_rx_stream(dev[0], >>>> &stream_args, rx_streamer[0]))) >>>> { >>>> uhd_get_last_error(errmsg, 127); >>>> error(log, "Failed to get streamer[0] (%d). >>>> %s.\n", 0, FL, LN, FN, err, errmsg); >>>> uhd_rx_streamer_free(&rx_streamer[0]); >>>> rx_streamer[0] = NULL; >>>> uhd_rx_metadata_free(&md[0]); >>>> md[0] = NULL; >>>> do_exit(30); >>>> } >>>> if ((err = >>>> uhd_rx_streamer_max_num_samps(rx_streamer[0], >>>> &maxsamps))) >>>> >>>> { >>>> uhd_get_last_error(errmsg, 127); >>>> error(log, "Failed to get max samples/buffer[0] >>>> (%d). %s.\n", 0, FL, LN, FN, err, >>>> ..errmsg); >>>> do_exit(35); >>>> } >>>> if (maxsamps != MAXSMPS) >>>> warn(log, "Incorrect maxsamples (%ld). Expected >>>> %d.\n", 0, FL, LN, FN, maxsamps, >>>> MAXSMPS); >>>> info(log, "Max samples/buffer[0]: %ld\n", 0, >>>> maxsamps); >>>> >>>> if ((err = >>>> uhd_rx_streamer_issue_stream_cmd(rx_streamer[0], >>>> &stream_cmd))) >>>> >>>> { >>>> uhd_get_last_error(errmsg, 127); >>>> error(log, "Failed to start streamer[0] (%d). >>>> %s.\n", 0, FL, LN, FN, err, errmsg); >>>> do_exit(40); >>>> } >>>> >>>>    [...] >>>>  do_exit(0) >>>>      } >>>> >>>> bool uhd_init(size_t channel, double srate, >>>> double gain) >>>> { >>>> double tmp; >>>> uhd_rx_metadata_error_code_t err; >>>> >>>> if ((err = >>>> uhd_set_thread_priority(uhd_default_thread_priority, >>>> true))) >>>> warn(log, "Unable to set  main thread priority >>>> (%d). %s.\n", 0, FL, LN, FN, >>>> err, uhdError(err)); >>>> /* Create USRP */ >>>> f ((err = uhd_usrp_make(&dev[channel], >>>> "type=x300"))) >>>> { >>>> error(log, "Failed to create USRP (%d). %s.\n", >>>> 0, FL, LN, FN, err, >>>> uhdError(err)); >>>> dev[channel] = NULL; >>>>         return(FAIL); >>>> >>>> } >>>> info(stderr, "Created USRP with args\n", 0); >>>> >>>> /* Create RX streamer */ >>>> if ((err = >>>> uhd_rx_streamer_make(&rx_streamer[channel]))) >>>> { >>>> error(log, "Failed to create rx_streamer[%d] >>>> (%d). %s.\n", 0, FL, LN, FN, >>>> channel, err, uhdError(err)); >>>> return(FAIL); >>>> } >>>> /* Create RX metadata */ >>>> if ((err = uhd_rx_metadata_make(&md[channel]))) >>>> { >>>> error(log, "Failed to create md[%d] (%d). >>>> %s.\n", 0, FL, LN, FN, channel, >>>> err, uhdError(err)); >>>> return(FAIL); >>>> } >>>> >>>> /* Get master clock rate */ >>>> if ((err = >>>> uhd_usrp_get_master_clock_rate(dev[channel], 0, >>>> &tmp))) >>>> >>>> { >>>> error(log, "Failed to set master clock to %.0lf >>>> Mhz (%d). %s.\n", 0, FL, >>>> LN, FN, tmp/1000000, err, uhdError(err)); >>>> return(FAIL); >>>> } >>>> info(stderr, "Master clock is at %.0lf Mhz\n", >>>> 0, tmp/1000000); >>>> /* Set the sample rate */ >>>> if (srate && !uhd_set_rx_rate_check(channel, >>>> srate)) return(FAIL); >>>> /* Set the tuner gain SBX-120 is 0-31.5 in .5 >>>> db steps */ >>>> >>>>    if ((err = >>>> uhd_usrp_set_rx_gain(dev[channel], gain, >>>> channel, ""))) >>>> { >>>> error(log, "Failed to set tuner[%d] gain to >>>> %.0lf db (%d). %s.\n", 0, FL, >>>> LN, FN, channel, gain, err, uhdError(err)); >>>> return(FAIL); >>>> } >>>>      if (!(err = >>>> uhd_usrp_get_rx_gain(dev[channel], channel, "", >>>> &tmp))) >>>> info(log, "Tuner[%d] gain set to %.0lf (%.0lf) >>>> dB\n", 0, channel, tmp,gain); >>>> >>>> ./* Set channel bw to conserve tuner resources. Not >>>> needed, set by srate */ >>>> uhd_usrp_set_rx_bandwidth(dev[channel], srate, >>>> channel); >>>> ./* Disable subtracting constant averaged >>>> background. Signal looks cleaner */ >>>> if ((err = >>>> uhd_usrp_set_rx_dc_offset_enabled(dev[channel], >>>> false, channel))) >>>> { >>>> warn(log, "Failed to disable FPGA DC offset on >>>> channel %d(%d). %s.\n", 0, >>>> FL, LN, FN, channel, err, uhdError(err)); >>>> } >>>> info(stderr, "Disabled FPGA DC offset on channel >>>> %d\n", 0, channel); >>>> return(SUCCESS); >>>>    } >>>> >>>> This is the generated output: >>>> >>>> [INFO] [UHD] linux; GNU C++ version 13.2.0; >>>> Boost_108300; UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1 >>>> [INFO] [X300] X300 initialization sequence... >>>> [INFO] [X300] Maximum frame size: 8000 bytes. >>>> [INFO] [X300] Radio 1x clock: 200 MHz >>>> Sat Apr 26 03:33:48 2025 [00] [+] Created USRP with >>>> args >>>> Sat Apr 26 03:33:48 2025 [00] [+] Master clock is >>>> at 200 Mhz >>>> Sat Apr 26 03:33:48 2025 [00] [+] Tuner[0] gain set >>>> to 30 (30) dB >>>> Sat Apr 26 03:33:48 2025 [00] [*] >>>> scanner.l:1446:main Incorrect maxsamples (1996). >>>> Expected 19960. >>>> Sat Apr 26 03:33:48 2025 [00] [+] Max >>>> samples/buffer[0]: 1996 >>>> [WARNING] [0/Radio#0] Ignoring stream command for >>>> finite acquisition of zero samples >>>> I hope this reads OK. Maybe next time I should >>>> attach the code:) >>>> >>>>> TIA >>>>> Nikos >>>>> >>>>> _______________________________________________ >>>>> USRP-users mailing list --usrp-users@lists.ettus.com >>>>> To unsubscribe send an email tousrp-users-leave@lists.ettus.com >>>> >>> I believe that max number of samples-per-buffer is >>> limited by MTU size.   Which is typically around >>> 8000 or so for "jumbo frames". >>> >>> >> >
NB
Nikos Balkanas
Mon, Apr 28, 2025 12:40 AM

Ubuntu packages...
No -dev, => no includes:(
The ICMP test is fine for testing physical wear (line, connectors OSI layer
2)
Ofc a dedicated usrp benchmark is better for application (layer 4)
benchmark:)

PS. If this conversation is getting long, we can switch to private mail...

On Mon, Apr 28, 2025 at 2:45 AM Marcus D. Leech patchvonbraun@gmail.com
wrote:

On 27/04/2025 19:34, Nikos Balkanas wrote:

For that i will need the sources.
Do you know where can I download the UHD 4.6.0 sources?

TIA
Nikos

If you have an installed version of UHD on your system, then the examples
should also have been installed.  How did you install
UHD?

You might need to install "uhd-host" if you installed from packaged
binaries, but all the examples and utilities should be
there along with the libraries.

But the GIT repo for the UHD source is here:

https://github.com/EttusResearch/uhd

These days, most distros package UHD, so in many cases you don't need to
build from source.

On Mon, Apr 28, 2025 at 12:39 AM Marcus D. Leech patchvonbraun@gmail.com
wrote:

On 27/04/2025 17:37, Nikos Balkanas wrote:

Hi Marcus,

You were right. No need to change NIC:)
This is not a software issue. uhd_rx_streamer_max_num_samps runs right
after uhd initialization before
any other code had the chance to run.
Link capacity doesn't seem to be the issue either...
Running pchar on the link, descendant of pathchar, reports a throughput
of 5.619 Kb/s requesting ICMP replies,
to varying packet sizes (32->9000 (MTU), incr by 32).
sudo pchar -m 9000 -p ipv4icmp usrp
https://www.kitchenlab.org/www/bmah/Software/pchar/

It corresponds to 351.218.019 16-bit samples or 175,609.044 32-bit
samples, if each sample is 32-bit(real + imag)
Seems that uhd is not running at link capacity but is doing smt else.
I will have  to download and check with the sources...
The package version for Ubuntu 24.04 is uhd 4.6.0.
Where can I download the sources for uhd 4.6.0?

BR
Nikos

YOu CANNOT use ICMP tests to determine link capacity with a USRP -- ICMP
is processed via  completely different
"stack" in the radio.

Use "benchmark_rate" instead.

On Sat, Apr 26, 2025 at 7:02 AM Nikos Balkanas nbalkanas@gmail.com
wrote:

Thanks for your time.
I will check out the example.
This is not a buffer problem. I just need 1024 Samples (real+imaginary)
for FFT...
I should be able to get them in a single pass.
You saw my code, not a smoking gun there.

This is probably is a physical problem.
Cable is an SFP fiber dedicated line. Cannot go bad.
Maybe the connections are not sitting right :(...

BR
Nikos

On Sat, Apr 26, 2025 at 6:45 AM Marcus D. Leech patchvonbraun@gmail.com
wrote:

On 25/04/2025 23:33, Nikos Balkanas wrote:

Actually MTU is 9000. This is one of the recommendations...
I tried it with MTU 1500. It was worse:(
maxsamples dropped to 364...

Right, 9000, rather than 8000.

Upgrading to 10Gbit wont' give you larger MTU.

What you're trying to do, I think, is to solve a buffer-management
problem in your application at entirely the wrong
level in the stack.

It is EXCEEDINGLY COMMON for hardware drivers to only be able to
deliver in chunks that may not be perfectly adapted to
the requirements of your application.  So, a common programming
pattern is to deal with this in your application.

You should probably look at example code like rx_samples_to_file

[INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300;
UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1
[INFO] [X300] X300 initialization sequence...
[INFO] [X300] Maximum frame size: 1472 bytes.
[WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a send
frame size of at least 8000 for best
performance, but your configuration will only allow 1472.This may
negatively impact your maximum achievable sample rate.
Check the MTU on the interface and/or the send_frame_size argument.
[WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a
receive frame size of at least 8000 for best
performance, but your configuration will only allow 1472.This may
negatively impact your maximum achievable sample rate.
Check the MTU on the interface and/or the recv_frame_size argument.
[INFO] [GPS] No GPSDO found
[INFO] [X300] Radio 1x clock: 200 MHz
[WARNING] [UDP] The send buffer could not be resized sufficiently.
Target sock buff size: 24912805 bytes.
Actual sock buff size: 1048576 bytes.
See the transport application notes on buffer resizing.
Please run: sudo sysctl -w net.core.wmem_max=24912805
Sat Apr 26 06:30:34 2025 [00] [+] Created USRP with args
Sat Apr 26 06:30:34 2025 [00] [+] Master clock is at 200 Mhz
Sat Apr 26 06:30:34 2025 [00] [+] Tuner[0] gain set to 30 (30) dB
[WARNING] [UDP] The send buffer could not be resized sufficiently.
Target sock buff size: 24912805 bytes.
Actual sock buff size: 1048576 bytes.
See the transport application notes on buffer resizing.
Please run: sudo sysctl -w net.core.wmem_max=24912805
Sat Apr 26 06:30:34 2025 [00] [*] scanner.l:1446:main Incorrect
maxsamples (364). Expected 19960.
Sat Apr 26 06:30:34 2025 [00] [+] Max samples/buffer[0]: 364
[WARNING] [0/Radio#0] Ignoring stream command for finite acquisition of
zero sam

Nikos

On Sat, Apr 26, 2025 at 5:46 AM Marcus D. Leech <
patchvonbraun@gmail.com> wrote:

On 25/04/2025 22:26, Nikos Balkanas wrote:

Thanks Marcus,

for your fast reply.

On Sat, Apr 26, 2025 at 4:08 AM Marcus D. Leech <
patchvonbraun@gmail.com> wrote:

On 25/04/2025 20:50, Nikos Balkanas wrote:

Hello,

I need to buy a new NIC. What would you suggest?
The one I use is an old Mellanox 10 Gbs, before the Connect-4 series.
It can only do 1996 S/s, need 19960 (10x more) to work with latest
uhd.
Using Ubuntu 24.04 and uhd 4.6.0

So, 1.996ksps vs 19.960ksps?  You hardly need a 10Gbit link to
support that.  So, perhaps something
is being lost here in your requirements?

True. Can't explain it in terms of bandwidth. 16 * 1996 = 31.936 Kbps,
16 * 19960 = 319.360 Kbps well short of a 10 Gbps line:(
Does a complex pair count as 1 sample, or 2?
I have followed all the instructions in
https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks,
Even installed the DPDK drivers. My Mellanox is too old to use their
OFED drivers:(

On a related question. it seems that the streamer doesn't crash
anymore
when receiving less than MAXSPS samples, instead it reads 0:(
This was due to the sse2 code not aligned in convert.
I change my stream args to cpu_format=sc16, otw=sc16, so no
conversion required.
Streamer still doesn't read anything. Is there a reason for it?

You'd need to share more of your code.  This should just work as far
as I can tell.

Thanks. these are just the usrp code:

int main()
{
uhd_stream_args_t stream_args =
{

.cpu_format = "sc16",

.otw_format = "sc16",
.args =
"",

.n_channels = 1,

.channel_list = &channel
};
..uhd_stream_cmd_t stream_cmd =
{

.stream_mode = UHD_STREAM_MODE_NUM_SAMPS_AND_DONE,

.stream_now = true
};

 if (uhd_init(0, 0, gain)) do_exit(20);
 if ((err = uhd_usrp_get_rx_stream(dev[0], &stream_args,

rx_streamer[0])))
{
uhd_get_last_error(errmsg, 127);
error(log, "Failed to get streamer[0] (%d). %s.\n", 0, FL,
LN, FN, err, errmsg);
uhd_rx_streamer_free(&rx_streamer[0]);
rx_streamer[0] = NULL;
uhd_rx_metadata_free(&md[0]);
md[0] = NULL;
do_exit(30);
}
if ((err = uhd_rx_streamer_max_num_samps(rx_streamer[0],
&maxsamps)))

  {
      uhd_get_last_error(errmsg, 127);
      error(log, "Failed to get max samples/buffer[0] (%d).

%s.\n", 0, FL, LN, FN, err,
..errmsg);
do_exit(35);
}
if (maxsamps != MAXSMPS)
warn(log, "Incorrect maxsamples (%ld). Expected %d.\n", 0,
FL, LN, FN, maxsamps,
MAXSMPS);
info(log, "Max samples/buffer[0]: %ld\n", 0, maxsamps);

 if ((err = uhd_rx_streamer_issue_stream_cmd(rx_streamer[0],

&stream_cmd)))

 {
     uhd_get_last_error(errmsg, 127);
     error(log, "Failed to start streamer[0] (%d). %s.\n", 0, FL,

LN, FN, err, errmsg);
do_exit(40);
}

      [...]
      do_exit(0)
  }

bool uhd_init(size_t channel, double srate, double gain)
{
double tmp;
uhd_rx_metadata_error_code_t err;

  if ((err = uhd_set_thread_priority(uhd_default_thread_priority,

true)))
warn(log, "Unable to set  main thread priority (%d).
%s.\n", 0, FL, LN, FN,
err, uhdError(err));
/* Create USRP */
f ((err = uhd_usrp_make(&dev[channel], "type=x300")))
{
error(log, "Failed to create USRP (%d). %s.\n", 0, FL, LN,
FN, err,
uhdError(err));
dev[channel] = NULL;
return(FAIL);

      }
      info(stderr, "Created USRP with args\n", 0);

 /* Create RX streamer */
 if ((err = uhd_rx_streamer_make(&rx_streamer[channel])))
 {
     error(log, "Failed to create rx_streamer[%d] (%d). %s.\n",

0, FL, LN, FN,
channel, err, uhdError(err));
return(FAIL);
}
/* Create RX metadata */
if ((err = uhd_rx_metadata_make(&md[channel])))
{
error(log, "Failed to create md[%d] (%d). %s.\n", 0, FL, LN,
FN, channel,
err, uhdError(err));
return(FAIL);
}

 /* Get master clock rate */
  if ((err = uhd_usrp_get_master_clock_rate(dev[channel], 0,

&tmp)))

   {
        error(log, "Failed to set master clock to %.0lf Mhz (%d).

%s.\n", 0, FL,
LN, FN, tmp/1000000, err, uhdError(err));
return(FAIL);
}
info(stderr, "Master clock is at %.0lf Mhz\n", 0, tmp/1000000);
/* Set the sample rate /
if (srate && !uhd_set_rx_rate_check(channel, srate))
return(FAIL);
/
Set the tuner gain SBX-120 is 0-31.5 in .5 db steps */

    if ((err = uhd_usrp_set_rx_gain(dev[channel], gain, channel,

"")))
{
error(log, "Failed to set tuner[%d] gain to %.0lf db
(%d). %s.\n", 0, FL,
LN, FN, channel, gain, err, uhdError(err));
return(FAIL);
}
if (!(err = uhd_usrp_get_rx_gain(dev[channel], channel, "",
&tmp)))
info(log, "Tuner[%d] gain set to %.0lf (%.0lf) dB\n",
0, channel, tmp, gain);

     ./* Set channel bw to conserve tuner resources. Not needed,

set by srate /
uhd_usrp_set_rx_bandwidth(dev[channel], srate, channel);
./
Disable subtracting constant averaged background. Signal
looks cleaner */
if ((err =
uhd_usrp_set_rx_dc_offset_enabled(dev[channel], false, channel)))
{
warn(log, "Failed to disable FPGA DC offset on
channel %d(%d). %s.\n", 0,
FL, LN, FN, channel, err, uhdError(err));
}
info(stderr, "Disabled FPGA DC offset on channel
%d\n", 0, channel);
return(SUCCESS);
}

This is the generated output:

[INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300;
UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1
[INFO] [X300] X300 initialization sequence...
[INFO] [X300] Maximum frame size: 8000 bytes.
[INFO] [X300] Radio 1x clock: 200 MHz
Sat Apr 26 03:33:48 2025 [00] [+] Created USRP with args
Sat Apr 26 03:33:48 2025 [00] [+] Master clock is at 200 Mhz
Sat Apr 26 03:33:48 2025 [00] [+] Tuner[0] gain set to 30 (30) dB
Sat Apr 26 03:33:48 2025 [00] [*] scanner.l:1446:main Incorrect
maxsamples (1996). Expected 19960.
Sat Apr 26 03:33:48 2025 [00] [+] Max samples/buffer[0]: 1996
[WARNING] [0/Radio#0] Ignoring stream command for finite acquisition
of zero samples
I hope this reads OK. Maybe next time I should attach the code:)

TIA
Nikos


USRP-users mailing list -- usrp-users@lists.ettus.com
To unsubscribe send an email to usrp-users-leave@lists.ettus.com

I believe that max number of samples-per-buffer is limited by MTU

size.  Which is typically around 8000 or so for "jumbo frames".

Ubuntu packages... No -dev, => no includes:( The ICMP test is fine for testing physical wear (line, connectors OSI layer 2) Ofc a dedicated usrp benchmark is better for application (layer 4) benchmark:) PS. If this conversation is getting long, we can switch to private mail... On Mon, Apr 28, 2025 at 2:45 AM Marcus D. Leech <patchvonbraun@gmail.com> wrote: > On 27/04/2025 19:34, Nikos Balkanas wrote: > > For that i will need the sources. > Do you know where can I download the UHD 4.6.0 sources? > > TIA > Nikos > > If you have an installed version of UHD on your system, then the examples > should also have been installed. How did you install > UHD? > > You might need to install "uhd-host" if you installed from packaged > binaries, but all the examples and utilities should be > there along with the libraries. > > But the GIT repo for the UHD source is here: > > https://github.com/EttusResearch/uhd > > These days, most distros package UHD, so in many cases you don't need to > build from source. > > > > > On Mon, Apr 28, 2025 at 12:39 AM Marcus D. Leech <patchvonbraun@gmail.com> > wrote: > >> On 27/04/2025 17:37, Nikos Balkanas wrote: >> >> Hi Marcus, >> >> You were right. No need to change NIC:) >> This is not a software issue. uhd_rx_streamer_max_num_samps runs right >> after uhd initialization before >> any other code had the chance to run. >> Link capacity doesn't seem to be the issue either... >> Running pchar on the link, descendant of pathchar, reports a throughput >> of 5.619 Kb/s requesting ICMP replies, >> to varying packet sizes (32->9000 (MTU), incr by 32). >> sudo pchar -m 9000 -p ipv4icmp usrp >> https://www.kitchenlab.org/www/bmah/Software/pchar/ >> >> It corresponds to 351.218.019 16-bit samples or 175,609.044 32-bit >> samples, if each sample is 32-bit(real + imag) >> Seems that uhd is not running at link capacity but is doing smt else. >> I will have to download and check with the sources... >> The package version for Ubuntu 24.04 is uhd 4.6.0. >> Where can I download the sources for uhd 4.6.0? >> >> BR >> Nikos >> >> YOu CANNOT use ICMP tests to determine link capacity with a USRP -- ICMP >> is processed via completely different >> "stack" in the radio. >> >> Use "benchmark_rate" instead. >> >> >> >> On Sat, Apr 26, 2025 at 7:02 AM Nikos Balkanas <nbalkanas@gmail.com> >> wrote: >> >>> Thanks for your time. >>> I will check out the example. >>> This is not a buffer problem. I just need 1024 Samples (real+imaginary) >>> for FFT... >>> I should be able to get them in a single pass. >>> You saw my code, not a smoking gun there. >>> >>> This is probably is a physical problem. >>> Cable is an SFP fiber dedicated line. Cannot go bad. >>> Maybe the connections are not sitting right :(... >>> >>> BR >>> Nikos >>> >>> On Sat, Apr 26, 2025 at 6:45 AM Marcus D. Leech <patchvonbraun@gmail.com> >>> wrote: >>> >>>> On 25/04/2025 23:33, Nikos Balkanas wrote: >>>> >>>> Actually MTU is 9000. This is one of the recommendations... >>>> I tried it with MTU 1500. It was worse:( >>>> maxsamples dropped to 364... >>>> >>>> Right, 9000, rather than 8000. >>>> >>>> Upgrading to 10Gbit wont' give you larger MTU. >>>> >>>> What you're trying to do, I think, is to solve a buffer-management >>>> problem in your *application* at entirely the wrong >>>> level in the stack. >>>> >>>> It is EXCEEDINGLY COMMON for hardware drivers to only be able to >>>> deliver in chunks that may not be perfectly adapted to >>>> the requirements of your application. So, a common programming >>>> pattern is to deal with this in your application. >>>> >>>> You should probably look at example code like rx_samples_to_file >>>> >>>> >>>> >>>> [INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300; >>>> UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1 >>>> [INFO] [X300] X300 initialization sequence... >>>> [INFO] [X300] Maximum frame size: 1472 bytes. >>>> [WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a send >>>> frame size of at least 8000 for best >>>> performance, but your configuration will only allow 1472.This may >>>> negatively impact your maximum achievable sample rate. >>>> Check the MTU on the interface and/or the send_frame_size argument. >>>> [WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a >>>> receive frame size of at least 8000 for best >>>> performance, but your configuration will only allow 1472.This may >>>> negatively impact your maximum achievable sample rate. >>>> Check the MTU on the interface and/or the recv_frame_size argument. >>>> [INFO] [GPS] No GPSDO found >>>> [INFO] [X300] Radio 1x clock: 200 MHz >>>> [WARNING] [UDP] The send buffer could not be resized sufficiently. >>>> Target sock buff size: 24912805 bytes. >>>> Actual sock buff size: 1048576 bytes. >>>> See the transport application notes on buffer resizing. >>>> Please run: sudo sysctl -w net.core.wmem_max=24912805 >>>> Sat Apr 26 06:30:34 2025 [00] [+] Created USRP with args >>>> Sat Apr 26 06:30:34 2025 [00] [+] Master clock is at 200 Mhz >>>> Sat Apr 26 06:30:34 2025 [00] [+] Tuner[0] gain set to 30 (30) dB >>>> [WARNING] [UDP] The send buffer could not be resized sufficiently. >>>> Target sock buff size: 24912805 bytes. >>>> Actual sock buff size: 1048576 bytes. >>>> See the transport application notes on buffer resizing. >>>> Please run: sudo sysctl -w net.core.wmem_max=24912805 >>>> Sat Apr 26 06:30:34 2025 [00] [*] scanner.l:1446:main Incorrect >>>> maxsamples (364). Expected 19960. >>>> Sat Apr 26 06:30:34 2025 [00] [+] Max samples/buffer[0]: 364 >>>> [WARNING] [0/Radio#0] Ignoring stream command for finite acquisition of >>>> zero sam >>>> >>>> Nikos >>>> >>>> On Sat, Apr 26, 2025 at 5:46 AM Marcus D. Leech < >>>> patchvonbraun@gmail.com> wrote: >>>> >>>>> On 25/04/2025 22:26, Nikos Balkanas wrote: >>>>> >>>>> Thanks Marcus, >>>>> >>>>> for your fast reply. >>>>> >>>>> On Sat, Apr 26, 2025 at 4:08 AM Marcus D. Leech < >>>>> patchvonbraun@gmail.com> wrote: >>>>> >>>>>> On 25/04/2025 20:50, Nikos Balkanas wrote: >>>>>> >>>>>> Hello, >>>>>> >>>>>> I need to buy a new NIC. What would you suggest? >>>>>> The one I use is an old Mellanox 10 Gbs, before the Connect-4 series. >>>>>> It can only do 1996 S/s, need 19960 (10x more) to work with latest >>>>>> uhd. >>>>>> Using Ubuntu 24.04 and uhd 4.6.0 >>>>>> >>>>>> So, 1.996ksps vs 19.960ksps? You hardly need a 10Gbit link to >>>>>> support that. So, perhaps something >>>>>> is being lost here in your requirements? >>>>>> >>>>> >>>>> True. Can't explain it in terms of bandwidth. 16 * 1996 = 31.936 Kbps, >>>>> 16 * 19960 = 319.360 Kbps well short of a 10 Gbps line:( >>>>> Does a complex pair count as 1 sample, or 2? >>>>> I have followed all the instructions in >>>>> https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks, >>>>> Even installed the DPDK drivers. My Mellanox is too old to use their >>>>> OFED drivers:( >>>>> >>>>>> >>>>>> On a related question. it seems that the streamer doesn't crash >>>>>> anymore >>>>>> when receiving less than MAXSPS samples, instead it reads 0:( >>>>>> This was due to the sse2 code not aligned in convert. >>>>>> I change my stream args to cpu_format=sc16, otw=sc16, so no >>>>>> conversion required. >>>>>> Streamer still doesn't read anything. Is there a reason for it? >>>>>> >>>>>> You'd need to share more of your code. This should just work as far >>>>>> as I can tell. >>>>>> >>>>>> Thanks. these are just the usrp code: >>>>> >>>>> int main() >>>>> { >>>>> uhd_stream_args_t stream_args = >>>>> { >>>>> >>>>> .cpu_format = "sc16", >>>>> >>>>> .otw_format = "sc16", >>>>> .args = >>>>> "", >>>>> >>>>> .n_channels = 1, >>>>> >>>>> .channel_list = &channel >>>>> }; >>>>> ..uhd_stream_cmd_t stream_cmd = >>>>> { >>>>> >>>>> .stream_mode = UHD_STREAM_MODE_NUM_SAMPS_AND_DONE, >>>>> >>>>> .stream_now = true >>>>> }; >>>>> >>>>> if (uhd_init(0, 0, gain)) do_exit(20); >>>>>> if ((err = uhd_usrp_get_rx_stream(dev[0], &stream_args, >>>>>> rx_streamer[0]))) >>>>>> { >>>>>> uhd_get_last_error(errmsg, 127); >>>>>> error(log, "Failed to get streamer[0] (%d). %s.\n", 0, FL, >>>>>> LN, FN, err, errmsg); >>>>>> uhd_rx_streamer_free(&rx_streamer[0]); >>>>>> rx_streamer[0] = NULL; >>>>>> uhd_rx_metadata_free(&md[0]); >>>>>> md[0] = NULL; >>>>>> do_exit(30); >>>>>> } >>>>>> if ((err = uhd_rx_streamer_max_num_samps(rx_streamer[0], >>>>>> &maxsamps))) >>>>>> >>>>> { >>>>>> uhd_get_last_error(errmsg, 127); >>>>>> error(log, "Failed to get max samples/buffer[0] (%d). >>>>>> %s.\n", 0, FL, LN, FN, err, >>>>>> ..errmsg); >>>>>> do_exit(35); >>>>>> } >>>>>> if (maxsamps != MAXSMPS) >>>>>> warn(log, "Incorrect maxsamples (%ld). Expected %d.\n", 0, >>>>>> FL, LN, FN, maxsamps, >>>>>> MAXSMPS); >>>>>> info(log, "Max samples/buffer[0]: %ld\n", 0, maxsamps); >>>>>> >>>>>> if ((err = uhd_rx_streamer_issue_stream_cmd(rx_streamer[0], >>>>>> &stream_cmd))) >>>>>> >>>>> { >>>>>> uhd_get_last_error(errmsg, 127); >>>>>> error(log, "Failed to start streamer[0] (%d). %s.\n", 0, FL, >>>>>> LN, FN, err, errmsg); >>>>>> do_exit(40); >>>>>> } >>>>>> >>>>> [...] >>>>> do_exit(0) >>>>> } >>>>> >>>>> >>>>>> bool uhd_init(size_t channel, double srate, double gain) >>>>>> { >>>>>> double tmp; >>>>>> uhd_rx_metadata_error_code_t err; >>>>>> >>>>>> if ((err = uhd_set_thread_priority(uhd_default_thread_priority, >>>>>> true))) >>>>>> warn(log, "Unable to set main thread priority (%d). >>>>>> %s.\n", 0, FL, LN, FN, >>>>>> err, uhdError(err)); >>>>>> /* Create USRP */ >>>>>> f ((err = uhd_usrp_make(&dev[channel], "type=x300"))) >>>>>> { >>>>>> error(log, "Failed to create USRP (%d). %s.\n", 0, FL, LN, >>>>>> FN, err, >>>>>> uhdError(err)); >>>>>> dev[channel] = NULL; >>>>>> return(FAIL); >>>>>> >>>>> } >>>>>> info(stderr, "Created USRP with args\n", 0); >>>>>> >>>>>> /* Create RX streamer */ >>>>>> if ((err = uhd_rx_streamer_make(&rx_streamer[channel]))) >>>>>> { >>>>>> error(log, "Failed to create rx_streamer[%d] (%d). %s.\n", >>>>>> 0, FL, LN, FN, >>>>>> channel, err, uhdError(err)); >>>>>> return(FAIL); >>>>>> } >>>>>> /* Create RX metadata */ >>>>>> if ((err = uhd_rx_metadata_make(&md[channel]))) >>>>>> { >>>>>> error(log, "Failed to create md[%d] (%d). %s.\n", 0, FL, LN, >>>>>> FN, channel, >>>>>> err, uhdError(err)); >>>>>> return(FAIL); >>>>>> } >>>>>> >>>>>> /* Get master clock rate */ >>>>>> if ((err = uhd_usrp_get_master_clock_rate(dev[channel], 0, >>>>>> &tmp))) >>>>>> >>>>> { >>>>>> error(log, "Failed to set master clock to %.0lf Mhz (%d). >>>>>> %s.\n", 0, FL, >>>>>> LN, FN, tmp/1000000, err, uhdError(err)); >>>>>> return(FAIL); >>>>>> } >>>>>> info(stderr, "Master clock is at %.0lf Mhz\n", 0, tmp/1000000); >>>>>> /* Set the sample rate */ >>>>>> if (srate && !uhd_set_rx_rate_check(channel, srate)) >>>>>> return(FAIL); >>>>>> /* Set the tuner gain SBX-120 is 0-31.5 in .5 db steps */ >>>>>> >>>>> if ((err = uhd_usrp_set_rx_gain(dev[channel], gain, channel, >>>>>> ""))) >>>>>> { >>>>>> error(log, "Failed to set tuner[%d] gain to %.0lf db >>>>>> (%d). %s.\n", 0, FL, >>>>>> LN, FN, channel, gain, err, uhdError(err)); >>>>>> return(FAIL); >>>>>> } >>>>>> if (!(err = uhd_usrp_get_rx_gain(dev[channel], channel, "", >>>>>> &tmp))) >>>>>> info(log, "Tuner[%d] gain set to %.0lf (%.0lf) dB\n", >>>>>> 0, channel, tmp, gain); >>>>>> >>>>> ./* Set channel bw to conserve tuner resources. Not needed, >>>>> set by srate */ >>>>> uhd_usrp_set_rx_bandwidth(dev[channel], srate, channel); >>>>> ./* Disable subtracting constant averaged background. Signal >>>>> looks cleaner */ >>>>> if ((err = >>>>> uhd_usrp_set_rx_dc_offset_enabled(dev[channel], false, channel))) >>>>> { >>>>> warn(log, "Failed to disable FPGA DC offset on >>>>> channel %d(%d). %s.\n", 0, >>>>> FL, LN, FN, channel, err, uhdError(err)); >>>>> } >>>>> info(stderr, "Disabled FPGA DC offset on channel >>>>> %d\n", 0, channel); >>>>> return(SUCCESS); >>>>> } >>>>> >>>>> This is the generated output: >>>>> >>>>> [INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300; >>>>> UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1 >>>>> [INFO] [X300] X300 initialization sequence... >>>>> [INFO] [X300] Maximum frame size: 8000 bytes. >>>>> [INFO] [X300] Radio 1x clock: 200 MHz >>>>> Sat Apr 26 03:33:48 2025 [00] [+] Created USRP with args >>>>> Sat Apr 26 03:33:48 2025 [00] [+] Master clock is at 200 Mhz >>>>> Sat Apr 26 03:33:48 2025 [00] [+] Tuner[0] gain set to 30 (30) dB >>>>> Sat Apr 26 03:33:48 2025 [00] [*] scanner.l:1446:main Incorrect >>>>> maxsamples (1996). Expected 19960. >>>>> Sat Apr 26 03:33:48 2025 [00] [+] Max samples/buffer[0]: 1996 >>>>> [WARNING] [0/Radio#0] Ignoring stream command for finite acquisition >>>>> of zero samples >>>>> I hope this reads OK. Maybe next time I should attach the code:) >>>>> >>>>>> TIA >>>>>> Nikos >>>>>> >>>>>> _______________________________________________ >>>>>> USRP-users mailing list -- usrp-users@lists.ettus.com >>>>>> To unsubscribe send an email to usrp-users-leave@lists.ettus.com >>>>>> >>>>>> >>>>>> I believe that max number of samples-per-buffer is limited by MTU >>>>> size. Which is typically around 8000 or so for "jumbo frames". >>>>> >>>>> >>>>> >>>> >> >