Changeset 6f93bb4 in rtems


Ignore:
Timestamp:
06/14/00 17:18:18 (22 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, 5, master
Children:
32e2554
Parents:
ec6968b
Message:

Patch from Chris Johns <cjohns@…> to enhance network
initialization. This adds an interface which makes it easier to
control the BSD stack from user code. The BSD stack initialise uses
it. It is a sort of `function' interface for an ifconfig
command.

I also added support for attaching and removing interfaces. With hot
swap PCI comming online support for hot swap PCI will be an important
factor in "state of art" RTOS's. This is also part of a general move on
my part to allow RTEMS to be configured at runtime by calls rather than
table driven at initialisation.

Files:
6 edited

Legend:

Unmodified
Added
Removed
  • c/src/exec/libnetworking/rtems/rtems_bsdnet.h

    rec6968b r6f93bb4  
    6969struct rtems_bsdnet_ifconfig {
    7070        /*
    71          * These two entries must be supplied for each interface.
     71         * These three entries must be supplied for each interface.
    7272         */
    7373        char            *name;
    74         int             (*attach)(struct rtems_bsdnet_ifconfig *conf);
     74
     75        /*
     76         * This function now handles attaching and detaching an interface.
     77         * The parameter attaching indicates the operation being invoked.
     78         * For older attach functions which do not have the extra parameter
     79         * it will be ignored.
     80         */
     81        int             (*attach)(struct rtems_bsdnet_ifconfig *conf, int attaching);
    7582
    7683        /*
     
    133140        char                    *ntp_server[3];         /* BOOTP        */
    134141};
     142
     143/*
     144 * Default global device configuration structure. This is scanned
     145 * by the initialize network function. Check the network demo's for
     146 * an example of the structure. Like the RTEMS configuration tables,
     147 * they are not part of RTEMS but part of your application or bsp
     148 * code.
     149 */
    135150extern struct rtems_bsdnet_config rtems_bsdnet_config;
     151
     152/*
     153 * Initialise the BSD stack, attach and `up' interfaces
     154 * in the `rtems_bsdnet_config'. RTEMS must already be initialised.
     155 */
    136156int rtems_bsdnet_initialize_network (void);
     157
     158/*
     159 * Dynamic interface control. Drivers must free any resources such as
     160 * memory, interrupts, io regions claimed during the `attach' and/or
     161 * `up' operations when asked to `detach'.
     162 * You must configure the interface after attaching it.
     163 */
     164void rtems_bsdnet_attach (struct rtems_bsdnet_ifconfig *ifconfig);
     165void rtems_bsdnet_detach (struct rtems_bsdnet_ifconfig *ifconfig);
     166
     167/*
     168 * Interface configuration. The commands are listed in `sys/sockio.h'.
     169 */
     170int rtems_bsdnet_ifconfig (const char *ifname, unsigned32 cmd, void *param);
     171
    137172void rtems_bsdnet_do_bootp (void);
    138173int rtems_bsdnet_synchronize_ntp (int interval, rtems_task_priority priority);
  • c/src/exec/libnetworking/rtems/rtems_glue.c

    rec6968b r6f93bb4  
    739739{
    740740        struct rtems_bsdnet_ifconfig *ifp;
    741         int s;
    742         struct ifreq ifreq;
     741        short flags;
    743742        struct sockaddr_in address;
    744743        struct sockaddr_in netmask;
     
    778777         * Configure interfaces
    779778         */
    780         s = socket (AF_INET, SOCK_DGRAM, 0);
    781         if (s < 0) {
    782                 printf ("Can't create initial socket: %s\n", strerror (errno));
    783                 return -1;
    784         }
    785779        for (ifp = rtems_bsdnet_config.ifconfig ; ifp ; ifp = ifp->next) {
    786780                if (ifp->ip_address == NULL)
     
    788782
    789783                /*
    790                  * Get the interface flags
    791                  */
    792                 strcpy (ifreq.ifr_name, ifp->name);
    793                 if (ioctl (s, SIOCGIFFLAGS, &ifreq) < 0) {
    794                         printf ("Can't get %s flags: %s\n", ifp->name, strerror (errno));
    795                         return -1;
    796                 }
    797 
    798                 /*
    799784                 * Bring interface up
    800785                 */
    801                 ifreq.ifr_flags |= IFF_UP;
    802                 if (ioctl (s, SIOCSIFFLAGS, &ifreq) < 0) {
     786                flags = IFF_UP;
     787                if (rtems_bsdnet_ifconfig (ifp->name, SIOCSIFFLAGS, &flags) < 0) {
    803788                        printf ("Can't bring %s up: %s\n", ifp->name, strerror (errno));
    804                         return -1;
     789                        continue;
    805790                }
    806791
     
    812797                netmask.sin_family = AF_INET;
    813798                netmask.sin_addr.s_addr = inet_addr (ifp->ip_netmask);
    814                 memcpy (&ifreq.ifr_addr, &netmask, sizeof netmask);
    815                 if (ioctl (s, SIOCSIFNETMASK, &ifreq) < 0) {
     799                if (rtems_bsdnet_ifconfig (ifp->name, SIOCSIFNETMASK, &netmask) < 0) {
    816800                        printf ("Can't set %s netmask: %s\n", ifp->name, strerror (errno));
    817                         return -1;
     801                        continue;
    818802                }
    819803
     
    825809                address.sin_family = AF_INET;
    826810                address.sin_addr.s_addr = inet_addr (ifp->ip_address);
    827                 memcpy (&ifreq.ifr_addr, &address, sizeof address);
    828                 if (ioctl (s, SIOCSIFADDR, &ifreq) < 0) {
     811                if (rtems_bsdnet_ifconfig (ifp->name, SIOCSIFADDR, &address) < 0) {
    829812                        printf ("Can't set %s address: %s\n", ifp->name, strerror (errno));
    830                         return -1;
     813                        continue;
    831814                }
    832815
    833816                /*
    834                  * Set interface broadcast address
     817                 * Set interface broadcast address if the interface has the
     818                 * broadcast flag set.
    835819                 */
    836                 memset (&broadcast, '\0', sizeof broadcast);
    837                 broadcast.sin_len = sizeof broadcast;
    838                 broadcast.sin_family = AF_INET;
    839                 broadcast.sin_addr.s_addr = address.sin_addr.s_addr | ~netmask.sin_addr.s_addr;
    840                 memcpy (&ifreq.ifr_broadaddr, &broadcast, sizeof broadcast);
    841                 if (ioctl (s, SIOCSIFBRDADDR, &ifreq) < 0)
    842                         printf ("Can't set %s broadcast address: %s\n", ifp->name, strerror (errno));
    843         }
    844 
    845         /*
    846          * We're done with the dummy socket
    847          */
    848         close (s);
     820                if (rtems_bsdnet_ifconfig (ifp->name, SIOCGIFFLAGS, &flags) < 0) {
     821                        printf ("Can't read %s flags: %s\n", ifp->name, strerror (errno));
     822                        continue;
     823                }
     824                if (flags & IFF_BROADCAST) {
     825                        memset (&broadcast, '\0', sizeof broadcast);
     826                        broadcast.sin_len = sizeof broadcast;
     827                        broadcast.sin_family = AF_INET;
     828                        broadcast.sin_addr.s_addr =
     829                                        address.sin_addr.s_addr | ~netmask.sin_addr.s_addr;
     830                        if (rtems_bsdnet_ifconfig (ifp->name, SIOCSIFBRDADDR, &broadcast) < 0) {
     831                                struct in_addr in_addr;
     832                                in_addr.s_addr = broadcast.sin_addr.s_addr;
     833                                printf ("Can't set %s broadcast address %s: %s\n",
     834                                        ifp->name, inet_ntoa (in_addr), strerror (errno));
     835                        }
     836                }
     837        }
    849838
    850839        /*
     
    890879         */
    891880        for (ifp = rtems_bsdnet_config.ifconfig ; ifp ; ifp = ifp->next) {
    892                 rtems_bsdnet_semaphore_obtain ();
    893                 (ifp->attach)(ifp);
    894                 rtems_bsdnet_semaphore_release ();
     881                rtems_bsdnet_attach (ifp);
    895882        }
    896883
     
    903890                (*rtems_bsdnet_config.bootp)();
    904891        return 0;
     892}
     893
     894/*
     895 * Attach a network interface.
     896 */
     897void rtems_bsdnet_attach (struct rtems_bsdnet_ifconfig *ifp)
     898{
     899        if (ifp) {
     900                rtems_bsdnet_semaphore_obtain ();
     901                (ifp->attach)(ifp, 1);
     902                rtems_bsdnet_semaphore_release ();
     903        }
     904}
     905
     906/*
     907 * Detach a network interface.
     908 */
     909void rtems_bsdnet_detach (struct rtems_bsdnet_ifconfig *ifp)
     910{
     911        if (ifp) {
     912                rtems_bsdnet_semaphore_obtain ();
     913                (ifp->attach)(ifp, 0);
     914                rtems_bsdnet_semaphore_release ();
     915        }
     916}
     917
     918/*
     919 * Interface Configuration.
     920 */
     921int rtems_bsdnet_ifconfig (const char *ifname, unsigned32 cmd, void *param)
     922{
     923        int s, r = 0;
     924        struct ifreq ifreq;
     925
     926        /*
     927         * Configure interfaces
     928         */
     929        s = socket (AF_INET, SOCK_DGRAM, 0);
     930        if (s < 0)
     931                return -1;
     932
     933        strncpy (ifreq.ifr_name, ifname, IFNAMSIZ);
     934
     935        rtems_bsdnet_semaphore_obtain ();
     936
     937        switch (cmd) {
     938                case SIOCSIFADDR:
     939                case SIOCSIFNETMASK:
     940                        memcpy (&ifreq.ifr_addr, param, sizeof (struct sockaddr));
     941                        r = ioctl (s, cmd, &ifreq);
     942                        break;
     943
     944                case OSIOCGIFADDR:
     945                case SIOCGIFADDR:
     946                case OSIOCGIFNETMASK:
     947                case SIOCGIFNETMASK:
     948                        if ((r = ioctl (s, cmd, &ifreq)) < 0)
     949                                break;
     950                        memcpy (param, &ifreq.ifr_addr, sizeof (struct sockaddr));
     951                        break;
     952
     953                case SIOCGIFFLAGS:
     954                case SIOCSIFFLAGS:
     955                        if ((r = ioctl (s, SIOCGIFFLAGS, &ifreq)) < 0)
     956                                break;
     957                        if (cmd == SIOCGIFFLAGS) {
     958                                *((short*) param) = ifreq.ifr_flags;
     959                                break;
     960                        }
     961                        ifreq.ifr_flags |= *((short*) param);
     962                        r = ioctl (s, SIOCSIFFLAGS, &ifreq);
     963                        break;
     964
     965                case SIOCSIFDSTADDR:
     966                        memcpy (&ifreq.ifr_dstaddr, param, sizeof (struct sockaddr));
     967                        r = ioctl (s, cmd, &ifreq);
     968                        break;
     969
     970                case OSIOCGIFDSTADDR:
     971                case SIOCGIFDSTADDR:
     972                        if ((r = ioctl (s, cmd, &ifreq)) < 0)
     973                                break;
     974                        memcpy (param, &ifreq.ifr_dstaddr, sizeof (struct sockaddr));
     975                        break;
     976
     977                case SIOCSIFBRDADDR:
     978                        memcpy (&ifreq.ifr_broadaddr, param, sizeof (struct sockaddr));
     979                        r = ioctl (s, cmd, &ifreq);
     980                        break;
     981
     982                case OSIOCGIFBRDADDR:
     983                case SIOCGIFBRDADDR:
     984                        if ((r = ioctl (s, cmd, &ifreq)) < 0)
     985                                break;
     986                        memcpy (param, &ifreq.ifr_broadaddr, sizeof (struct sockaddr));
     987                        break;
     988
     989                case SIOCSIFMETRIC:
     990                        ifreq.ifr_metric = *((int*) param);
     991                        r = ioctl (s, cmd, &ifreq);
     992                        break;
     993
     994                case SIOCGIFMETRIC:
     995                        if ((r = ioctl (s, cmd, &ifreq)) < 0)
     996                                break;
     997                        *((int*) param) = ifreq.ifr_metric;
     998                        break;
     999
     1000                case SIOCSIFMTU:
     1001                        ifreq.ifr_mtu = *((int*) param);
     1002                        r = ioctl (s, cmd, &ifreq);
     1003                        break;
     1004
     1005                case SIOCGIFMTU:
     1006                        if ((r = ioctl (s, cmd, &ifreq)) < 0)
     1007                                break;
     1008                        *((int*) param) = ifreq.ifr_mtu;
     1009                        break;
     1010
     1011                case SIOCSIFPHYS:
     1012                        ifreq.ifr_phys = *((int*) param);
     1013                        r = ioctl (s, cmd, &ifreq);
     1014                        break;
     1015
     1016                case SIOCGIFPHYS:
     1017                        if ((r = ioctl (s, cmd, &ifreq)) < 0)
     1018                                break;
     1019                        *((int*) param) = ifreq.ifr_phys;
     1020                        break;
     1021
     1022                case SIOCSIFMEDIA:
     1023                        ifreq.ifr_media = *((int*) param);
     1024                        r = ioctl (s, cmd, &ifreq);
     1025                        break;
     1026
     1027                case SIOCGIFMEDIA:
     1028                        if ((r = ioctl (s, cmd, &ifreq)) < 0)
     1029                                break;
     1030                        *((int*) param) = ifreq.ifr_media;
     1031                        break; 
     1032                       
     1033                default:
     1034                        errno = EOPNOTSUPP;
     1035                        r = -1;
     1036                        break;
     1037        }
     1038
     1039        rtems_bsdnet_semaphore_release ();
     1040
     1041        close (s);
     1042        return r;
    9051043}
    9061044
  • c/src/libnetworking/rtems/rtems_bsdnet.h

    rec6968b r6f93bb4  
    6969struct rtems_bsdnet_ifconfig {
    7070        /*
    71          * These two entries must be supplied for each interface.
     71         * These three entries must be supplied for each interface.
    7272         */
    7373        char            *name;
    74         int             (*attach)(struct rtems_bsdnet_ifconfig *conf);
     74
     75        /*
     76         * This function now handles attaching and detaching an interface.
     77         * The parameter attaching indicates the operation being invoked.
     78         * For older attach functions which do not have the extra parameter
     79         * it will be ignored.
     80         */
     81        int             (*attach)(struct rtems_bsdnet_ifconfig *conf, int attaching);
    7582
    7683        /*
     
    133140        char                    *ntp_server[3];         /* BOOTP        */
    134141};
     142
     143/*
     144 * Default global device configuration structure. This is scanned
     145 * by the initialize network function. Check the network demo's for
     146 * an example of the structure. Like the RTEMS configuration tables,
     147 * they are not part of RTEMS but part of your application or bsp
     148 * code.
     149 */
    135150extern struct rtems_bsdnet_config rtems_bsdnet_config;
     151
     152/*
     153 * Initialise the BSD stack, attach and `up' interfaces
     154 * in the `rtems_bsdnet_config'. RTEMS must already be initialised.
     155 */
    136156int rtems_bsdnet_initialize_network (void);
     157
     158/*
     159 * Dynamic interface control. Drivers must free any resources such as
     160 * memory, interrupts, io regions claimed during the `attach' and/or
     161 * `up' operations when asked to `detach'.
     162 * You must configure the interface after attaching it.
     163 */
     164void rtems_bsdnet_attach (struct rtems_bsdnet_ifconfig *ifconfig);
     165void rtems_bsdnet_detach (struct rtems_bsdnet_ifconfig *ifconfig);
     166
     167/*
     168 * Interface configuration. The commands are listed in `sys/sockio.h'.
     169 */
     170int rtems_bsdnet_ifconfig (const char *ifname, unsigned32 cmd, void *param);
     171
    137172void rtems_bsdnet_do_bootp (void);
    138173int rtems_bsdnet_synchronize_ntp (int interval, rtems_task_priority priority);
  • c/src/libnetworking/rtems/rtems_glue.c

    rec6968b r6f93bb4  
    739739{
    740740        struct rtems_bsdnet_ifconfig *ifp;
    741         int s;
    742         struct ifreq ifreq;
     741        short flags;
    743742        struct sockaddr_in address;
    744743        struct sockaddr_in netmask;
     
    778777         * Configure interfaces
    779778         */
    780         s = socket (AF_INET, SOCK_DGRAM, 0);
    781         if (s < 0) {
    782                 printf ("Can't create initial socket: %s\n", strerror (errno));
    783                 return -1;
    784         }
    785779        for (ifp = rtems_bsdnet_config.ifconfig ; ifp ; ifp = ifp->next) {
    786780                if (ifp->ip_address == NULL)
     
    788782
    789783                /*
    790                  * Get the interface flags
    791                  */
    792                 strcpy (ifreq.ifr_name, ifp->name);
    793                 if (ioctl (s, SIOCGIFFLAGS, &ifreq) < 0) {
    794                         printf ("Can't get %s flags: %s\n", ifp->name, strerror (errno));
    795                         return -1;
    796                 }
    797 
    798                 /*
    799784                 * Bring interface up
    800785                 */
    801                 ifreq.ifr_flags |= IFF_UP;
    802                 if (ioctl (s, SIOCSIFFLAGS, &ifreq) < 0) {
     786                flags = IFF_UP;
     787                if (rtems_bsdnet_ifconfig (ifp->name, SIOCSIFFLAGS, &flags) < 0) {
    803788                        printf ("Can't bring %s up: %s\n", ifp->name, strerror (errno));
    804                         return -1;
     789                        continue;
    805790                }
    806791
     
    812797                netmask.sin_family = AF_INET;
    813798                netmask.sin_addr.s_addr = inet_addr (ifp->ip_netmask);
    814                 memcpy (&ifreq.ifr_addr, &netmask, sizeof netmask);
    815                 if (ioctl (s, SIOCSIFNETMASK, &ifreq) < 0) {
     799                if (rtems_bsdnet_ifconfig (ifp->name, SIOCSIFNETMASK, &netmask) < 0) {
    816800                        printf ("Can't set %s netmask: %s\n", ifp->name, strerror (errno));
    817                         return -1;
     801                        continue;
    818802                }
    819803
     
    825809                address.sin_family = AF_INET;
    826810                address.sin_addr.s_addr = inet_addr (ifp->ip_address);
    827                 memcpy (&ifreq.ifr_addr, &address, sizeof address);
    828                 if (ioctl (s, SIOCSIFADDR, &ifreq) < 0) {
     811                if (rtems_bsdnet_ifconfig (ifp->name, SIOCSIFADDR, &address) < 0) {
    829812                        printf ("Can't set %s address: %s\n", ifp->name, strerror (errno));
    830                         return -1;
     813                        continue;
    831814                }
    832815
    833816                /*
    834                  * Set interface broadcast address
     817                 * Set interface broadcast address if the interface has the
     818                 * broadcast flag set.
    835819                 */
    836                 memset (&broadcast, '\0', sizeof broadcast);
    837                 broadcast.sin_len = sizeof broadcast;
    838                 broadcast.sin_family = AF_INET;
    839                 broadcast.sin_addr.s_addr = address.sin_addr.s_addr | ~netmask.sin_addr.s_addr;
    840                 memcpy (&ifreq.ifr_broadaddr, &broadcast, sizeof broadcast);
    841                 if (ioctl (s, SIOCSIFBRDADDR, &ifreq) < 0)
    842                         printf ("Can't set %s broadcast address: %s\n", ifp->name, strerror (errno));
    843         }
    844 
    845         /*
    846          * We're done with the dummy socket
    847          */
    848         close (s);
     820                if (rtems_bsdnet_ifconfig (ifp->name, SIOCGIFFLAGS, &flags) < 0) {
     821                        printf ("Can't read %s flags: %s\n", ifp->name, strerror (errno));
     822                        continue;
     823                }
     824                if (flags & IFF_BROADCAST) {
     825                        memset (&broadcast, '\0', sizeof broadcast);
     826                        broadcast.sin_len = sizeof broadcast;
     827                        broadcast.sin_family = AF_INET;
     828                        broadcast.sin_addr.s_addr =
     829                                        address.sin_addr.s_addr | ~netmask.sin_addr.s_addr;
     830                        if (rtems_bsdnet_ifconfig (ifp->name, SIOCSIFBRDADDR, &broadcast) < 0) {
     831                                struct in_addr in_addr;
     832                                in_addr.s_addr = broadcast.sin_addr.s_addr;
     833                                printf ("Can't set %s broadcast address %s: %s\n",
     834                                        ifp->name, inet_ntoa (in_addr), strerror (errno));
     835                        }
     836                }
     837        }
    849838
    850839        /*
     
    890879         */
    891880        for (ifp = rtems_bsdnet_config.ifconfig ; ifp ; ifp = ifp->next) {
    892                 rtems_bsdnet_semaphore_obtain ();
    893                 (ifp->attach)(ifp);
    894                 rtems_bsdnet_semaphore_release ();
     881                rtems_bsdnet_attach (ifp);
    895882        }
    896883
     
    903890                (*rtems_bsdnet_config.bootp)();
    904891        return 0;
     892}
     893
     894/*
     895 * Attach a network interface.
     896 */
     897void rtems_bsdnet_attach (struct rtems_bsdnet_ifconfig *ifp)
     898{
     899        if (ifp) {
     900                rtems_bsdnet_semaphore_obtain ();
     901                (ifp->attach)(ifp, 1);
     902                rtems_bsdnet_semaphore_release ();
     903        }
     904}
     905
     906/*
     907 * Detach a network interface.
     908 */
     909void rtems_bsdnet_detach (struct rtems_bsdnet_ifconfig *ifp)
     910{
     911        if (ifp) {
     912                rtems_bsdnet_semaphore_obtain ();
     913                (ifp->attach)(ifp, 0);
     914                rtems_bsdnet_semaphore_release ();
     915        }
     916}
     917
     918/*
     919 * Interface Configuration.
     920 */
     921int rtems_bsdnet_ifconfig (const char *ifname, unsigned32 cmd, void *param)
     922{
     923        int s, r = 0;
     924        struct ifreq ifreq;
     925
     926        /*
     927         * Configure interfaces
     928         */
     929        s = socket (AF_INET, SOCK_DGRAM, 0);
     930        if (s < 0)
     931                return -1;
     932
     933        strncpy (ifreq.ifr_name, ifname, IFNAMSIZ);
     934
     935        rtems_bsdnet_semaphore_obtain ();
     936
     937        switch (cmd) {
     938                case SIOCSIFADDR:
     939                case SIOCSIFNETMASK:
     940                        memcpy (&ifreq.ifr_addr, param, sizeof (struct sockaddr));
     941                        r = ioctl (s, cmd, &ifreq);
     942                        break;
     943
     944                case OSIOCGIFADDR:
     945                case SIOCGIFADDR:
     946                case OSIOCGIFNETMASK:
     947                case SIOCGIFNETMASK:
     948                        if ((r = ioctl (s, cmd, &ifreq)) < 0)
     949                                break;
     950                        memcpy (param, &ifreq.ifr_addr, sizeof (struct sockaddr));
     951                        break;
     952
     953                case SIOCGIFFLAGS:
     954                case SIOCSIFFLAGS:
     955                        if ((r = ioctl (s, SIOCGIFFLAGS, &ifreq)) < 0)
     956                                break;
     957                        if (cmd == SIOCGIFFLAGS) {
     958                                *((short*) param) = ifreq.ifr_flags;
     959                                break;
     960                        }
     961                        ifreq.ifr_flags |= *((short*) param);
     962                        r = ioctl (s, SIOCSIFFLAGS, &ifreq);
     963                        break;
     964
     965                case SIOCSIFDSTADDR:
     966                        memcpy (&ifreq.ifr_dstaddr, param, sizeof (struct sockaddr));
     967                        r = ioctl (s, cmd, &ifreq);
     968                        break;
     969
     970                case OSIOCGIFDSTADDR:
     971                case SIOCGIFDSTADDR:
     972                        if ((r = ioctl (s, cmd, &ifreq)) < 0)
     973                                break;
     974                        memcpy (param, &ifreq.ifr_dstaddr, sizeof (struct sockaddr));
     975                        break;
     976
     977                case SIOCSIFBRDADDR:
     978                        memcpy (&ifreq.ifr_broadaddr, param, sizeof (struct sockaddr));
     979                        r = ioctl (s, cmd, &ifreq);
     980                        break;
     981
     982                case OSIOCGIFBRDADDR:
     983                case SIOCGIFBRDADDR:
     984                        if ((r = ioctl (s, cmd, &ifreq)) < 0)
     985                                break;
     986                        memcpy (param, &ifreq.ifr_broadaddr, sizeof (struct sockaddr));
     987                        break;
     988
     989                case SIOCSIFMETRIC:
     990                        ifreq.ifr_metric = *((int*) param);
     991                        r = ioctl (s, cmd, &ifreq);
     992                        break;
     993
     994                case SIOCGIFMETRIC:
     995                        if ((r = ioctl (s, cmd, &ifreq)) < 0)
     996                                break;
     997                        *((int*) param) = ifreq.ifr_metric;
     998                        break;
     999
     1000                case SIOCSIFMTU:
     1001                        ifreq.ifr_mtu = *((int*) param);
     1002                        r = ioctl (s, cmd, &ifreq);
     1003                        break;
     1004
     1005                case SIOCGIFMTU:
     1006                        if ((r = ioctl (s, cmd, &ifreq)) < 0)
     1007                                break;
     1008                        *((int*) param) = ifreq.ifr_mtu;
     1009                        break;
     1010
     1011                case SIOCSIFPHYS:
     1012                        ifreq.ifr_phys = *((int*) param);
     1013                        r = ioctl (s, cmd, &ifreq);
     1014                        break;
     1015
     1016                case SIOCGIFPHYS:
     1017                        if ((r = ioctl (s, cmd, &ifreq)) < 0)
     1018                                break;
     1019                        *((int*) param) = ifreq.ifr_phys;
     1020                        break;
     1021
     1022                case SIOCSIFMEDIA:
     1023                        ifreq.ifr_media = *((int*) param);
     1024                        r = ioctl (s, cmd, &ifreq);
     1025                        break;
     1026
     1027                case SIOCGIFMEDIA:
     1028                        if ((r = ioctl (s, cmd, &ifreq)) < 0)
     1029                                break;
     1030                        *((int*) param) = ifreq.ifr_media;
     1031                        break; 
     1032                       
     1033                default:
     1034                        errno = EOPNOTSUPP;
     1035                        r = -1;
     1036                        break;
     1037        }
     1038
     1039        rtems_bsdnet_semaphore_release ();
     1040
     1041        close (s);
     1042        return r;
    9051043}
    9061044
  • cpukit/libnetworking/rtems/rtems_bsdnet.h

    rec6968b r6f93bb4  
    6969struct rtems_bsdnet_ifconfig {
    7070        /*
    71          * These two entries must be supplied for each interface.
     71         * These three entries must be supplied for each interface.
    7272         */
    7373        char            *name;
    74         int             (*attach)(struct rtems_bsdnet_ifconfig *conf);
     74
     75        /*
     76         * This function now handles attaching and detaching an interface.
     77         * The parameter attaching indicates the operation being invoked.
     78         * For older attach functions which do not have the extra parameter
     79         * it will be ignored.
     80         */
     81        int             (*attach)(struct rtems_bsdnet_ifconfig *conf, int attaching);
    7582
    7683        /*
     
    133140        char                    *ntp_server[3];         /* BOOTP        */
    134141};
     142
     143/*
     144 * Default global device configuration structure. This is scanned
     145 * by the initialize network function. Check the network demo's for
     146 * an example of the structure. Like the RTEMS configuration tables,
     147 * they are not part of RTEMS but part of your application or bsp
     148 * code.
     149 */
    135150extern struct rtems_bsdnet_config rtems_bsdnet_config;
     151
     152/*
     153 * Initialise the BSD stack, attach and `up' interfaces
     154 * in the `rtems_bsdnet_config'. RTEMS must already be initialised.
     155 */
    136156int rtems_bsdnet_initialize_network (void);
     157
     158/*
     159 * Dynamic interface control. Drivers must free any resources such as
     160 * memory, interrupts, io regions claimed during the `attach' and/or
     161 * `up' operations when asked to `detach'.
     162 * You must configure the interface after attaching it.
     163 */
     164void rtems_bsdnet_attach (struct rtems_bsdnet_ifconfig *ifconfig);
     165void rtems_bsdnet_detach (struct rtems_bsdnet_ifconfig *ifconfig);
     166
     167/*
     168 * Interface configuration. The commands are listed in `sys/sockio.h'.
     169 */
     170int rtems_bsdnet_ifconfig (const char *ifname, unsigned32 cmd, void *param);
     171
    137172void rtems_bsdnet_do_bootp (void);
    138173int rtems_bsdnet_synchronize_ntp (int interval, rtems_task_priority priority);
  • cpukit/libnetworking/rtems/rtems_glue.c

    rec6968b r6f93bb4  
    739739{
    740740        struct rtems_bsdnet_ifconfig *ifp;
    741         int s;
    742         struct ifreq ifreq;
     741        short flags;
    743742        struct sockaddr_in address;
    744743        struct sockaddr_in netmask;
     
    778777         * Configure interfaces
    779778         */
    780         s = socket (AF_INET, SOCK_DGRAM, 0);
    781         if (s < 0) {
    782                 printf ("Can't create initial socket: %s\n", strerror (errno));
    783                 return -1;
    784         }
    785779        for (ifp = rtems_bsdnet_config.ifconfig ; ifp ; ifp = ifp->next) {
    786780                if (ifp->ip_address == NULL)
     
    788782
    789783                /*
    790                  * Get the interface flags
    791                  */
    792                 strcpy (ifreq.ifr_name, ifp->name);
    793                 if (ioctl (s, SIOCGIFFLAGS, &ifreq) < 0) {
    794                         printf ("Can't get %s flags: %s\n", ifp->name, strerror (errno));
    795                         return -1;
    796                 }
    797 
    798                 /*
    799784                 * Bring interface up
    800785                 */
    801                 ifreq.ifr_flags |= IFF_UP;
    802                 if (ioctl (s, SIOCSIFFLAGS, &ifreq) < 0) {
     786                flags = IFF_UP;
     787                if (rtems_bsdnet_ifconfig (ifp->name, SIOCSIFFLAGS, &flags) < 0) {
    803788                        printf ("Can't bring %s up: %s\n", ifp->name, strerror (errno));
    804                         return -1;
     789                        continue;
    805790                }
    806791
     
    812797                netmask.sin_family = AF_INET;
    813798                netmask.sin_addr.s_addr = inet_addr (ifp->ip_netmask);
    814                 memcpy (&ifreq.ifr_addr, &netmask, sizeof netmask);
    815                 if (ioctl (s, SIOCSIFNETMASK, &ifreq) < 0) {
     799                if (rtems_bsdnet_ifconfig (ifp->name, SIOCSIFNETMASK, &netmask) < 0) {
    816800                        printf ("Can't set %s netmask: %s\n", ifp->name, strerror (errno));
    817                         return -1;
     801                        continue;
    818802                }
    819803
     
    825809                address.sin_family = AF_INET;
    826810                address.sin_addr.s_addr = inet_addr (ifp->ip_address);
    827                 memcpy (&ifreq.ifr_addr, &address, sizeof address);
    828                 if (ioctl (s, SIOCSIFADDR, &ifreq) < 0) {
     811                if (rtems_bsdnet_ifconfig (ifp->name, SIOCSIFADDR, &address) < 0) {
    829812                        printf ("Can't set %s address: %s\n", ifp->name, strerror (errno));
    830                         return -1;
     813                        continue;
    831814                }
    832815
    833816                /*
    834                  * Set interface broadcast address
     817                 * Set interface broadcast address if the interface has the
     818                 * broadcast flag set.
    835819                 */
    836                 memset (&broadcast, '\0', sizeof broadcast);
    837                 broadcast.sin_len = sizeof broadcast;
    838                 broadcast.sin_family = AF_INET;
    839                 broadcast.sin_addr.s_addr = address.sin_addr.s_addr | ~netmask.sin_addr.s_addr;
    840                 memcpy (&ifreq.ifr_broadaddr, &broadcast, sizeof broadcast);
    841                 if (ioctl (s, SIOCSIFBRDADDR, &ifreq) < 0)
    842                         printf ("Can't set %s broadcast address: %s\n", ifp->name, strerror (errno));
    843         }
    844 
    845         /*
    846          * We're done with the dummy socket
    847          */
    848         close (s);
     820                if (rtems_bsdnet_ifconfig (ifp->name, SIOCGIFFLAGS, &flags) < 0) {
     821                        printf ("Can't read %s flags: %s\n", ifp->name, strerror (errno));
     822                        continue;
     823                }
     824                if (flags & IFF_BROADCAST) {
     825                        memset (&broadcast, '\0', sizeof broadcast);
     826                        broadcast.sin_len = sizeof broadcast;
     827                        broadcast.sin_family = AF_INET;
     828                        broadcast.sin_addr.s_addr =
     829                                        address.sin_addr.s_addr | ~netmask.sin_addr.s_addr;
     830                        if (rtems_bsdnet_ifconfig (ifp->name, SIOCSIFBRDADDR, &broadcast) < 0) {
     831                                struct in_addr in_addr;
     832                                in_addr.s_addr = broadcast.sin_addr.s_addr;
     833                                printf ("Can't set %s broadcast address %s: %s\n",
     834                                        ifp->name, inet_ntoa (in_addr), strerror (errno));
     835                        }
     836                }
     837        }
    849838
    850839        /*
     
    890879         */
    891880        for (ifp = rtems_bsdnet_config.ifconfig ; ifp ; ifp = ifp->next) {
    892                 rtems_bsdnet_semaphore_obtain ();
    893                 (ifp->attach)(ifp);
    894                 rtems_bsdnet_semaphore_release ();
     881                rtems_bsdnet_attach (ifp);
    895882        }
    896883
     
    903890                (*rtems_bsdnet_config.bootp)();
    904891        return 0;
     892}
     893
     894/*
     895 * Attach a network interface.
     896 */
     897void rtems_bsdnet_attach (struct rtems_bsdnet_ifconfig *ifp)
     898{
     899        if (ifp) {
     900                rtems_bsdnet_semaphore_obtain ();
     901                (ifp->attach)(ifp, 1);
     902                rtems_bsdnet_semaphore_release ();
     903        }
     904}
     905
     906/*
     907 * Detach a network interface.
     908 */
     909void rtems_bsdnet_detach (struct rtems_bsdnet_ifconfig *ifp)
     910{
     911        if (ifp) {
     912                rtems_bsdnet_semaphore_obtain ();
     913                (ifp->attach)(ifp, 0);
     914                rtems_bsdnet_semaphore_release ();
     915        }
     916}
     917
     918/*
     919 * Interface Configuration.
     920 */
     921int rtems_bsdnet_ifconfig (const char *ifname, unsigned32 cmd, void *param)
     922{
     923        int s, r = 0;
     924        struct ifreq ifreq;
     925
     926        /*
     927         * Configure interfaces
     928         */
     929        s = socket (AF_INET, SOCK_DGRAM, 0);
     930        if (s < 0)
     931                return -1;
     932
     933        strncpy (ifreq.ifr_name, ifname, IFNAMSIZ);
     934
     935        rtems_bsdnet_semaphore_obtain ();
     936
     937        switch (cmd) {
     938                case SIOCSIFADDR:
     939                case SIOCSIFNETMASK:
     940                        memcpy (&ifreq.ifr_addr, param, sizeof (struct sockaddr));
     941                        r = ioctl (s, cmd, &ifreq);
     942                        break;
     943
     944                case OSIOCGIFADDR:
     945                case SIOCGIFADDR:
     946                case OSIOCGIFNETMASK:
     947                case SIOCGIFNETMASK:
     948                        if ((r = ioctl (s, cmd, &ifreq)) < 0)
     949                                break;
     950                        memcpy (param, &ifreq.ifr_addr, sizeof (struct sockaddr));
     951                        break;
     952
     953                case SIOCGIFFLAGS:
     954                case SIOCSIFFLAGS:
     955                        if ((r = ioctl (s, SIOCGIFFLAGS, &ifreq)) < 0)
     956                                break;
     957                        if (cmd == SIOCGIFFLAGS) {
     958                                *((short*) param) = ifreq.ifr_flags;
     959                                break;
     960                        }
     961                        ifreq.ifr_flags |= *((short*) param);
     962                        r = ioctl (s, SIOCSIFFLAGS, &ifreq);
     963                        break;
     964
     965                case SIOCSIFDSTADDR:
     966                        memcpy (&ifreq.ifr_dstaddr, param, sizeof (struct sockaddr));
     967                        r = ioctl (s, cmd, &ifreq);
     968                        break;
     969
     970                case OSIOCGIFDSTADDR:
     971                case SIOCGIFDSTADDR:
     972                        if ((r = ioctl (s, cmd, &ifreq)) < 0)
     973                                break;
     974                        memcpy (param, &ifreq.ifr_dstaddr, sizeof (struct sockaddr));
     975                        break;
     976
     977                case SIOCSIFBRDADDR:
     978                        memcpy (&ifreq.ifr_broadaddr, param, sizeof (struct sockaddr));
     979                        r = ioctl (s, cmd, &ifreq);
     980                        break;
     981
     982                case OSIOCGIFBRDADDR:
     983                case SIOCGIFBRDADDR:
     984                        if ((r = ioctl (s, cmd, &ifreq)) < 0)
     985                                break;
     986                        memcpy (param, &ifreq.ifr_broadaddr, sizeof (struct sockaddr));
     987                        break;
     988
     989                case SIOCSIFMETRIC:
     990                        ifreq.ifr_metric = *((int*) param);
     991                        r = ioctl (s, cmd, &ifreq);
     992                        break;
     993
     994                case SIOCGIFMETRIC:
     995                        if ((r = ioctl (s, cmd, &ifreq)) < 0)
     996                                break;
     997                        *((int*) param) = ifreq.ifr_metric;
     998                        break;
     999
     1000                case SIOCSIFMTU:
     1001                        ifreq.ifr_mtu = *((int*) param);
     1002                        r = ioctl (s, cmd, &ifreq);
     1003                        break;
     1004
     1005                case SIOCGIFMTU:
     1006                        if ((r = ioctl (s, cmd, &ifreq)) < 0)
     1007                                break;
     1008                        *((int*) param) = ifreq.ifr_mtu;
     1009                        break;
     1010
     1011                case SIOCSIFPHYS:
     1012                        ifreq.ifr_phys = *((int*) param);
     1013                        r = ioctl (s, cmd, &ifreq);
     1014                        break;
     1015
     1016                case SIOCGIFPHYS:
     1017                        if ((r = ioctl (s, cmd, &ifreq)) < 0)
     1018                                break;
     1019                        *((int*) param) = ifreq.ifr_phys;
     1020                        break;
     1021
     1022                case SIOCSIFMEDIA:
     1023                        ifreq.ifr_media = *((int*) param);
     1024                        r = ioctl (s, cmd, &ifreq);
     1025                        break;
     1026
     1027                case SIOCGIFMEDIA:
     1028                        if ((r = ioctl (s, cmd, &ifreq)) < 0)
     1029                                break;
     1030                        *((int*) param) = ifreq.ifr_media;
     1031                        break; 
     1032                       
     1033                default:
     1034                        errno = EOPNOTSUPP;
     1035                        r = -1;
     1036                        break;
     1037        }
     1038
     1039        rtems_bsdnet_semaphore_release ();
     1040
     1041        close (s);
     1042        return r;
    9051043}
    9061044
Note: See TracChangeset for help on using the changeset viewer.