Changeset 593904c in rtems


Ignore:
Timestamp:
Feb 11, 2003, 11:08:49 PM (18 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, 5, master
Children:
9518a5b
Parents:
aba138b
Message:

2003-02-11 Jay Monkman <jtm@…>

  • networkapp.t: Add an example code snippet for adding a default route.
Location:
doc/networking
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • doc/networking/ChangeLog

    raba138b r593904c  
     12003-02-11      Jay Monkman <jtm@smoothsmoothie.com>
     2
     3        * networkapp.t: Add an example code snippet for adding a default route.
     4
    152003-02-11      Mike Siers <mikes@poliac.com>
    26
  • doc/networking/networkapp.t

    raba138b r593904c  
    453453@end example
    454454
    455 Thanks to @uref{mailto:imikes@@poliac.com,Mike Seirs} for this example
     455Thanks to @uref{mailto:mikes@@poliac.com,Mike Seirs} for this example
     456code.
     457
     458@subsection Adding a Default Route
     459
     460The function provided in this section is functionally equivalent to
     461the command @code{route add default gw yyy.yyy.yyy.yyy}:
     462
     463@example
     464void mon_ifconfig(int argc, char *argv[],  unsigned32 command_arg,
     465                  boolean verbose)
     466@{
     467    struct sockaddr_in  ipaddr;
     468    struct sockaddr_in  dstaddr;
     469    struct sockaddr_in  netmask;
     470    struct sockaddr_in  broadcast;
     471    char               *iface;
     472    int                 f_ip        = 0;
     473    int                 f_ptp       = 0;
     474    int                 f_netmask   = 0;
     475    int                 f_up        = 0;
     476    int                 f_down      = 0;
     477    int                 f_bcast     = 0;
     478    int                 cur_idx;
     479    int                 rc;
     480    int                 flags;
     481
     482    bzero((void*) &ipaddr, sizeof(ipaddr));
     483    bzero((void*) &dstaddr, sizeof(dstaddr));
     484    bzero((void*) &netmask, sizeof(netmask));
     485    bzero((void*) &broadcast, sizeof(broadcast));
     486   
     487    ipaddr.sin_len = sizeof(ipaddr);
     488    ipaddr.sin_family = AF_INET;
     489   
     490    dstaddr.sin_len = sizeof(dstaddr);
     491    dstaddr.sin_family = AF_INET;
     492   
     493    netmask.sin_len = sizeof(netmask);
     494    netmask.sin_family = AF_INET;
     495   
     496    broadcast.sin_len = sizeof(broadcast);
     497    broadcast.sin_family = AF_INET;
     498   
     499    cur_idx = 0;
     500    if (argc <= 1) @{
     501        /* display all interfaces */
     502        iface = NULL;
     503        cur_idx += 1;
     504    @} else @{
     505        iface = argv[1];
     506        if (isdigit(*argv[2])) @{
     507            if (inet_pton(AF_INET, argv[2], &ipaddr.sin_addr) < 0) @{
     508                printf("bad ip address: %s\n", argv[2]);
     509                return;
     510            @}
     511            f_ip = 1;
     512            cur_idx += 3;
     513        @} else @{
     514            cur_idx += 2;
     515        @}
     516    @}
     517   
     518    if ((f_down !=0) && (f_ip != 0)) @{
     519        f_up = 1;
     520    @}
     521   
     522    while(argc > cur_idx) @{
     523        if (strcmp(argv[cur_idx], "up") == 0) @{
     524            f_up = 1;
     525            if (f_down != 0) @{
     526                printf("Can't make interface up and down\n");
     527            @}
     528        @} else if(strcmp(argv[cur_idx], "down") == 0) @{
     529            f_down = 1;
     530            if (f_up != 0) @{
     531                printf("Can't make interface up and down\n");
     532            @}
     533        @} else if(strcmp(argv[cur_idx], "netmask") == 0) @{
     534            if ((cur_idx + 1) >= argc) @{
     535                printf("No netmask address\n");
     536                return;
     537            @}
     538            if (inet_pton(AF_INET, argv[cur_idx+1], &netmask.sin_addr) < 0) @{
     539                printf("bad netmask: %s\n", argv[cur_idx]);
     540                return;
     541            @}
     542            f_netmask = 1;
     543            cur_idx += 1;
     544        @} else if(strcmp(argv[cur_idx], "broadcast") == 0) @{
     545            if ((cur_idx + 1) >= argc) @{
     546                printf("No broadcast address\n");
     547                return;
     548            @}
     549            if (inet_pton(AF_INET, argv[cur_idx+1], &broadcast.sin_addr) < 0) @{
     550                printf("bad broadcast: %s\n", argv[cur_idx]);
     551                return;
     552            @}
     553            f_bcast = 1;
     554            cur_idx += 1;
     555        @} else if(strcmp(argv[cur_idx], "pointopoint") == 0) @{
     556            if ((cur_idx + 1) >= argc) @{
     557                printf("No pointopoint address\n");
     558                return;
     559            @}
     560            if (inet_pton(AF_INET, argv[cur_idx+1], &dstaddr.sin_addr) < 0) @{
     561                printf("bad pointopoint: %s\n", argv[cur_idx]);
     562                return;
     563            @}
     564           
     565            f_ptp = 1;
     566            cur_idx += 1;
     567        @} else @{
     568            printf("Bad parameter: %s\n", argv[cur_idx]);
     569            return;
     570        @}
     571       
     572        cur_idx += 1;
     573    @}
     574   
     575    printf("ifconfig ");
     576    if (iface != NULL) @{
     577        printf("%s ", iface);
     578        if (f_ip != 0) @{
     579            char str[256];
     580            inet_ntop(AF_INET, &ipaddr.sin_addr, str, 256);
     581            printf("%s ", str);
     582        @}
     583       
     584        if (f_netmask != 0) @{
     585            char str[256];
     586            inet_ntop(AF_INET, &netmask.sin_addr, str, 256);
     587            printf("netmask %s ", str);
     588        @}
     589       
     590        if (f_bcast != 0) @{
     591            char str[256];
     592            inet_ntop(AF_INET, &broadcast.sin_addr, str, 256);
     593            printf("broadcast %s ", str);
     594        @}
     595       
     596        if (f_ptp != 0) @{
     597            char str[256];
     598            inet_ntop(AF_INET, &dstaddr.sin_addr, str, 256);
     599            printf("pointopoint %s ", str);
     600        @}
     601       
     602        if (f_up != 0) @{
     603            printf("up\n");
     604        @} else if (f_down != 0) @{
     605            printf("down\n");
     606        @} else @{
     607            printf("\n");
     608        @}
     609    @}
     610   
     611    if ((iface == NULL) || ((f_ip == 0) && (f_down == 0) && (f_up == 0))) @{
     612        rtems_bsdnet_show_if_stats();
     613        return;
     614    @}
     615   
     616    flags = 0;
     617    if (f_netmask) @{
     618        rc = rtems_bsdnet_ifconfig(iface, SIOCSIFNETMASK, &netmask);
     619        if (rc < 0) @{
     620            printf("Could not set netmask: %s\n", strerror(errno));
     621            return;
     622        @}
     623    @}
     624   
     625    if (f_bcast) @{
     626        rc = rtems_bsdnet_ifconfig(iface, SIOCSIFBRDADDR, &broadcast);
     627        if (rc < 0) @{
     628            printf("Could not set broadcast: %s\n", strerror(errno));
     629            return;
     630        @}
     631    @}
     632   
     633    if (f_ptp) @{
     634        rc = rtems_bsdnet_ifconfig(iface, SIOCSIFDSTADDR, &dstaddr);
     635        if (rc < 0) @{
     636            printf("Could not set destination address: %s\n", strerror(errno));
     637            return;
     638        @}
     639        flags |= IFF_POINTOPOINT;
     640    @}
     641   
     642    /* This must come _after_ setting the netmask, broadcast addresses */   
     643    if (f_ip) @{
     644        rc = rtems_bsdnet_ifconfig(iface, SIOCSIFADDR, &ipaddr);
     645        if (rc < 0) @{
     646            printf("Could not set IP address: %s\n", strerror(errno));
     647            return;
     648        @}
     649    @}
     650   
     651    if (f_up != 0) @{
     652        flags |= IFF_UP;
     653    @}
     654   
     655    if (f_down != 0) @{
     656        printf("Warning: taking interfaces down is not supported\n");
     657    @}
     658   
     659    rc = rtems_bsdnet_ifconfig(iface, SIOCSIFFLAGS, &flags);
     660    if (rc < 0) @{
     661        printf("Could not set interface flags: %s\n", strerror(errno));
     662        return;
     663    @}
     664@}
     665
     666
     667
     668void mon_route(int argc, char *argv[],  unsigned32 command_arg,
     669               boolean verbose)
     670@{
     671    int                cmd;
     672    struct sockaddr_in dst;
     673    struct sockaddr_in gw;
     674    struct sockaddr_in netmask;
     675    int                f_host;
     676    int                f_gw       = 0;
     677    int                cur_idx;
     678    int                flags;
     679    int                rc;
     680   
     681    memset(&dst, 0, sizeof(dst));
     682    memset(&gw, 0, sizeof(gw));
     683    memset(&netmask, 0, sizeof(netmask));
     684   
     685    dst.sin_len = sizeof(dst);
     686    dst.sin_family = AF_INET;
     687    dst.sin_addr.s_addr = inet_addr("0.0.0.0"); 
     688   
     689    gw.sin_len = sizeof(gw);
     690    gw.sin_family = AF_INET;
     691    gw.sin_addr.s_addr = inet_addr("0.0.0.0");
     692   
     693    netmask.sin_len = sizeof(netmask);
     694    netmask.sin_family = AF_INET;
     695    netmask.sin_addr.s_addr = inet_addr("255.255.255.0");
     696   
     697    if (argc < 2) @{
     698        rtems_bsdnet_show_inet_routes();
     699        return;
     700    @}
     701   
     702    if (strcmp(argv[1], "add") == 0) @{
     703        cmd = RTM_ADD;
     704    @} else if (strcmp(argv[1], "del") == 0) @{
     705        cmd = RTM_DELETE;
     706    @} else @{
     707        printf("invalid command: %s\n", argv[1]);
     708        printf("\tit should be 'add' or 'del'\n");
     709        return;
     710    @}
     711   
     712    if (argc < 3) @{
     713        printf("not enough arguments\n");
     714        return;
     715    @}
     716   
     717    if (strcmp(argv[2], "-host") == 0) @{
     718        f_host = 1;
     719    @} else if (strcmp(argv[2], "-net") == 0) @{
     720        f_host = 0;
     721    @} else @{
     722        printf("Invalid type: %s\n", argv[1]);
     723        printf("\tit should be '-host' or '-net'\n");
     724        return;
     725    @}
     726   
     727    if (argc < 4) @{
     728        printf("not enough arguments\n");
     729        return;
     730    @}
     731   
     732    inet_pton(AF_INET, argv[3], &dst.sin_addr);
     733   
     734    cur_idx = 4;
     735    while(cur_idx < argc) @{
     736        if (strcmp(argv[cur_idx], "gw") == 0) @{
     737            if ((cur_idx +1) >= argc) @{
     738                printf("no gateway address\n");
     739                return;
     740            @}
     741            f_gw = 1;
     742            inet_pton(AF_INET, argv[cur_idx + 1], &gw.sin_addr);
     743            cur_idx += 1;
     744        @} else if(strcmp(argv[cur_idx], "netmask") == 0) @{
     745            if ((cur_idx +1) >= argc) @{
     746                printf("no netmask address\n");
     747                return;
     748            @}
     749            f_gw = 1;
     750            inet_pton(AF_INET, argv[cur_idx + 1], &netmask.sin_addr);
     751            cur_idx += 1;
     752        @} else @{
     753            printf("Unknown argument\n");
     754            return;
     755        @}
     756        cur_idx += 1;
     757    @}
     758   
     759    flags = RTF_STATIC;
     760    if (f_gw != 0) @{
     761        flags |= RTF_GATEWAY;
     762    @}
     763    if (f_host != 0) @{
     764        flags |= RTF_HOST;
     765    @}
     766
     767    rc = rtems_bsdnet_rtrequest(cmd, &dst, &gw, &netmask, flags, NULL);
     768    if (rc < 0) @{
     769        printf("Error adding route\n");
     770    @}
     771@}
     772@end example
     773
     774Thanks to @uref{mailto:jtm@@smoothmsmoothie.com,Jay Monkman} for this example
    456775code.
    457776
Note: See TracChangeset for help on using the changeset viewer.