Changeset 58c4e1c5 in rtems-libbsd


Ignore:
Timestamp:
Jun 10, 2016, 12:11:40 PM (3 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
647dd08ae2aa69b935c2847ea450fb824322ecae, freebsd-9.3, c6261f97870562d4c797cfb1ff1ba0affb85a916
Children:
d6ad59d
Parents:
4464594
git-author:
Sebastian Huber <sebastian.huber@…> (06/10/16 12:11:40)
git-committer:
Sebastian Huber <sebastian.huber@…> (06/10/16 12:15:02)
Message:

nfsclient: Port to LibBSD

Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • libbsd.py

    r4464594 r58c4e1c5  
    111111            'mdns/mdns.c',
    112112            'mdns/mdns-hostname-default.c',
     113            'nfsclient/mount_prot_xdr.c',
     114            'nfsclient/nfs.c',
     115            'nfsclient/nfs_prot_xdr.c',
     116            'nfsclient/rpcio.c',
    113117            'pppd/auth.c',
    114118            'pppd/ccp.c',
     
    24972501def tests(mm):
    24982502    mod = builder.Module('tests')
     2503    mod.addTest(mm.generator['test']('nfs01', ['test_main'], netTest = True))
    24992504    mod.addTest(mm.generator['test']('foobarclient', ['test_main'],
    25002505                                     runTest = False, netTest = True))
  • libbsd_waf.py

    r4464594 r58c4e1c5  
    10191019              'rtemsbsd/mdns/mdns-hostname-default.c',
    10201020              'rtemsbsd/mdns/mdns.c',
     1021              'rtemsbsd/nfsclient/mount_prot_xdr.c',
     1022              'rtemsbsd/nfsclient/nfs.c',
     1023              'rtemsbsd/nfsclient/nfs_prot_xdr.c',
     1024              'rtemsbsd/nfsclient/rpcio.c',
    10211025              'rtemsbsd/pppd/auth.c',
    10221026              'rtemsbsd/pppd/ccp.c',
     
    13381342                install_path = None)
    13391343
     1344    test_nfs01 = ['testsuite/nfs01/test_main.c']
     1345    bld.program(target = "nfs01.exe",
     1346                features = "cprogram",
     1347                cflags = cflags,
     1348                includes = includes,
     1349                source = test_nfs01,
     1350                use = ["bsd"],
     1351                lib = ["m", "z"],
     1352                install_path = None)
     1353
    13401354    test_ping01 = ['testsuite/ping01/test_main.c']
    13411355    bld.program(target = "ping01.exe",
  • rtemsbsd/nfsclient/nfs.c

    r4464594 r58c4e1c5  
    8080#include <arpa/inet.h>
    8181
    82 #include <nfs_prot.h>
    83 #include <mount_prot.h>
     82#include "nfs_prot.h"
     83#include "mount_prot.h"
    8484
    8585#include "rpcio.h"
    86 #include "librtemsNfs.h"
     86#include <librtemsNfs.h>
    8787
    8888/* Configurable parameters */
  • rtemsbsd/nfsclient/rpcio.c

    r4464594 r58c4e1c5  
    7272#include <rtems.h>
    7373#include <rtems/error.h>
    74 #include <rtems/rtems_bsdnet.h>
     74#include <rtems/bsd/bsd.h>
    7575#include <stdlib.h>
    7676#include <time.h>
     
    8686#include <arpa/inet.h>
    8787#include <sys/cpuset.h>
     88#include <sys/event.h>
    8889
    8990#include "rpcio.h"
     
    9495/****************************************************************/
    9596
    96 #define MBUF_RX                 /* If defined: use mbuf XDR stream for
     97#undef MBUF_RX                  /* If defined: use mbuf XDR stream for
    9798                                                 *  decoding directly out of mbufs
    9899                                                 *  Otherwise, the regular 'recvfrom()'
     
    101102                                                 */
    102103
    103 #define MBUF_TX                 /* If defined: avoid copying data when
     104#undef MBUF_TX                  /* If defined: avoid copying data when
    104105                                                 *  sending. Instead, use a wrapper to
    105106                                                 *  'sosend()' which will point an MBUF
     
    122123
    123124/* daemon task parameters */
    124 #define RPCIOD_STACK            10000
    125 #define RPCIOD_PRIO                     100     /* *fallback* priority */
     125#define RPCIOD_NAME             "RPCD"
    126126
    127127/* depth of the message queue for sending
     
    150150                                                                                         * RESERVED
    151151                                                                                         */
    152 #define RPCIOD_RX_EVENT         RTEMS_EVENT_1   /* Events the RPCIOD is using/waiting for */
    153 #define RPCIOD_TX_EVENT         RTEMS_EVENT_2
    154 #define RPCIOD_KILL_EVENT       RTEMS_EVENT_3   /* send to the daemon to kill it          */
     152#define RPCIOD_KQ_IDENT         0xeb
     153#define RPCIOD_RX_EVENT         0x1     /* Events the RPCIOD is using/waiting for */
     154#define RPCIOD_TX_EVENT         0x2
     155#define RPCIOD_KILL_EVENT       0x4     /* send to the daemon to kill it          */
    155156
    156157#define LD_XACT_HASH            8                               /* ld of the size of the transaction hash table  */
     
    394395static int                              ourSock = -1;           /* the socket we are using for communication */
    395396static rtems_id                 rpciod  = 0;            /* task id of the RPC daemon                 */
     397static int                      rpcKq = -1;             /* the kqueue of the RPC daemon */
    396398static rtems_id                 msgQ    = 0;            /* message queue where the daemon picks up
    397399                                                                                         * requests
     
    407409                                                                                         * TO CHANGE)
    408410                                                                                         */
    409 
    410 rtems_task_priority             rpciodPriority = 0;
    411 #ifdef RTEMS_SMP
    412 const cpu_set_t                 *rpciodCpuset = 0;
    413 size_t                          rpciodCpusetSize = 0;
    414 #endif
    415411
    416412#if (DEBUG) & DEBUG_MALLOC
     
    482478
    483479static inline bool_t
    484 locked_refresh(RpcUdpServer s)
     480locked_refresh(RpcUdpServer s, struct rpc_msg *msg)
    485481{
    486482bool_t rval;
    487483        MU_LOCK(s->authlock);
    488         rval = AUTH_REFRESH(s->auth);
     484        rval = AUTH_REFRESH(s->auth, msg);
    489485        MU_UNLOCK(s->authlock);
    490486        return rval;
     487}
     488
     489static void
     490sendEventToRpcServer(u_int events)
     491{
     492struct kevent   trigger;
     493int             s;
     494
     495        EV_SET(
     496                &trigger,
     497                RPCIOD_KQ_IDENT,
     498                EVFILT_USER,
     499                0,
     500                NOTE_TRIGGER | NOTE_FFOR | events,
     501                0,
     502                0);
     503
     504        s = kevent(rpcKq, &trigger, 1, NULL, 0, NULL);
     505        assert(s == 0);
    491506}
    492507
     
    508523char                    hname[MAX_MACHINE_NAME + 1];
    509524int                             theuid, thegid;
    510 int                             thegids[NGRPS];
     525u_int                           thegids[NGRPS];
    511526gid_t                   gids[NGROUPS];
    512527int                             len,i;
     
    829844        }
    830845        /* wakeup the rpciod */
    831         ASSERT( RTEMS_SUCCESSFUL==rtems_event_send(rpciod, RPCIOD_TX_EVENT) );
     846        sendEventToRpcServer(RPCIOD_TX_EVENT);
    832847
    833848        return RPC_SUCCESS;
     
    912927#endif
    913928
    914         if (refresh && locked_refresh(xact->server)) {
     929        if (refresh && locked_refresh(xact->server, &reply_msg)) {
    915930                rtems_task_ident(RTEMS_SELF, RTEMS_WHO_AM_I, &xact->requestor);
    916931                if ( rtems_message_queue_send(msgQ, &xact, sizeof(xact)) ) {
     
    919934                /* wakeup the rpciod */
    920935                fprintf(stderr,"RPCIO INFO: refreshing my AUTH\n");
    921                 ASSERT( RTEMS_SUCCESSFUL==rtems_event_send(rpciod, RPCIOD_TX_EVENT) );
     936                sendEventToRpcServer(RPCIOD_TX_EVENT);
    922937        }
    923938
     
    925940
    926941        return xact->status.re_status;
    927 }
    928 
    929 
    930 /* On RTEMS, I'm told to avoid select(); this seems to
    931  * be more efficient
    932  */
    933 static void
    934 rxWakeupCB(struct socket *sock, void *arg)
    935 {
    936   rtems_id *rpciod = (rtems_id*) arg;
    937   rtems_event_send(*rpciod, RPCIOD_RX_EVENT);
    938942}
    939943
     
    956960rtems_status_code       status;
    957961int                     noblock = 1;
    958 struct sockwakeup       wkup;
     962struct kevent           change;
    959963
    960964        if (ourSock < 0) {
     
    973977                        MU_CREAT( &llock );
    974978
    975                         if ( !rpciodPriority ) {
    976                                 /* use configured networking priority */
    977                                 if ( ! (rpciodPriority = rtems_bsdnet_config.network_task_priority) )
    978                                         rpciodPriority = RPCIOD_PRIO;   /* fallback value */
    979                         }
     979                        rpcKq = kqueue();
     980                        assert( rpcKq >= 0 );
     981
     982                        EV_SET(
     983                                &change,
     984                                RPCIOD_KQ_IDENT,
     985                                EVFILT_USER, EV_ADD | EV_ENABLE | EV_CLEAR,
     986                                NOTE_FFNOP,
     987                                0,
     988                                0);
     989
     990                        s = kevent( rpcKq, &change, 1, NULL, 0, NULL );
     991                        assert( s == 0 );
     992
     993                        EV_SET(
     994                                &change,
     995                                ourSock,
     996                                EVFILT_READ, EV_ADD | EV_ENABLE,
     997                                0,
     998                                0,
     999                                0);
     1000
     1001                        s = kevent( rpcKq, &change, 1, NULL, 0, NULL );
     1002                        assert( s == 0 );
    9801003
    9811004                        status = rtems_task_create(
    9821005                                                                                        rtems_build_name('R','P','C','d'),
    983                                                                                         rpciodPriority,
    984                                                                                         RPCIOD_STACK,
     1006                                                                                        rtems_bsd_get_task_priority(RPCIOD_NAME),
     1007                                                                                        rtems_bsd_get_task_stack_size(RPCIOD_NAME),
    9851008                                                                                        RTEMS_DEFAULT_MODES,
    9861009                                                                                        /* fprintf saves/restores FP registers on PPC :-( */
     
    9891012                        assert( status == RTEMS_SUCCESSFUL );
    9901013
    991 #ifdef RTEMS_SMP
    992                         if ( rpciodCpuset == 0 ) {
    993                                 rpciodCpuset = rtems_bsdnet_config.network_task_cpuset;
    994                                 rpciodCpusetSize = rtems_bsdnet_config.network_task_cpuset_size;
    995                         }
    996                         if ( rpciodCpuset != 0 )
    997                                 rtems_task_set_affinity( rpciod, rpciodCpusetSize, rpciodCpuset );
    998 #endif
    999 
    1000                         wkup.sw_pfn = rxWakeupCB;
    1001                         wkup.sw_arg = &rpciod;
    1002                         assert( 0==setsockopt(ourSock, SOL_SOCKET, SO_RCVWAKEUP, &wkup, sizeof(wkup)) );
    10031014                        status = rtems_message_queue_create(
    10041015                                                                                        rtems_build_name('R','P','C','q'),
     
    10271038                        0,
    10281039                        &fini);
    1029         rtems_event_send(rpciod, RPCIOD_KILL_EVENT);
     1040        sendEventToRpcServer(RPCIOD_KILL_EVENT);
    10301041        /* synchronize with daemon */
    10311042        rtems_semaphore_obtain(fini, RTEMS_WAIT, 5*ticksPerSec);
     
    11761187rpcio_daemon(rtems_task_argument arg)
    11771188{
    1178 rtems_status_code stat;
    11791189RpcUdpXact        xact;
    11801190RpcUdpServer      srv;
    11811191rtems_interval    next_retrans, then, unow;
    11821192long                                            now;    /* need to do signed comparison with age! */
    1183 rtems_event_set   events;
     1193u_int             events;
    11841194ListNode          newList;
    11851195size_t            size;
     
    11941204
    11951205        for (next_retrans = epoch;;) {
    1196 
    1197                 if ( RTEMS_SUCCESSFUL !=
    1198                          (stat = rtems_event_receive(
    1199                                                 RPCIOD_RX_EVENT | RPCIOD_TX_EVENT | RPCIOD_KILL_EVENT,
    1200                                                 RTEMS_WAIT | RTEMS_EVENT_ANY,
    1201                                                 next_retrans,
    1202                                                 &events)) ) {
    1203                         ASSERT( RTEMS_TIMEOUT == stat );
     1206                {
     1207                        struct timespec timeout = {
     1208                                .tv_sec = (next_retrans + ticksPerSec - 1) / ticksPerSec,
     1209                                .tv_nsec = 0
     1210                        };
     1211                        struct kevent event[2];
     1212                        int i;
     1213                        int n;
     1214
     1215                        n = kevent(rpcKq, NULL, 0, &event[0], 2, &timeout);
     1216                        assert(n >= 0);
     1217
    12041218                        events = 0;
     1219
     1220                        for (i = 0; i < n; ++i) {
     1221                                if (event[i].filter == EVFILT_USER) {
     1222                                        events |= event[i].fflags;
     1223                                } else {
     1224                                        events |= RPCIOD_RX_EVENT;
     1225                                }
     1226                        }
    12051227                }
    12061228
     
    14991521        /* close our socket; shut down the receiver */
    15001522        close(ourSock);
     1523        close(rpcKq);
    15011524
    15021525#if 0 /* if we get here, no transactions exist, hence there can be none
     
    16261649 */
    16271650
    1628 #define _KERNEL
     1651#include <machine/rtems-bsd-kernel-space.h>
    16291652#include <sys/mbuf.h>
    16301653
     
    16881711        struct sockaddr     sa;
    16891712}                                       fromAddr;
    1690 int                                     fromLen  = sizeof(fromAddr.sin);
     1713socklen_t                               fromLen  = sizeof(fromAddr.sin);
    16911714RxBuf                           ibuf     = 0;
    16921715RpcUdpXact                      xact     = 0;
     
    18011824        return 0;
    18021825}
    1803 
    1804 
    1805 #include <rtems/rtems_bsdnet_internal.h>
    1806 /* double check the event configuration; should probably globally
    1807  * manage system events!!
    1808  * We do this at the end of the file for the same reason we had
    1809  * included mbuf.h only a couple of lines above - see comment up
    1810  * there...
    1811  */
    1812 #if RTEMS_RPC_EVENT & SOSLEEP_EVENT & SBWAIT_EVENT & NETISR_EVENTS
    1813 #error ILLEGAL EVENT CONFIGURATION
    1814 #endif
Note: See TracChangeset for help on using the changeset viewer.