Commit 6283a913 authored by Philippe Gerum's avatar Philippe Gerum Committed by Jan Kiszka
Browse files

testsuite/smokey: net: do not unload pre-loaded modules



We may want to use those tests in pre-configured situations, where a
set of RTnet modules is already in place at startup, which we don't
want the test to remove on exit.

Those changes ensure that only the modules we had to push for running
the test are actually removed on exit, leaving the pre-loaded ones
running.
Signed-off-by: Philippe Gerum's avatarPhilippe Gerum <rpm@xenomai.org>
Signed-off-by: Jan Kiszka's avatarJan Kiszka <jan.kiszka@siemens.com>
parent e58e6cd1
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
struct module { struct module {
int option; int option;
const char *name; const char *name;
bool loaded;
}; };
#define TIMEOUT 10 #define TIMEOUT 10
...@@ -37,6 +38,15 @@ static int fd; ...@@ -37,6 +38,15 @@ static int fd;
static pthread_t loopback_server_tid; static pthread_t loopback_server_tid;
static bool loopback_thread_created; static bool loopback_thread_created;
static struct module modules[] = { static struct module modules[] = {
{
.name = "rtnet",
},
{
.name = "rtipv4",
},
{
.name = "rtcfg",
},
{ {
.option = _CC_COBALT_NET_UDP, .option = _CC_COBALT_NET_UDP,
.name = "rtudp", .name = "rtudp",
...@@ -45,9 +55,19 @@ static struct module modules[] = { ...@@ -45,9 +55,19 @@ static struct module modules[] = {
.option = _CC_COBALT_NET_AF_PACKET, .option = _CC_COBALT_NET_AF_PACKET,
.name = "rtpacket", .name = "rtpacket",
}, },
{
.name = NULL, /* driver */
},
}; };
static const char *option_to_module(int option) #define MODID_RTNET 0
#define MODID_IPV4 1
#define MODID_CFG 2
#define MODID_UDP 3
#define MODID_PACKET 4
#define MODID_DRIVER 5
static int option_to_modid(int option)
{ {
unsigned i; unsigned i;
...@@ -55,10 +75,10 @@ static const char *option_to_module(int option) ...@@ -55,10 +75,10 @@ static const char *option_to_module(int option)
if (modules[i].option != option) if (modules[i].option != option)
continue; continue;
return modules[i].name; return i;
} }
return NULL; return -1;
} }
static int get_info(const char *intf) static int get_info(const char *intf)
...@@ -118,13 +138,37 @@ static int do_down(const char *intf) ...@@ -118,13 +138,37 @@ static int do_down(const char *intf)
return 0; return 0;
} }
static int smokey_net_modprobe(const char *mod) static int smokey_net_modprobe(int modid)
{ {
struct module *m = modules + modid;
char buffer[128]; char buffer[128];
int err; int err, len;
FILE *fp;
if (modid < 0)
return -EINVAL;
fp = fopen("/proc/modules", "r");
if (fp == NULL)
return -errno;
len = strlen(m->name);
while (fgets(buffer, sizeof(buffer), fp)) {
if (strncmp(buffer, m->name, len) == 0 &&
len < sizeof(buffer) && buffer[len] == ' ') {
smokey_trace("%s module already loaded", m->name);
fclose(fp);
return 0;
}
}
fclose(fp);
smokey_trace("%s module not there: modprobing", m->name);
err = smokey_check_errno( err = smokey_check_errno(
snprintf(buffer, sizeof(buffer), "modprobe %s", mod)); snprintf(buffer, sizeof(buffer), "modprobe %s", m->name));
if (err < 0) if (err < 0)
return err; return err;
...@@ -137,16 +181,26 @@ static int smokey_net_modprobe(const char *mod) ...@@ -137,16 +181,26 @@ static int smokey_net_modprobe(const char *mod)
return -EINVAL; return -EINVAL;
} }
m->loaded = true;
return err; return err;
} }
static int smokey_net_rmmod(const char *mod) static int smokey_net_rmmod(int modid)
{ {
struct module *m = modules + modid;
char buffer[128]; char buffer[128];
int err; int err;
if (!m->loaded) {
smokey_trace("%s module was there on entry, keeping it", m->name);
return 0;
}
smokey_trace("unloading %s module", m->name);
err = smokey_check_errno( err = smokey_check_errno(
snprintf(buffer, sizeof(buffer), "rmmod %s", mod)); snprintf(buffer, sizeof(buffer), "rmmod %s", m->name));
if (err < 0) if (err < 0)
return err; return err;
...@@ -170,7 +224,7 @@ static int smokey_net_setup_rtcfg_client(const char *intf, int net_config) ...@@ -170,7 +224,7 @@ static int smokey_net_setup_rtcfg_client(const char *intf, int net_config)
if ((net_config & _CC_COBALT_NET_CFG) == 0) if ((net_config & _CC_COBALT_NET_CFG) == 0)
return -ENOSYS; return -ENOSYS;
err = smokey_net_modprobe("rtcfg"); err = smokey_net_modprobe(MODID_CFG);
if (err < 0) if (err < 0)
return err; return err;
...@@ -213,11 +267,13 @@ static int smokey_net_teardown_rtcfg(const char *intf) ...@@ -213,11 +267,13 @@ static int smokey_net_teardown_rtcfg(const char *intf)
if (err < 0) if (err < 0)
return err; return err;
err = smokey_check_errno(ioctl(fd, RTCFG_IOC_DETACH, &cmd)); /*
if (err < 0) * We may or may not be acting as a server; don't check the
return err; * status.
*/
ioctl(fd, RTCFG_IOC_DETACH, &cmd);
return smokey_net_rmmod("rtcfg"); return smokey_net_rmmod(MODID_CFG);
} }
static int find_peer(const char *intf, void *vpeer) static int find_peer(const char *intf, void *vpeer)
...@@ -366,15 +422,16 @@ int smokey_net_setup(const char *driver, const char *intf, int tested_config, ...@@ -366,15 +422,16 @@ int smokey_net_setup(const char *driver, const char *intf, int tested_config,
if ((net_config & tested_config) == 0) if ((net_config & tested_config) == 0)
return -ENOSYS; return -ENOSYS;
err = smokey_net_modprobe(driver); modules[MODID_DRIVER].name = driver;
err = smokey_net_modprobe(MODID_DRIVER);
if (err < 0) if (err < 0)
return err; return err;
err = smokey_net_modprobe("rtipv4"); err = smokey_net_modprobe(MODID_IPV4);
if (err < 0) if (err < 0)
return err; return err;
err = smokey_net_modprobe(option_to_module(tested_config)); err = smokey_net_modprobe(option_to_modid(tested_config));
if (err < 0) if (err < 0)
return err; return err;
...@@ -494,19 +551,19 @@ int smokey_net_teardown(const char *driver, const char *intf, int tested_config) ...@@ -494,19 +551,19 @@ int smokey_net_teardown(const char *driver, const char *intf, int tested_config)
} else } else
err = tmp; err = tmp;
tmp = smokey_net_rmmod(option_to_module(tested_config)); tmp = smokey_net_rmmod(option_to_modid(tested_config));
if (err == 0) if (err == 0)
err = tmp; err = tmp;
tmp = smokey_net_rmmod(driver); tmp = smokey_net_rmmod(MODID_DRIVER);
if (err == 0) if (err == 0)
err = tmp; err = tmp;
tmp = smokey_net_rmmod("rtipv4"); tmp = smokey_net_rmmod(MODID_IPV4);
if (err == 0) if (err == 0)
err = tmp; err = tmp;
tmp = smokey_net_rmmod("rtnet"); tmp = smokey_net_rmmod(MODID_RTNET);
if (err == 0) if (err == 0)
err = tmp; err = tmp;
......
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