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.
TP-Link_Archer-XR500v/EN7526G_3.18Kernel_SDK/apps/public/linux-atm/switch/swc.c
2024-07-22 01:58:46 -03:00

126 lines
2.9 KiB
C
Executable File

/* swc.c - User switch control */
/* Written 1998 by Werner Almesberger, EPFL ICA */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <atm.h>
#include <atmd.h>
#include "swc.h"
static void dialog(int s,SWC_MSG *msg)
{
int size;
size = write(s,msg,sizeof(*msg));
if (size < 0) {
perror("write");
exit(1);
}
if (size != sizeof(*msg)) {
fprintf(stderr,"bad write: %d != %d\n",size,sizeof(*msg));
exit(1);
}
size = read(s,msg,sizeof(*msg));
if (size < 0) {
perror("read");
exit(1);
}
if (size != sizeof(*msg)) {
fprintf(stderr,"bad read: %d != %d\n",size,sizeof(*msg));
exit(1);
}
}
static void usage(const char *name)
{
fprintf(stderr,"usage: %s <socket> <command>\n",name);
fprintf(stderr," commands: show\n");
fprintf(stderr," add <in_pvc> <out_pvc> [<qos>]\n");
fprintf(stderr," del <in_pvc> <out_pvc>\n");
exit(1);
}
int main(int argc,const char **argv)
{
char buffer[MAX_ATM_ADDR_LEN+1];
SWC_MSG msg;
int s;
if (argc < 3) usage(*argv);
s = un_attach(argv[1]);
if (s < 0) {
perror(argv[1]);
return 1;
}
memset(&msg,0,sizeof(msg));
if (!strcmp(argv[2],"show")) {
if (argc != 3) usage(*argv);
msg.type = smt_get;
msg.n = 0;
while (1) {
dialog(s,&msg);
if (msg.type != smt_get) {
fprintf(stderr,"unexpeced message type %d != %d\n",msg.type,
smt_get);
}
if (msg.n < 0) return 0;
if (msg.in.sap_addr.vci != ATM_VCI_UNSPEC) printf("VC ");
else {
printf("VP ");
msg.out.sap_addr.vci = ATM_VCI_UNSPEC;
}
if (atm2text(buffer,sizeof(buffer),(struct sockaddr *) &msg.in,
A2T_PRETTY) < 0) strcpy(buffer,"<invalid>");
printf("%s %c-%c ",buffer,msg.qos.rxtp.traffic_class ? '<' : '-',
msg.qos.txtp.traffic_class ? '>' : '-');
if (atm2text(buffer,sizeof(buffer),(struct sockaddr *) &msg.out,
A2T_PRETTY) < 0) strcpy(buffer,"<invalid>");
printf("%s\n",buffer);
msg.n++;
}
}
if (!strcmp(argv[2],"add")) {
msg.type = smt_add;
msg.qos.txtp.traffic_class = msg.qos.rxtp.traffic_class = ATM_UBR;
msg.qos.aal = ATM_AAL5;
if (argc == 6) {
if (text2qos(argv[5],&msg.qos,0) < 0) {
fprintf(stderr,"invalid QOS specification: %s\n",argv[5]);
return 1;
}
}
else if (argc != 5) usage(*argv);
}
else if (!strcmp(argv[2],"del")) {
if (argc != 5) usage(*argv);
msg.type = smt_del;
}
else usage(*argv);
if (text2atm(argv[3],(struct sockaddr *) &msg.in,sizeof(msg.in),
T2A_PVC | T2A_UNSPEC | T2A_NAME) < 0) {
fprintf(stderr,"invalid PVC address: %s\n",argv[3]);
return 1;
}
if (text2atm(argv[4],(struct sockaddr *) &msg.out,sizeof(msg.out),
T2A_PVC | T2A_UNSPEC | T2A_NAME) < 0) {
fprintf(stderr,"invalid PVC address: %s\n",argv[4]);
return 1;
}
dialog(s,&msg);
if (msg.n < 0) {
fprintf(stderr,"%s\n",strerror(-msg.n));
return 1;
}
return 0;
}