1dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat/* 2dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * q_atm.c ATM. 3dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 4dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * Hacked 1998-2000 by Werner Almesberger, EPFL ICA 5dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 6dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat */ 7dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 8dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <stdio.h> 9dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <stdlib.h> 10dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <unistd.h> 11dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <ctype.h> 12dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <syslog.h> 13dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <fcntl.h> 14dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <sys/socket.h> 15dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <sys/ioctl.h> 16dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <netinet/in.h> 17dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <arpa/inet.h> 18dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <string.h> 19dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <atm.h> 20dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <linux/atmdev.h> 21dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <linux/atmarp.h> 22dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 23dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include "utils.h" 24dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include "tc_util.h" 25dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 26dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 27dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define MAX_HDR_LEN 64 28dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 29dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 30dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic int atm_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n) 31dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 32dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (argc) { 33dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr,"Usage: atm\n"); 34dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 35dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 36dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 37dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 38dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 39dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 40dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic void explain(void) 41dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 42dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Usage: ... atm ( pvc ADDR | svc ADDR [ sap SAP ] ) " 43dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat "[ qos QOS ] [ sndbuf BYTES ]\n"); 44dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, " [ hdr HEX... ] [ excess ( CLASSID | clp ) ] " 45dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat "[ clip ]\n"); 46dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 47dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 48dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 49dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic int atm_parse_class_opt(struct qdisc_util *qu, int argc, char **argv, 50dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct nlmsghdr *n) 51dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 52dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct sockaddr_atmsvc addr; 53dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct atm_qos qos; 54dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct atm_sap sap; 55dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat unsigned char hdr[MAX_HDR_LEN]; 56dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u32 excess = 0; 57dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct rtattr *tail; 58dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int sndbuf = 0; 59dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int hdr_len = -1; 60dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int set_clip = 0; 61dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int s; 62dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 63dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat memset(&addr,0,sizeof(addr)); 64dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat (void) text2qos("aal5,ubr:sdu=9180,rx:none",&qos,0); 65dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat (void) text2sap("blli:l2=iso8802",&sap,0); 66dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat while (argc > 0) { 67dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (!strcmp(*argv,"pvc")) { 68dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 69dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (text2atm(*argv,(struct sockaddr *) &addr, 70dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat sizeof(addr),T2A_PVC | T2A_NAME) < 0) { 71dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat explain(); 72dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 73dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 74dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 75dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat else if (!strcmp(*argv,"svc")) { 76dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 77dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (text2atm(*argv,(struct sockaddr *) &addr, 78dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat sizeof(addr),T2A_SVC | T2A_NAME) < 0) { 79dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat explain(); 80dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 81dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 82dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 83dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat else if (!strcmp(*argv,"qos")) { 84dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 85dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (text2qos(*argv,&qos,0) < 0) { 86dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat explain(); 87dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 88dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 89dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 90dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat else if (!strcmp(*argv,"sndbuf")) { 91dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat char *end; 92dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 93dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 94dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat sndbuf = strtol(*argv,&end,0); 95dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (*end) { 96dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat explain(); 97dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 98dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 99dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 100dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat else if (!strcmp(*argv,"sap")) { 101dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 102dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (addr.sas_family != AF_ATMSVC || 103dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat text2sap(*argv,&sap,T2A_NAME) < 0) { 104dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat explain(); 105dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 106dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 107dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 108dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat else if (!strcmp(*argv,"hdr")) { 109dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat unsigned char *ptr; 110dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat char *walk; 111dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 112dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 113dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat ptr = hdr; 114dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat for (walk = *argv; *walk; walk++) { 115dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int tmp; 116dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 117dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (ptr == hdr+MAX_HDR_LEN) { 118dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr,"header is too long\n"); 119dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 120dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 121dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (*walk == '.') continue; 122dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (!isxdigit(walk[0]) || !walk[1] || 123dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat !isxdigit(walk[1])) { 124dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat explain(); 125dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 126dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 127dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat sscanf(walk,"%2x",&tmp); 128dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat *ptr++ = tmp; 129dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat walk++; 130dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 131dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat hdr_len = ptr-hdr; 132dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 133dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat else if (!strcmp(*argv,"excess")) { 134dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 135dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (!strcmp(*argv,"clp")) excess = 0; 136dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat else if (get_tc_classid(&excess,*argv)) { 137dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat explain(); 138dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 139dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 140dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 141dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat else if (!strcmp(*argv,"clip")) { 142dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat set_clip = 1; 143dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 144dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat else { 145dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat explain(); 146dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 1; 147dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 148dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat argc--; 149dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat argv++; 150dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 151dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat s = socket(addr.sas_family,SOCK_DGRAM,0); 152dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (s < 0) { 153dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat perror("socket"); 154dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 155dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 156dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (setsockopt(s,SOL_ATM,SO_ATMQOS,&qos,sizeof(qos)) < 0) { 157dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat perror("SO_ATMQOS"); 158dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 159dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 160dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (sndbuf) 161dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (setsockopt(s,SOL_SOCKET,SO_SNDBUF,&sndbuf,sizeof(sndbuf)) < 0) { 162dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat perror("SO_SNDBUF"); 163dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 164dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 165dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (addr.sas_family == AF_ATMSVC && setsockopt(s,SOL_ATM,SO_ATMSAP, 166dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat &sap,sizeof(sap)) < 0) { 167dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat perror("SO_ATMSAP"); 168dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 169dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 170dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (connect(s,(struct sockaddr *) &addr,addr.sas_family == AF_ATMPVC ? 171dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat sizeof(struct sockaddr_atmpvc) : sizeof(addr)) < 0) { 172dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat perror("connect"); 173dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 174dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 175dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (set_clip) 176dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (ioctl(s,ATMARP_MKIP,0) < 0) { 177dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat perror("ioctl ATMARP_MKIP"); 178dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 179dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 180dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tail = NLMSG_TAIL(n); 181dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat addattr_l(n,1024,TCA_OPTIONS,NULL,0); 182dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat addattr_l(n,1024,TCA_ATM_FD,&s,sizeof(s)); 183dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (excess) addattr_l(n,1024,TCA_ATM_EXCESS,&excess,sizeof(excess)); 184dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (hdr_len != -1) addattr_l(n,1024,TCA_ATM_HDR,hdr,hdr_len); 185dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail; 186dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 187dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 188dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 189dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 190dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 191dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic int atm_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) 192dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 193dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct rtattr *tb[TCA_ATM_MAX+1]; 194dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat char buffer[MAX_ATM_ADDR_LEN+1]; 195dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 196dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (opt == NULL) 197dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 198dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 199dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat parse_rtattr_nested(tb, TCA_ATM_MAX, opt); 200dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tb[TCA_ATM_ADDR]) { 201dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (RTA_PAYLOAD(tb[TCA_ATM_ADDR]) < 202dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat sizeof(struct sockaddr_atmpvc)) 203dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr,"ATM: address too short\n"); 204dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat else { 205dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (atm2text(buffer,MAX_ATM_ADDR_LEN, 206dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat RTA_DATA(tb[TCA_ATM_ADDR]),A2T_PRETTY | A2T_NAME) < 207dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 0) fprintf(stderr,"atm2text error\n"); 208dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(f,"pvc %s ",buffer); 209dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 210dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 211dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tb[TCA_ATM_HDR]) { 212dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int i; 213dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 214dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(f,"hdr"); 215dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat for (i = 0; i < RTA_PAYLOAD(tb[TCA_ATM_HDR]); i++) 216dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(f,"%c%02x",i ? '.' : ' ', 217dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat ((unsigned char *) RTA_DATA(tb[TCA_ATM_HDR]))[i]); 218dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (!i) fprintf(f," ."); 219dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(f," "); 220dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 221dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tb[TCA_ATM_EXCESS]) { 222dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u32 excess; 223dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 224dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (RTA_PAYLOAD(tb[TCA_ATM_EXCESS]) < sizeof(excess)) 225dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr,"ATM: excess class ID too short\n"); 226dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat else { 227dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat excess = *(__u32 *) RTA_DATA(tb[TCA_ATM_EXCESS]); 228dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (!excess) fprintf(f,"excess clp "); 229dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat else { 230dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat char buf[64]; 231dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 232dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat print_tc_classid(buf,sizeof(buf),excess); 233dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(f,"excess %s ",buf); 234dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 235dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 236dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 237dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tb[TCA_ATM_STATE]) { 238dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat static const char *map[] = { ATM_VS2TXT_MAP }; 239dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int state; 240dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 241dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (RTA_PAYLOAD(tb[TCA_ATM_STATE]) < sizeof(state)) 242dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr,"ATM: state field too short\n"); 243dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat else { 244dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat state = *(int *) RTA_DATA(tb[TCA_ATM_STATE]); 245dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(f,"%s ",map[state]); 246dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 247dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 248dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 249dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 250dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 251dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 252dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstruct qdisc_util atm_qdisc_util = { 253dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .id = "atm", 254dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .parse_qopt = atm_parse_opt, 255dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .print_qopt = atm_print_opt, 256dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .parse_copt = atm_parse_class_opt, 257dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .print_copt = atm_print_opt, 258dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}; 259