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

📄 ipripng_daemon.c

📁 这是最新的vxWorks6.7协议栈下的RIPng(rip over ipv6)实现
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright 2006 Wind River Systems, Inc. * * The right to copy, distribute, modify or otherwise make use * of this software may be licensed only pursuant to the terms * of an applicable Wind River license agreement. *//*modification history--------------------01c,24jan07,tlu  Fix gnu compile warning01b,17nov06,tlu  Define the stack size for the RIPng task and reset daemon_started 		 to IP_FALSE at function ripngStop()01a,12jun06,tlu  Initial creation*//* **************************************************************************** * 1                    DESCRIPTION **************************************************************************** *//* **************************************************************************** * 2                    CONFIGURATION **************************************************************************** *//* **************************************************************************** * 3                    INCLUDE FILES **************************************************************************** */#define IPCOM_USE_CLIB_PROTO#include <ipcom_type.h>#include <ipcom_cstyle.h>#include <ipcom_clib.h>#include <ipcom_err.h>#include <ipcom_os.h>#include <ipcom_sock.h>#include <ipcom_sock2.h>#include <ipcom_inet.h>#include <ipcom_syslog.h>#include <ipcom_ipd.h>#include <ipcom_errno.h>#include <ipnet_config.h>#include <ipnet.h>#include <ipnet_cmd.h>#include <ipnet_h.h>#include <ipnet_ip6.h>#include "ipripng.h"#include "ipripng_constant.h"/* **************************************************************************** * 4                    DEFINES **************************************************************************** */#ifndef IPNET#error IPRIPNG_REQUIRES_IPNET#endif#define IPNET_IF_LOOPBACK_INDEX    1       /* The index of the loopback interface */#define RIPTASKSTACK    20000		   /* RIPng task stack size *//* **************************************************************************** * 5                    TYPES **************************************************************************** *//* **************************************************************************** * 6                    EXTERN PROTOTYPES **************************************************************************** *//* **************************************************************************** * 7                    LOCAL PROTOTYPES **************************************************************************** */IP_STATIC Ip_err ipripng_write(Ip_fd udp_fd, void *cookie, Ip_u32 ipaddr_n, Ipcom_sock_addr *dest, void *buf, Ip_size_t len);IP_STATIC Ip_err ipripng_add_route_rtsock(Ipripng_rt *rrt, const struct in6_addr *gw, struct ifc *ifcp);IP_STATIC Ip_err ipripng_delete_route_rtsock(struct netinfo6 *np, const struct in6_addr *gw, Ip_bool proto_set);IPCOM_PROCESS(ipripngd);IP_PUBLIC Ip_err ipripng_create(void);/* **************************************************************************** * 8                    DATA **************************************************************************** */IP_STATIC Ip_bool daemon_started = IP_FALSE;IP_PUBLIC Ip_bool ripngStopFlag;IP_PUBLIC char ripng_cmdString[IPRIPNG_MAXARGS + 2];IP_STATIC int priv_ripng_seq;#if IPRIP_SYSLOG_PRIORITY >= IPCOM_LOG_DEBUG2IP_STATIC Ipnet_cmd_int_str_map iprip_rtm_map[] ={    { IPNET_RTM_ADD,       "ADD" },    { IPNET_RTM_DELETE,    "DELETE" },    { IPNET_RTM_CHANGE,    "CHANGE" },    { IPNET_RTM_GET,       "GET" },    { IPNET_RTM_LOOSING,   "LOOSING" },    { IPNET_RTM_REDIRECT,  "REDIRECT" },    { IPNET_RTM_MISS,      "MISS" },    { IPNET_RTM_LOCK,      "LOCK" },    { IPNET_RTM_RESOLVE,   "RESOLVE" },    { IPNET_RTM_NEWADDR,   "NEWADDR" },    { IPNET_RTM_DELADDR,   "DELADDR" },    { IPNET_RTM_IFINFO,    "IFINFO" },    { -1, IP_NULL }};IP_STATIC Ipnet_cmd_int_str_map iprip_rta_map[] ={    { IPNET_RTAX_DST,      "DST" },    { IPNET_RTAX_GATEWAY,  "GATEWAY" },    { IPNET_RTAX_NETMASK,  "NETMASK" },    { IPNET_RTAX_GENMASK,  "GENMASK" },    { IPNET_RTAX_IFP,      "IFP" },    { IPNET_RTAX_IFA,      "IFA" },    { IPNET_RTAX_AUTHOR,   "AUTHOR" },    { IPNET_RTAX_BRD,      "BRD" },    { -1, IP_NULL }};#endif/* **************************************************************************** * 9                    LOCAL FUNCTIONS **************************************************************************** *//* *=========================================================================== *                         ipripng_rtsock_add *=========================================================================== * Description: * Parameters: * Returns: * */IP_STATIC Ip_erripripng_rtsock_add(Ipripng_rt *rrt, const struct in6_addr *gw, struct ifc *ifcp){    struct  netinfo6 *np;    Ip_u8   buffer[IP_BUFSIZ], buf1[IP_INET6_ADDRSTRLEN], buf2[IP_INET6_ADDRSTRLEN];    struct  Ipnet_rt_msghdr   *rtm;    struct  Ip_sockaddr_in6    *sin;    int len;    char    buf3[IP_INET6_ADDRSTRLEN];    Ip_fd ripng_rtsock;    np = &rrt->rrt_info;    if (ipcom_inet_ntop(IP_AF_INET6, (void *)gw, (char *)buf1, sizeof(buf1)) == IP_NULL)        buf1[0] = '\0'; /* So doesn't display garbage */    if (ipcom_inet_ntop(IP_AF_INET6, (void *)&ifcp->ifc_mylladdr, (char *)buf2, sizeof(buf2)) == IP_NULL)        buf2[0] = '\0'; /* So doesn't display garbage */    if (ipcom_inet_ntop(IP_AF_INET6, &(np->rip6_dest), buf3, sizeof (buf3)) == IP_NULL)        buf3[0] = '\0'; /* So doesn't display garbage */    IPCOM_LOG5(INFO, "ADD: %s/%d gw %s [%d] ifa %s",         buf3, np->rip6_plen, buf1,        np->rip6_metric - 1, buf2);    if (ipripng_nflag())        return 0;    memset(buffer, 0, sizeof(buffer));    rtm = (struct Ipnet_rt_msghdr *)buffer;    rtm->rtm_type = IPNET_RTM_ADD;    rtm->rtm_version = IPNET_RTM_VERSION;    rtm->rtm_seq = ++priv_ripng_seq;    rtm->rtm_pid = ipcom_getpid();    rtm->rtm_flags = rrt->rrt_flags;    if ((rtm->rtm_flags & IPNET_RTF_HOST) == 0)        rtm->rtm_addrs = IPNET_RTA_DST | IPNET_RTA_GATEWAY | IPNET_RTA_NETMASK;    else        rtm->rtm_addrs = IPNET_RTA_DST | IPNET_RTA_GATEWAY;    rtm->rtm_rmx.rmx_hopcount = np->rip6_metric - 1;    rtm->rtm_inits = IPNET_RTV_HOPCOUNT;    sin = (struct Ip_sockaddr_in6 *)&buffer[sizeof(struct Ipnet_rt_msghdr)];    /* Destination */    sin->sin6_len = sizeof(struct Ip_sockaddr_in6);    sin->sin6_family = IP_AF_INET6;    sin->sin6_addr = np->rip6_dest;    RT_PROTO_SET (sin, M2_ipRouteProto_rip);    TOS_SET (sin, 0);    sin = (struct Ip_sockaddr_in6 *)((char *)sin + ROUNDUP(sin->sin6_len));    /* Gateway */    sin->sin6_len = sizeof(struct Ip_sockaddr_in6);    sin->sin6_family = IP_AF_INET6;    sin->sin6_addr = *gw;    sin = (struct Ip_sockaddr_in6 *)((char *)sin + ROUNDUP(sin->sin6_len));    if ((rtm->rtm_flags & IPNET_RTF_HOST) == 0)        {        /* Netmask */        sin->sin6_len = sizeof(struct Ip_sockaddr_in6);        sin->sin6_family = IP_AF_INET6;        sin->sin6_addr = *(plen2mask(np->rip6_plen));        sin = (struct Ip_sockaddr_in6 *)((char *)sin + ROUNDUP(sin->sin6_len));        }    len = (char *)sin - (char *)buffer;    rtm->rtm_msglen = len;    ripng_rtsock = ipripng_rtsocket();    if (ipcom_socketwrite(ripng_rtsock, (char *)buffer, len) > 0)        return IPCOM_SUCCESS;    if (ipcom_errno == IP_ERRNO_EEXIST) {        IPCOM_LOG3(WARNING, "ADD: Route already exists %s/%d gw %s",            buf3, np->rip6_plen, buf1);    } else {        IPCOM_LOG1(WARNING, "Can not write to ripng_rtsock (addroute): %s",            ipcom_strerror(ipcom_errno));    }    return IPCOM_ERR_FAILED;}/* *=========================================================================== *                         ipripng_rtsock_del *=========================================================================== * Description: * Parameters: * Returns: * */IP_STATIC Ip_erripripng_rtsock_del(struct netinfo6 *np, const struct in6_addr *gw, Ip_bool proto_set){    Ip_u8  buf[IP_BUFSIZ], buf2[IP_INET6_ADDRSTRLEN];    struct  Ipnet_rt_msghdr   *rtm;    struct  Ip_sockaddr_in6    *sin;    int len;    char    buf3[IP_INET6_ADDRSTRLEN];    Ip_fd ripng_rtsock;    if (ipcom_inet_ntop(IP_AF_INET6, (void *)gw, (char *)buf2, sizeof(buf2)) == IP_NULL)        buf2[0] = '\0'; /* So doesn't display garbage */    if (ipcom_inet_ntop(IP_AF_INET6, &np->rip6_dest, buf3, sizeof (buf3)) == IP_NULL)        buf3[0] = '\0'; /* So doesn't display garbage */    IPCOM_LOG3(INFO, "DEL: %s/%d gw %s", buf3,        np->rip6_plen, buf2);    if (ipripng_nflag())        return 0;    memset(buf, 0, sizeof(buf));    rtm = (struct Ipnet_rt_msghdr *)buf;    rtm->rtm_type = IPNET_RTM_DELETE;    rtm->rtm_version = IPNET_RTM_VERSION;    rtm->rtm_seq = ++priv_ripng_seq;    rtm->rtm_pid = ipcom_getpid();    rtm->rtm_flags = IPNET_RTF_UP | IPNET_RTF_GATEWAY;    if (np->rip6_plen == sizeof(struct in6_addr) * 8)        {        rtm->rtm_flags |= IPNET_RTF_HOST;        rtm->rtm_addrs = IPNET_RTA_DST | IPNET_RTA_GATEWAY;        }    else        rtm->rtm_addrs = IPNET_RTA_DST | IPNET_RTA_GATEWAY | IPNET_RTA_NETMASK;    sin = (struct Ip_sockaddr_in6 *)&buf[sizeof(struct Ipnet_rt_msghdr)];    /* Destination */    sin->sin6_len = sizeof(struct Ip_sockaddr_in6);    sin->sin6_family = IP_AF_INET6;    sin->sin6_addr = np->rip6_dest;    if (proto_set)        {        RT_PROTO_SET (sin, M2_ipRouteProto_rip);        TOS_SET (sin, 0);        }    sin = (struct Ip_sockaddr_in6 *)((char *)sin + ROUNDUP(sin->sin6_len));    /* Gateway */    sin->sin6_len = sizeof(struct Ip_sockaddr_in6);    sin->sin6_family = IP_AF_INET6;    sin->sin6_addr = *gw;    sin = (struct Ip_sockaddr_in6 *)((char *)sin + ROUNDUP(sin->sin6_len));    if ((rtm->rtm_flags & IPNET_RTF_HOST) == 0)        {        /* Netmask */        sin->sin6_len = sizeof(struct Ip_sockaddr_in6);        sin->sin6_family = IP_AF_INET6;        sin->sin6_addr = *(plen2mask(np->rip6_plen));        sin = (struct Ip_sockaddr_in6 *)((char *)sin + ROUNDUP(sin->sin6_len));        }    len = (char *)sin - (char *)buf;    rtm->rtm_msglen = len;    ripng_rtsock = ipripng_rtsocket();    if (ipcom_socketwrite(ripng_rtsock, (char *)buf, len) >= 0)        return IPCOM_SUCCESS;    if (ipcom_errno == IP_ERRNO_ESRCH) {        IPCOM_LOG3(WARNING, "RTDEL: Route does not exist: %s/%d gw %s",            buf3, np->rip6_plen, buf2);    } else {        IPCOM_LOG1(WARNING, "Can not write to ripng_rtsock (delroute): %s",            ipcom_strerror(ipcom_errno));    }    return IPCOM_ERR_FAILED;}/* *=========================================================================== *                         iprip_add_route_rtsock *=========================================================================== * Description: * Parameters: * Returns: * */IP_STATIC Ip_erripripng_add_route_rtsock(Ipripng_rt *rrt, const struct in6_addr *gw, struct ifc *ifcp){    return ipripng_rtsock_add(rrt, gw, ifcp);}/* *=========================================================================== *                         ipripng_delete_route_rtsock *=========================================================================== * Description: * Parameters: * Returns: * */IP_STATIC Ip_erripripng_delete_route_rtsock(struct netinfo6 *np, const struct in6_addr *gw, Ip_bool proto_set){    return ipripng_rtsock_del(np, gw, proto_set);}/* *=========================================================================== *                    ipripng_write *=========================================================================== * Description: * Parameters: * Returns: * */IP_STATIC Ip_erripripng_write(Ip_fd udp_fd, void *cookie, Ip_u32 ipaddr_n, Ipcom_sock_addr *dest, void *buf, Ip_size_t len){    (void)cookie;    /* success. */    return 0;}/* *=========================================================================== *                    ipripngd *=========================================================================== * Description: RIPng daemon * Parameters: * Returns: * */IPCOM_PROCESS(ipripngd){    Ip_err ret;    Ipripng_open conf;    struct  ifc *ifcp;    Ip_bool ipripng_init_ok = IP_FALSE;    Ip_bool ipripng_open_ok = IP_FALSE;    Ip_u32 num, max;    Ip_fd udp_fd = IP_INVALID_SOCKET;    Ip_fd rt_fd = IP_INVALID_SOCKET;    Ip_fd_set  read_set, fds;    Ip_fd  ipd_fd = IP_INVALID_SOCKET;    struct Ip_timeval tv, *ptv = IP_NULL;    ipcom_proc_init();    IPCOM_LOG0(INFO, "ipripngd :: starting");    daemon_started = IP_TRUE;    ripngStopFlag = IP_FALSE;

⌨️ 快捷键说明

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