Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}