Name of the primary network interface, how to find in bsp header files?

Heinz Junkes junkes at fhi-berlin.mpg.de
Sun Aug 9 18:20:28 UTC 2020


Hello, Chris,

with libbsd I also realized this with the concept you suggested (still beta development):

...
    sc = rtems_bsd_initialize();
    assert(sc == RTEMS_SUCCESSFUL);

    /* Let the callout timer allocate its resources */
    sc = rtems_task_wake_after(2);
    assert(sc == RTEMS_SUCCESSFUL);

    rtems_bsd_ifconfig_lo0();

//  lookup available network interfaces
    char ifnamebuf[IF_NAMESIZE];
    char *ifname;
// get primary network interface
    ifname = if_indextoname(1, &ifnamebuf[0]);
    assert(ifname != NULL);
    printf("\n***** Primary Network interface : %s *****\n", ifname);

    default_network_dhcpcd();

    // implement DHCP hook  ... and wait for acknowledge
    dhcpDone = epicsEventMustCreate(epicsEventEmpty);
    rtems_dhcpcd_add_hook(&dhcpcd_hook);

    // wait for dhcp done ... should be if SYNCDHCP is used
    epicsEventWaitStatus stat;
    int counter = 10;
    do {
        printf("\n ---- Wait for DHCP done ...\n");
        stat = epicsEventWaitWithTimeout(dhcpDone, 5.0);
    } while ((stat == epicsEventWaitTimeout) && (--counter > 0));
    if (stat == epicsEventOK)
        epicsEventDestroy(dhcpDone);
    else
        printf("\n ---- dhcpDone Event Unknown state %d\n", stat);
…

static void
default_network_dhcpcd(void)
{
        static const char default_cfg[] = "clientid FHI test client\n";
        rtems_status_code sc;
        int fd;
        int rv;
        ssize_t n;
fd = open("/etc/dhcpcd.conf", O_CREAT | O_WRONLY,
    S_IRWXU | S_IRWXG | S_IRWXO);
assert(fd >= 0);

n = write(fd, default_cfg, sizeof(default_cfg) - 1);
assert(n == (ssize_t) sizeof(default_cfg) - 1);


static const char fhi_cfg[] = "nodhcp6\nipv4only\noption ntp_servers\noption rtems_cmdline\n";

n = write(fd, fhi_cfg, sizeof(fhi_cfg) - 1);
assert(n == (ssize_t) sizeof(fhi_cfg) - 1);

rv = close(fd);
assert(rv == 0);

sc = rtems_dhcpcd_start(NULL);
assert(sc == RTEMS_SUCCESSFUL);
}

static void
dhcpcd_hook_handler(rtems_dhcpcd_hook *hook, char *const *env)
{
int bound = 0;
char iName[16];
char *name;
char *value;

        (void)hook;

        while (*env != NULL) {
                name = strtok(*env,"=");
                value = strtok(NULL,"=");
        printf("all out ---> %s = %s\n", name, value);
                if (!strncmp(name, "interface", 9) && !strcmp(value,  NET_CFG_INTERFACE_0))
                         strncpy(iName, value, 16);
                if (!strncmp(name, "reason", 6) && !strncmp(value, "BOUND", 5)){
                  printf ("Interface %s bounded\n", iName);
                  bound = 1;
                }
                if (bound) {
                  // as there is no ntp-support in rtems-libbsd, we call our own client
                  if(!strncmp(name, "new_ntp_servers", 15))
                    strcpy(rtemsInit_NTP_server_ip,value);
                  if(!strncmp(name, "new_host_name", 13))
                    sethostname (value, strlen (value));
                  if(!strncmp(name, "new_tftp_server_name", 20)){
                    printf(" new_tftp_server_name : %s\n", value);
                    strncpy(rtems_bsdnet_bootp_server_name,value, sizeof(bootp_server_name_init));
                  }

                  printf("---> %s = %s\n", name, value);
                }
                ++env;
        }
if (bound)
  epicsEventSignal(dhcpDone);
}

static rtems_dhcpcd_hook dhcpcd_hook = {
        .name = "ioc boot",
        .handler = dhcpcd_hook_handler
};

But the biggest problem here is that on the test-CI-system (travis, appveyor, etc.) a dhcp-server, 
ntp-server, nfs-server and complex routing structures for e.g. qemu must be provided. 
There it is easier to use environment variables.

Many greetings
Heinz 


> On 9. Aug 2020, at 02:44, Chris Johns <chrisj at rtems.org> wrote:
> 
>> nging configuration. And likely only one NIC.
> 
> Agreed and it works for a testsuite to some extent. Network tests are hard
> because you need a very controlled network set up to make then work.
> 
>> It was used in the network demos for the legacy stack so if we want to
>> eliminate it completely, it would be good to find a recommended way to
>> look up the interface name and put it into the legacy configuration
>> tables.
>> 
>> https://git.rtems.org/network-demos/tree  
>> 
>> Yes... I know we all want to see it removed and everyone move to
>> libbsd. But I don't think that is realistic to expect. The more realistic
>> solution is to move it to its own build tree and freeze it. It is there
>> and we encourage people to use libbsd. But it does offer a solution
>> for older target boards. The old stack is also all that is supported by
>> many EPICS boards. Outside of EPICS users, even the SPARC BSPs 
>> haven't been converted yet.
> 
> Yes we should move it out of the main tree and have it becomes an available
> optional package. It can be maintained by those with an active interest in it.
> 
> It has some bugs ... we found one last year with the arp cache and Windows. The
> solution was a hack to set the arp aging timer to a very large number.
> 
>> Anyway... I'd love to see RTEMS_BSP_NETWORK_DRIVER_NAME
>> killed completely but we need to address filling in the legacy network
>> stack table before the stack is initialized enough to even know the 
>> interface names.
> 
> Yes, but Heinz is working on libbsd support for EPICS or have I missed something?
> 
>> Perhaps this turns into an application provided method for the legacy
>> stack? Just a thought.
> 
> Yes that works.
> 
> Chris

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2542 bytes
Desc: not available
URL: <http://lists.rtems.org/pipermail/devel/attachments/20200809/410d34d3/attachment.bin>


More information about the devel mailing list