Commit 869121d0 authored by Jeffrey Lee's avatar Jeffrey Lee
Browse files

Fix Service_PreReset handler, implement DCIPROTOCOL_DYING handling

Detail:
  c/module, c/dcifilter, h/dcifilter - Implement DCIPROTOCOL_DYING, to ensure that filters associated with dead modules are discarded.
  cmhg/ModuleHdr - Fix service call list to specify Service_PreReset, not Service_Reset
  c/module - Add missing 'break' statement to Service_PreReset handler
Admin:
  Tested on iMx6


Version 0.33. Tagged as 'EtherTH-0_33'
parent 07f2ceee
......@@ -11,13 +11,13 @@
GBLS Module_HelpVersion
GBLS Module_ComponentName
GBLS Module_ComponentPath
Module_MajorVersion SETS "0.32"
Module_Version SETA 32
Module_MajorVersion SETS "0.33"
Module_Version SETA 33
Module_MinorVersion SETS ""
Module_Date SETS "05 Jan 2018"
Module_ApplicationDate SETS "05-Jan-18"
Module_Date SETS "06 Jan 2018"
Module_ApplicationDate SETS "06-Jan-18"
Module_ComponentName SETS "EtherTH"
Module_ComponentPath SETS "mixed/RiscOS/Sources/Networking/Ethernet/EtherTH"
Module_FullVersion SETS "0.32"
Module_HelpVersion SETS "0.32 (05 Jan 2018)"
Module_FullVersion SETS "0.33"
Module_HelpVersion SETS "0.33 (06 Jan 2018)"
END
/* (0.32)
/* (0.33)
*
* This file is automatically maintained by srccommit, do not edit manually.
* Last processed by srccommit version: 1.1.
*
*/
#define Module_MajorVersion_CMHG 0.32
#define Module_MajorVersion_CMHG 0.33
#define Module_MinorVersion_CMHG
#define Module_Date_CMHG 05 Jan 2018
#define Module_Date_CMHG 06 Jan 2018
#define Module_MajorVersion "0.32"
#define Module_Version 32
#define Module_MajorVersion "0.33"
#define Module_Version 33
#define Module_MinorVersion ""
#define Module_Date "05 Jan 2018"
#define Module_Date "06 Jan 2018"
#define Module_ApplicationDate "05-Jan-18"
#define Module_ApplicationDate "06-Jan-18"
#define Module_ComponentName "EtherTH"
#define Module_ComponentPath "mixed/RiscOS/Sources/Networking/Ethernet/EtherTH"
#define Module_FullVersion "0.32"
#define Module_HelpVersion "0.32 (05 Jan 2018)"
#define Module_LibraryVersionInfo "0:32"
#define Module_FullVersion "0.33"
#define Module_HelpVersion "0.33 (06 Jan 2018)"
#define Module_LibraryVersionInfo "0:33"
......@@ -147,6 +147,44 @@ void* dcifilter_delete(dcifilter_t* filter)
return NULL;
}
void dcifilter_release_module(dcifilter_t* filter, void *pw)
{
if (filter == NULL) return;
handler_t* handler;
handler_t* next;
unsigned int frame_type;
handler = filter->ieee;
if ((handler != NULL) && (handler->handler_fn_pw_r12 == pw))
{
filter->ieee = 0;
frame_type = 0;
SET_FRAMETYPE(frame_type, handler->ethertype);
SET_FRAMELEVEL(frame_type, handler->frmlvl);
_swix(OS_ServiceCall, _INR(0,4), filter->dib, Service_DCIFrameTypeFree,
frame_type, handler->addrlvl, handler->errlvl);
dprintf_here("released tp=%x ad=%x er=%x\n", frame_type, handler->addrlvl, handler->errlvl);
free(handler);
}
for (handler = TAILQ_FIRST(&filter->e2list); handler; handler = next)
{
next = TAILQ_NEXT(handler, q_next);
if (handler->handler_fn_pw_r12 == pw)
{
TAILQ_REMOVE(&filter->e2list, handler, q_next);
frame_type = 0;
SET_FRAMETYPE(frame_type, handler->ethertype);
SET_FRAMELEVEL(frame_type, handler->frmlvl);
_swix(OS_ServiceCall, _INR(0,4), filter->dib, Service_DCIFrameTypeFree,
frame_type, handler->addrlvl, handler->errlvl);
dprintf_here("released tp=%x ad=%x er=%x\n", frame_type, handler->addrlvl, handler->errlvl);
free(handler);
}
}
}
uint32_t dcifilter_getUnwantedFrames(dcifilter_t* filter)
{
return filter == NULL ? 0 : filter->unwanted_frames;
......
......@@ -197,6 +197,7 @@ void module_service(int service_number, _kernel_swi_regs *r, void *pw)
{ /* shut down the module totally */
module_final(1,0,0);
}
break;
case Service_MbufManagerStatus:
switch (r->r[0]) /* reason code */
{
......@@ -242,7 +243,12 @@ void module_service(int service_number, _kernel_swi_regs *r, void *pw)
if (args->reason_code == DCIPROTOCOL_DYING &&
args->version / 100 == DCIVERSION / 100) /* Ensure same major version */
{
/* todo */
/* Release the filters associated with this DCI protocol module */
device_t* d;
SLIST_FOREACH(d, &device_list, next)
{
dcifilter_release_module(d->dcifilter, args->pw);
}
}
......
......@@ -12,7 +12,7 @@ finalisation-code: module_final
service-call-handler: module_service Service_EnumerateNetworkDrivers,
Service_DCIProtocolStatus,
Service_MbufManagerStatus,
Service_Reset,
Service_PreReset,
Service_ResourceFSStarting
swi-chunk-base-number: 0x59500
......
......@@ -40,6 +40,7 @@ typedef struct dcifilter_t dcifilter_t;
_kernel_oserror* dcifilter_new(const Dib*, dcifilter_t** out);
void * dcifilter_delete(dcifilter_t* filter); /* return NULL */
void dcifilter_release_module(dcifilter_t* filter, void *pw);
uint32_t dcifilter_getUnwantedFrames(dcifilter_t* filter);
/* Called from modules DCI Transmit Swi */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment