1
0
This repository has been archived on 2024-07-22. You can view files and clone it, but cannot push or open issues or pull requests.
Files
2024-07-22 01:58:46 -03:00

142 lines
3.0 KiB
C

/******************************************************************************
*
* nstune.c
*
* User level utility to tune the NICStAR device driver.
*
* Author: Rui Prior
*
* (C) INESC 1998
*
******************************************************************************/
#include <sys/time.h>
#include <linux/atm_nicstar.h>
#include <linux/atm.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
static void usage(const char *name)
{
fprintf(stderr, "Set buffer level marks: \n");
fprintf(stderr, "%s itf {s|l|h|i} min init max \n", name);
fprintf(stderr, "Set buffer level to init mark: \n");
fprintf(stderr, "%s itf {s|l|h|i} \n", name);
fprintf(stderr, "\n");
exit(1);
}
int main(int argc, char **argv)
{
char *name, *end;
int itf, min, init, max;
int s;
pool_levels pl;
int btype;
struct atmif_sioc sioc;
name = argv[0];
if (argc != 6 && argc != 3)
usage(name);
itf = strtol(argv[1], &end, 0);
if (end == argv[1] || itf < 0)
usage(name);
if (argc == 6)
{
min = strtol(argv[3], &end, 0);
if (end == argv[3] || min <= 0)
usage(name);
init = strtol(argv[4], &end, 0);
if (end == argv[4] || init <= 0)
usage(name);
max = strtol(argv[5], &end, 0);
if (end == argv[5] || max <= 0)
usage(name);
if (min >= init || init >= max)
usage(name);
switch(*argv[2])
{
case 's':
pl.buftype = NS_BUFTYPE_SMALL;
break;
case 'l':
pl.buftype = NS_BUFTYPE_LARGE;
break;
case 'h':
pl.buftype = NS_BUFTYPE_HUGE;
break;
case 'i':
pl.buftype = NS_BUFTYPE_IOVEC;
break;
default:
usage(name);
}
sioc.number = itf;
sioc.arg = &pl;
sioc.length = sizeof(pl);
pl.level.min = min;
pl.level.init = init;
pl.level.max = max;
s = socket(PF_ATMPVC, SOCK_DGRAM, 0);
if (s < 0)
{
perror("socket");
return 2;
}
if (ioctl(s, NS_SETBUFLEV, &sioc) < 0)
{
perror("ioctl NS_SETBUFLEV");
return 3;
}
}
else /* argc == 2 */
{
switch(*argv[2])
{
case 's':
btype = NS_BUFTYPE_SMALL;
break;
case 'l':
btype = NS_BUFTYPE_LARGE;
break;
case 'h':
btype = NS_BUFTYPE_HUGE;
break;
case 'i':
btype = NS_BUFTYPE_IOVEC;
break;
default:
usage(name);
}
sioc.number = itf;
sioc.arg = (void *) btype;
sioc.length = sizeof(void *);
s = socket(PF_ATMPVC, SOCK_DGRAM, 0);
if (s < 0)
{
perror("socket");
return 2;
}
if (ioctl(s, NS_ADJBUFLEV, &sioc) < 0)
{
perror("ioctl NS_ADJBUFLEV");
return 3;
}
}
return 0;
}