Rearrange the fields in the vcc table entry to fit to the requirements
of the generic getvcc function and used that function instead of the home grown.
This commit is contained in:
parent
177f5441d5
commit
6662c0c12e
@ -88,58 +88,6 @@ SYSCTL_PROC(_hw_atm, OID_AUTO, natm_traffic, CTLTYPE_UINT | CTLFLAG_RW,
|
||||
SYSCTL_UINT(_hw_atm, OID_AUTO, natm_pcr, CTLFLAG_RW,
|
||||
&hatm_natm_pcr, 0, "PCR for NATM connections");
|
||||
|
||||
/*
|
||||
* Return a table of VCCs in a freshly allocated memory area.
|
||||
* Here we have a problem: we first count, how many vccs we need
|
||||
* to return. The we allocate the memory and finally fill it in.
|
||||
* Because we cannot lock while calling malloc, the number of active
|
||||
* vccs may change while we're in malloc. So we allocate a couple of
|
||||
* vccs more and if space anyway is not enough re-iterate.
|
||||
*/
|
||||
static struct atmio_vcctable *
|
||||
hatm_getvccs(struct hatm_softc *sc)
|
||||
{
|
||||
u_int cid, alloc;
|
||||
size_t len;
|
||||
struct atmio_vcctable *vccs;
|
||||
struct atmio_vcc *v;
|
||||
|
||||
alloc = sc->open_vccs + 10;
|
||||
vccs = NULL;
|
||||
|
||||
again:
|
||||
len = sizeof(*vccs) + alloc * sizeof(vccs->vccs[0]);
|
||||
vccs = reallocf(vccs, len, M_DEVBUF, M_WAITOK);
|
||||
bzero(vccs, len);
|
||||
|
||||
/*
|
||||
* Fill in
|
||||
*/
|
||||
vccs->count = 0;
|
||||
v = vccs->vccs;
|
||||
|
||||
mtx_lock(&sc->mtx);
|
||||
for (cid = 0; cid < HE_MAX_VCCS; cid++)
|
||||
if (sc->vccs[cid] != NULL &&
|
||||
(sc->vccs[cid]->vflags & (HE_VCC_RX_OPEN |
|
||||
HE_VCC_TX_OPEN))) {
|
||||
if (++vccs->count == alloc) {
|
||||
/*
|
||||
* too many - try again
|
||||
*/
|
||||
break;
|
||||
}
|
||||
*v++ = sc->vccs[cid]->param;
|
||||
}
|
||||
mtx_unlock(&sc->mtx);
|
||||
|
||||
if (cid == HE_MAX_VCCS)
|
||||
return (vccs);
|
||||
|
||||
alloc *= 2;
|
||||
goto again;
|
||||
}
|
||||
|
||||
/*
|
||||
* Try to open the given VCC.
|
||||
*/
|
||||
@ -420,11 +368,8 @@ hatm_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
|
||||
|
||||
case SIOCATMGVCCS:
|
||||
/* return vcc table */
|
||||
vtab = hatm_getvccs(sc);
|
||||
if (vtab == NULL) {
|
||||
error = ENOMEM;
|
||||
break;
|
||||
}
|
||||
vtab = atm_getvccs((struct atmio_vcc **)sc->vccs,
|
||||
HE_MAX_VCCS, sc->open_vccs, &sc->mtx, 1);
|
||||
error = copyout(vtab, ifr->ifr_data, sizeof(*vtab) +
|
||||
vtab->count * sizeof(vtab->vccs[0]));
|
||||
free(vtab, M_DEVBUF);
|
||||
@ -439,7 +384,9 @@ hatm_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
|
||||
break;
|
||||
|
||||
case SIOCATMGETVCCS: /* netgraph internal use */
|
||||
if ((vtab = hatm_getvccs(sc)) == NULL) {
|
||||
vtab = atm_getvccs((struct atmio_vcc **)sc->vccs,
|
||||
HE_MAX_VCCS, sc->open_vccs, &sc->mtx, 0);
|
||||
if (vtab == NULL) {
|
||||
error = ENOMEM;
|
||||
break;
|
||||
}
|
||||
|
@ -316,22 +316,20 @@ struct heirq {
|
||||
/*
|
||||
* This structure describes all information for a VCC open on the card.
|
||||
* The array of these structures is indexed by the compressed connection ID
|
||||
* (CID).
|
||||
* (CID). This structure must begin with the atmio_vcc.
|
||||
*/
|
||||
struct hevcc {
|
||||
u_int vflags; /* private flags */
|
||||
struct atmio_vcc param; /* traffic parameters */
|
||||
void * rxhand; /* NATM protocol block */
|
||||
u_int vflags; /* private flags */
|
||||
uint32_t ipackets;
|
||||
uint32_t opackets;
|
||||
uint32_t ibytes;
|
||||
uint32_t obytes;
|
||||
|
||||
u_int rc; /* rate control group for CBR */
|
||||
struct mbuf * chain; /* partial received PDU */
|
||||
struct mbuf * last; /* last mbuf in chain */
|
||||
|
||||
/* from the OPEN_VCC ioctl */
|
||||
struct atmio_vcc param; /* traffic parameters */
|
||||
|
||||
uint32_t ibytes;
|
||||
uint32_t ipackets;
|
||||
uint32_t obytes;
|
||||
uint32_t opackets;
|
||||
u_int ntpds; /* number of active TPDs */
|
||||
};
|
||||
#define HE_VCC_OPEN 0x000f0000
|
||||
|
Loading…
Reference in New Issue
Block a user