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.
2024-07-22 01:58:46 -03:00

41 lines
841 B
C
Executable File

/* sdu2cr.c - Converts SDU sizes and SDU counts to cell counts */
/* Written 1996-1998 by Werner Almesberger, EPFL-LRC/ICA */
#include <limits.h>
#include "atm.h"
int sdu2cell(int s,int sizes,const int *sdu_size,int *num_sdu)
{
struct atm_qos qos;
int trailer,total,cells;
int size,i;
size = sizeof(qos);
if (getsockopt(s,SOL_AAL,SO_ATMQOS,&qos,&size) < 0) return -1;
switch (qos.aal) {
case ATM_AAL0:
trailer = 0;
break;
case ATM_AAL5:
trailer = ATM_AAL5_TRAILER;
break;
default:
return -1;
}
total = 0;
for (i = 0; i < sizes; i++) {
cells = (trailer+*sdu_size+ATM_CELL_PAYLOAD-1)/ATM_CELL_PAYLOAD;
if (INT_MAX/cells < *num_sdu) return -1;
cells *= *num_sdu;
if (INT_MAX-cells < total) return -1;
total += cells;
sdu_size++;
num_sdu++;
}
return total;
}