⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 support.c

📁 eCos操作系统源码
💻 C
📖 第 1 页 / 共 3 页
字号:
static voidcyg_netint(cyg_addrword_t param){    cyg_flag_value_t curisr;    int lvl, spl;    while (true) {        curisr = cyg_flag_wait(&netint_flags, NETISR_ANY,                                CYG_FLAG_WAITMODE_OR|CYG_FLAG_WAITMODE_CLR);        spl = splsoftnet(); // Prevent any overlapping "stack" processing        for (lvl = NETISR_MIN;  lvl <= NETISR_MAX;  lvl++) {            if (curisr & (1<<lvl)) {                CYG_ASSERT(_netisr_handlers[lvl] != 0, "unregistered netisr handler");                (*_netisr_handlers[lvl])();            }        }        splx(spl);    }}// This just sets one of the pseudo-ISR bits used above.voidsetsoftnet(void){    // This is called if we are out of MBUFs - it doesn't do anything, and    // that situation is handled OK, so don't bother with the diagnostic:    // diag_printf("setsoftnet\n");    // No need to do this because it is ignored anyway:    // schednetisr(NETISR_SOFTNET);}/* Update the kernel globel ktime. */static void cyg_ktime_func(cyg_handle_t alarm,cyg_addrword_t data){    cyg_tick_count_t now = cyg_current_time();    ktime.tv_usec = (now % hz) * tick;    ktime.tv_sec = 1 + now / hz;}static voidcyg_ktime_init(void){    cyg_handle_t ktime_alarm_handle;    static cyg_alarm ktime_alarm;    cyg_handle_t counter;    // Do not start at 0 - net stack thinks 0 an invalid time;    // Have a valid time available from right now:    ktime.tv_usec = 0;    ktime.tv_sec = 1;    cyg_clock_to_counter(cyg_real_time_clock(),&counter);    cyg_alarm_create(counter,                     cyg_ktime_func,                     0,                     &ktime_alarm_handle,                     &ktime_alarm);    /* We want one alarm every 10ms. */    cyg_alarm_initialize(ktime_alarm_handle,cyg_current_time()+1,1);    cyg_alarm_enable(ktime_alarm_handle);}intcyg_ticks(void){    cyg_tick_count_t now = cyg_current_time();    return (int)now;}//// Network initialization//   This function is called during system initialization to setup the whole// networking environment.// Linker magic to execute this function as 'init'extern void cyg_do_net_init(void);extern void ifinit(void);extern void loopattach(int);extern void bridgeattach(int);// Internal init functions:extern void cyg_alarm_timeout_init(void);extern void cyg_tsleep_init(void);static voidcyg_net_init_devs(void *ignored){    cyg_netdevtab_entry_t *t;    // Initialize all network devices    for (t = &__NETDEVTAB__[0]; t != &__NETDEVTAB_END__; t++) {        log(LOG_INIT, "Init device '%s'\n", t->name);        if (t->init(t)) {            t->status = CYG_NETDEVTAB_STATUS_AVAIL;        } else {            // What to do if device init fails?            t->status = 0;  // Device not [currently] available        }    }#if 0  // Bridge code not available yet#if NBRIDGE > 0    bridgeattach(0);#endif#endif}SYSINIT(devs, SI_SUB_DEVICES, SI_ORDER_FIRST, cyg_net_init_devs, NULL)voidcyg_net_init(void){    static int _init = false;    struct init_tab_entry *init_entry;#ifdef CYGPKG_NET_FORCE_SERIAL_CONSOLE    int orig_console =        CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT);#endif    if (_init) return;#ifdef CYGPKG_NET_FORCE_SERIAL_CONSOLE    // Force default serial console during system initialization    // This avoids problems with debug messages occurring while the    // networking subsystem is being setup.    CYGACC_CALL_IF_SET_CONSOLE_COMM(0);#endif    cyg_do_net_init();  // Just forces linking in the initializer/constructor    // Initialize interrupt "flags"    cyg_flag_init(&netint_flags);    // Initialize timeouts and net service thread (pseudo-DSRs)    cyg_alarm_timeout_init();    // Initialize tsleep/wakeup support    cyg_tsleep_init();    // Initialize network memory system    cyg_kmem_init();    // Initialize network time    cyg_ktime_init();    // Create network background thread    cyg_thread_create(CYGPKG_NET_THREAD_PRIORITY, // Priority                      cyg_netint,               // entry                      0,                        // entry parameter                      "Network support",        // Name                      &netint_stack[0],         // Stack                      STACK_SIZE,               // Size                      &netint_thread_handle,    // Handle                      &netint_thread_data       // Thread data structure        );    cyg_thread_resume(netint_thread_handle);    // Start it    // Run through dynamic initializers    for (init_entry = __NET_INIT_TAB__; init_entry != &__NET_INIT_TAB_END__;  init_entry++) {        log(LOG_INIT, "[%s] Init: %s(%p)\n", __FUNCTION__, init_entry->name, init_entry->data);        (*init_entry->fun)(init_entry->data);    }    log(LOG_INIT, "[%s] Done\n", __FUNCTION__);    // Done    _init = true;#ifdef CYGPKG_NET_FORCE_SERIAL_CONSOLE    // Revert to the original console, which might be a network connection    CYGACC_CALL_IF_SET_CONSOLE_COMM(orig_console);#endif}#include <net/if.h>#include <net/netdb.h>#include <net/route.h>externC void if_indextoname(int indx, char *buf, int len);typedef void pr_fun(char *fmt, ...);static void_mask(struct sockaddr *sa, char *buf, int _len){    unsigned char *cp = ((char *)sa) + 4;    int len = sa->sa_len - 4;    int tot = 0;    while (len-- > 0) {        if (tot) *buf++ = '.';        buf += diag_sprintf(buf, "%u", *cp++);        tot++;    }    while (tot < 4) {        if (tot) *buf++ = '.';        buf += diag_sprintf(buf, "%d", 0);        tot++;    }}#ifdef CYGPKG_NET_INET6static void_mask6(struct sockaddr *sa, char *buf, int _len){  struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa;  int addrword = 0;  int bits = 0;  int index;  while (addrword < 4) {    if (sin6->sin6_addr.s6_addr32[addrword] == 0) {      break;    }    HAL_LSBIT_INDEX(index, sin6->sin6_addr.s6_addr32[addrword++]);    bits += (32-index);    if (index != 0) {      break;    }  }  diag_sprintf(buf, "%d", bits);}#endifstatic void_show_ifp(struct ifnet *ifp, pr_fun *pr){    struct ifaddr *ifa;    char name[64], addr[64], netmask[64], broadcast[64];    if_indextoname(ifp->if_index, name, 64);    TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {        if (ifa->ifa_addr->sa_family != AF_LINK) {	    (*pr)("%-8s", name);            getnameinfo (ifa->ifa_addr, ifa->ifa_addr->sa_len, addr,                          sizeof(addr), 0, 0, NI_NUMERICHOST);	    if (ifa->ifa_addr->sa_family == AF_INET) {	      getnameinfo (ifa->ifa_dstaddr, ifa->ifa_dstaddr->sa_len,                            broadcast, sizeof(broadcast),                            0, 0, NI_NUMERICHOST);	      _mask(ifa->ifa_netmask, netmask, 64);	      (*pr)("IP: %s, Broadcast: %s, Netmask: %s\n",                     addr, broadcast, netmask);	    }#ifdef CYGPKG_NET_INET6             if (ifa->ifa_addr->sa_family == AF_INET6) {              struct in6_ifaddr * ifa6 = (struct in6_ifaddr *) ifa;              _mask6(ifa->ifa_netmask, netmask, 64);              (*pr)("IP: %s/%s   ", addr,netmask);              if (ifa6->ia6_flags & IN6_IFF_ANYCAST) (*pr) ("Anycast ");              if (ifa6->ia6_flags & IN6_IFF_TENTATIVE) (*pr) ("Tentative ");              if (ifa6->ia6_flags & IN6_IFF_DUPLICATED) (*pr) ("Duplicate ");              if (ifa6->ia6_flags & IN6_IFF_DETACHED) (*pr) ("Detached ");              if (ifa6->ia6_flags & IN6_IFF_DEPRECATED) (*pr) ("Deprecated ");              if (ifa6->ia6_flags & IN6_IFF_NODAD) (*pr) ("NoDAD ");              if (ifa6->ia6_flags & IN6_IFF_AUTOCONF) (*pr) ("AutoConf ");              if (ifa6->ia6_flags & IN6_IFF_TEMPORARY) (*pr) ("Tempory ");              if (ifa6->ia6_flags & IN6_IFF_HOME) (*pr) ("Home ");              (*pr) ("\n");            }#endif            (*pr)("        ");            if ((ifp->if_flags & IFF_UP)) (*pr)("UP ");            if ((ifp->if_flags & IFF_BROADCAST)) (*pr)("BROADCAST ");            if ((ifp->if_flags & IFF_LOOPBACK)) (*pr)("LOOPBACK ");            if ((ifp->if_flags & IFF_RUNNING)) (*pr)("RUNNING ");            if ((ifp->if_flags & IFF_PROMISC)) (*pr)("PROMISC ");            if ((ifp->if_flags & IFF_MULTICAST)) (*pr)("MULTICAST ");            if ((ifp->if_flags & IFF_ALLMULTI)) (*pr)("ALLMULTI ");            (*pr)("MTU: %d, Metric: %d\n", ifp->if_mtu, ifp->if_metric);            (*pr)("        Rx - Packets: %d, Bytes: %d",                   ifa->if_data.ifi_ipackets, ifa->if_data.ifi_ibytes);            (*pr)(", Tx - Packets: %d, Bytes: %d\n",                   ifa->if_data.ifi_opackets, ifa->if_data.ifi_obytes);        }    }}static int_dumpentry(struct radix_node *rn, void *vw){    struct rtentry *rt = (struct rtentry *)rn;    struct sockaddr *dst, *gate, *netmask, *genmask;    char addr[64], *cp;    pr_fun *pr = (pr_fun *)vw;    dst = rt_key(rt);    gate = rt->rt_gateway;    netmask = rt_mask(rt);    genmask = rt->rt_genmask;    if ((rt->rt_flags & (RTF_UP | RTF_WASCLONED)) == RTF_UP) {        _inet_ntop(dst, addr, sizeof(addr));        (*pr)("%-15s ", addr);        if (gate != NULL) {            _inet_ntop(gate, addr, sizeof(addr));            (*pr)("%-15s ", addr);        } else {            (*pr)("%-15s ", " ");        }        if (netmask != NULL) {	    if (dst->sa_family == AF_INET) {                _mask(netmask, addr, sizeof(addr));                (*pr)("%-15s ", addr);	    } #ifdef CYGPKG_NET_INET6	    if (dst->sa_family == AF_INET6) {	      _mask6(netmask, addr, sizeof(addr));	      (*pr)("/%-14s ", addr);	    }#endif        } else {            (*pr)("%-15s ", " ");        }        cp = addr;        if ((rt->rt_flags & RTF_UP)) *cp++ = 'U';        if ((rt->rt_flags & RTF_GATEWAY)) *cp++ = 'G';	if ((rt->rt_flags & RTF_HOST)) *cp++ = 'H';	if ((rt->rt_flags & RTF_REJECT)) *cp++ = '!';        if ((rt->rt_flags & RTF_STATIC)) *cp++ = 'S';        if ((rt->rt_flags & RTF_DYNAMIC)) *cp++ = 'D';	if ((rt->rt_flags & RTF_MODIFIED)) *cp++ = 'M';        *cp = '\0';        (*pr)("%-8s ", addr);  // Flags        if_indextoname(rt->rt_ifp->if_index, addr, 64);        (*pr)("%-8s ", addr);        (*pr)("\n");    }    return 0;}voidshow_network_tables(pr_fun *pr){    int i, error;    struct radix_node_head *rnh;    struct ifnet *ifp;    cyg_scheduler_lock();    (*pr)("Routing tables\n");    (*pr)("Destination     Gateway         Mask            Flags    Interface\n");    for (i = 1; i <= AF_MAX; i++) {        if ((rnh = rt_tables[i]) != NULL) {            error = rnh->rnh_walktree(rnh, _dumpentry, pr);        }    }    (*pr)("Interface statistics\n");    for (ifp = ifnet.tqh_first; ifp; ifp = ifp->if_link.tqe_next) {        _show_ifp(ifp, pr);    }    cyg_scheduler_unlock();}#endif // CYGPKG_NET_DRIVER_FRAMEWORK// EOF support.c

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -