static BOOL CmdUntrackType(struct IOSana2Req *request, struct DevBase *base) { struct DevUnit *unit; struct Opener *opener; ULONG packet_type; struct TypeTracker *tracker; struct TypeStats *initial_stats; unit = (APTR)request->ios2_Req.io_Unit; packet_type = request->ios2_PacketType; if(packet_type <= ETH_MTU) packet_type = ETH_MTU; /* Get global tracker and initial figures */ tracker = (struct TypeTracker *) FindTypeStats(unit, &unit->type_trackers, packet_type, base); opener = request->ios2_BufferManagement; initial_stats = FindTypeStats(unit, &opener->initial_stats, packet_type, base); /* Decrement tracker usage and free unused structures */ if(initial_stats != NULL) { if((--tracker->user_count) == 0) { Disable(); Remove((APTR)tracker); Enable(); FreeMem(tracker, sizeof(struct TypeTracker)); } Remove((APTR)initial_stats); FreeMem(initial_stats, sizeof(struct TypeStats)); } else { request->ios2_Req.io_Error = S2ERR_BAD_STATE; request->ios2_WireError = S2WERR_NOT_TRACKED; } /* Return */ return TRUE; }
static BOOL CmdUntrackType(LIBBASETYPEPTR LIBBASE, struct IOSana2Req *request) { struct SiS900Unit *unit; struct Opener *opener; ULONG packet_type; struct TypeTracker *tracker; struct TypeStats *initial_stats; unit = (APTR)request->ios2_Req.io_Unit; D(bug("[%s]: S2CmdUntrackType()\n", unit->sis900u_name)); packet_type = request->ios2_PacketType; /* Get global tracker and initial figures */ tracker = (struct TypeTracker *) FindTypeStats(LIBBASE, unit, &unit->sis900u_type_trackers, packet_type); opener = request->ios2_BufferManagement; initial_stats = FindTypeStats(LIBBASE, unit, &opener->initial_stats, packet_type); /* Decrement tracker usage and free unused structures */ if(initial_stats != NULL) { if((--tracker->user_count) == 0) { Disable(); Remove((APTR)tracker); Enable(); FreeMem(tracker, sizeof(struct TypeTracker)); } Remove((APTR)initial_stats); FreeMem(initial_stats, sizeof(struct TypeStats)); } else { request->ios2_Req.io_Error = S2ERR_BAD_STATE; request->ios2_WireError = S2WERR_NOT_TRACKED; } /* Return */ return TRUE; }
static BOOL CmdGetTypeStats(LIBBASETYPEPTR LIBBASE, struct IOSana2Req *request) { struct SiS900Unit *unit; struct Opener *opener; ULONG packet_type; struct TypeStats *initial_stats, *tracker; struct Sana2PacketTypeStats *stats; unit = (APTR)request->ios2_Req.io_Unit; D(bug("[%s]: S2CmdGetTypeStats()\n", unit->sis900u_name)); packet_type = request->ios2_PacketType; /* Get global tracker and initial figures */ tracker = FindTypeStats(LIBBASE, unit, &unit->sis900u_type_trackers, packet_type); opener = request->ios2_BufferManagement; initial_stats = FindTypeStats(LIBBASE, unit, &opener->initial_stats, packet_type); /* Copy and adjust figures */ if(initial_stats != NULL) { stats = request->ios2_StatData; CopyMem(&tracker->stats, stats, sizeof(struct Sana2PacketTypeStats)); stats->PacketsSent -= initial_stats->stats.PacketsSent; stats->PacketsReceived -= initial_stats->stats.PacketsReceived; stats->BytesSent -= initial_stats->stats.BytesSent; stats->BytesReceived -= initial_stats->stats.BytesReceived; stats->PacketsDropped -= initial_stats->stats.PacketsDropped; } else { request->ios2_Req.io_Error = S2ERR_BAD_STATE; request->ios2_WireError = S2WERR_NOT_TRACKED; } /* Return */ return TRUE; }
static BOOL CmdTrackType(LIBBASETYPEPTR LIBBASE, struct IOSana2Req *request) { struct SiS900Unit *unit; struct Opener *opener; ULONG packet_type, wire_error=0; struct TypeTracker *tracker; struct TypeStats *initial_stats; BYTE error = 0; unit = (APTR)request->ios2_Req.io_Unit; D(bug("[%s]: S2CmdTrackType()\n", unit->sis900u_name)); packet_type = request->ios2_PacketType; /* Get global tracker */ tracker = (struct TypeTracker *) FindTypeStats(LIBBASE, unit, &unit->sis900u_type_trackers, packet_type); if(tracker != NULL) tracker->user_count++; else { tracker = AllocMem(sizeof(struct TypeTracker), MEMF_PUBLIC|MEMF_CLEAR); if(tracker != NULL) { tracker->packet_type = packet_type; tracker->user_count = 1; Disable(); AddTail((APTR)&unit->sis900u_type_trackers, (APTR)tracker); Enable(); } } /* Store initial figures for this opener */ opener = request->ios2_BufferManagement; initial_stats = FindTypeStats(LIBBASE, unit, &opener->initial_stats, packet_type); if(initial_stats != NULL) { error = S2ERR_BAD_STATE; wire_error = S2WERR_ALREADY_TRACKED; } if(error == 0) { initial_stats = AllocMem(sizeof(struct TypeStats), MEMF_PUBLIC); if(initial_stats == NULL) { error = S2ERR_NO_RESOURCES; wire_error = S2WERR_GENERIC_ERROR; } } if(error == 0) { CopyMem(tracker, initial_stats, sizeof(struct TypeStats)); AddTail((APTR)&opener->initial_stats, (APTR)initial_stats); } /* Return */ request->ios2_Req.io_Error = error; request->ios2_WireError = wire_error; return TRUE; }