]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
[iproute2] XFRM: fixing protocol
authororg[shemminger]!nakam <org[shemminger]!nakam>
Tue, 28 Sep 2004 18:40:49 +0000 (18:40 +0000)
committerorg[shemminger]!nakam <org[shemminger]!nakam>
Tue, 28 Sep 2004 18:40:49 +0000 (18:40 +0000)
(Logical change 1.84)

ip/ipxfrm.c
ip/xfrm.h
ip/xfrm_policy.c
ip/xfrm_state.c

index c66d93463cfb728aa60b4100a8338031d9e32184..e47b9a826dc2ec9e9ac3c95ce561f323777323b4 100644 (file)
@@ -57,6 +57,43 @@ struct typeent {
        int t_type;
 };
 
+static const struct typeent xfrmproto_types[]= {
+       { "esp", IPPROTO_ESP }, { "ah", IPPROTO_AH },
+       { "comp", IPPROTO_COMP }, { NULL, -1 }
+};
+
+int xfrm_xfrmproto_getbyname(char *name)
+{
+       int i;
+
+       for (i = 0; ; i++) {
+               const struct typeent *t = &xfrmproto_types[i];
+               if (!t->t_name || t->t_type == -1)
+                       break;
+
+               if (strcmp(t->t_name, name) == 0)
+                       return t->t_type;
+       }
+
+       return -1;
+}
+
+const char *strxf_xfrmproto(__u8 proto)
+{
+       int i;
+
+       for (i = 0; ; i++) {
+               const struct typeent *t = &xfrmproto_types[i];
+               if (!t->t_name || t->t_type == -1)
+                       break;
+
+               if (t->t_type == proto)
+                       return t->t_name;
+       }
+
+       return NULL;
+}
+
 static const struct typeent algo_types[]= {
        { "enc", XFRMA_ALG_CRYPT }, { "auth", XFRMA_ALG_AUTH },
        { "comp", XFRMA_ALG_COMP }, { NULL, -1 }
@@ -172,7 +209,7 @@ void xfrm_id_info_print(xfrm_address_t *saddr, struct xfrm_id *id,
                fprintf(fp, prefix);
        fprintf(fp, "\t");
 
-       fprintf(fp, "proto %s ", strxf_proto(id->proto));
+       fprintf(fp, "proto %s ", strxf_xfrmproto(id->proto));
 
        spi = ntohl(id->spi);
        fprintf(fp, "spi 0x%08x", spi);
@@ -522,7 +559,6 @@ int xfrm_id_parse(xfrm_address_t *saddr, struct xfrm_id *id, __u16 *family,
        char **argv = *argvp;
        inet_prefix dst;
        inet_prefix src;
-       __u8 proto = 0;
 
        memset(&dst, 0, sizeof(dst));
        memset(&src, 0, sizeof(src));
@@ -555,27 +591,15 @@ int xfrm_id_parse(xfrm_address_t *saddr, struct xfrm_id *id, __u16 *family,
                        filter.id_dst_mask = dst.bitlen;
 
                } else if (strcmp(*argv, "proto") == 0) {
-                       struct protoent *pp;
+                       int ret;
 
                        NEXT_ARG();
 
-                       pp = getprotobyname(*argv);
-                       if (pp)
-                               proto = pp->p_proto;
-                       else {
-                               if (get_u8(&proto, *argv, 0))
-                                       invarg("\"XFRM_PROTO\" is invalid", *argv);
-                       }
+                       ret = xfrm_xfrmproto_getbyname(*argv);
+                       if (ret < 0)
+                               invarg("\"XFRM_PROTO\" is invalid", *argv);
 
-                       switch (proto) {
-                       case IPPROTO_ESP:
-                       case IPPROTO_AH:
-                       case IPPROTO_COMP:
-                               id->proto = proto;
-                               break;
-                       default:
-                               invarg("\"XFRM_PROTO\" is unsuppored proto", *argv);
-                       }
+                       id->proto = (__u8)ret;
 
                        filter.id_proto_mask = XFRM_FILTER_MASK_FULL;
 
@@ -604,8 +628,8 @@ int xfrm_id_parse(xfrm_address_t *saddr, struct xfrm_id *id, __u16 *family,
        if (src.family && dst.family && (src.family != dst.family))
                invarg("the same address family is required between \"SADDR\" and \"DADDR\"", *argv);
 
-       if (loose == 0 && proto == 0)
-               missarg("PROTO");
+       if (loose == 0 && id->proto == 0)
+               missarg("XFRM_PROTO");
        if (argc == *argcp)
                missarg("ID");
 
index 6c18a7b83d1690bb8174522218fad0776d38ee98..204ad20edac33a234e6508e4c538eb3412c75995 100644 (file)
--- a/ip/xfrm.h
+++ b/ip/xfrm.h
@@ -78,7 +78,9 @@ extern struct xfrm_filter filter;
 int do_xfrm_state(int argc, char **argv);
 int do_xfrm_policy(int argc, char **argv);
 
+int xfrm_xfrmproto_getbyname(char *name);
 int xfrm_algotype_getbyname(char *name);
+const char *strxf_xfrmproto(__u8 proto);
 const char *strxf_algotype(int type);
 const char *strxf_flags(__u8 flags);
 const char *strxf_share(__u8 share);
index 9b6e2ac380108bfae81309d6ea5d91257ff6cb6f..8d6f8f97a7039cadf91f56daacb97d9f1cc100b3 100644 (file)
@@ -78,11 +78,11 @@ static void usage(void)
        fprintf(stderr, "TMPL := ID [ mode MODE ] [ reqid REQID ] [ level LEVEL ]\n");
        fprintf(stderr, "ID := [ src ADDR ] [ dst ADDR ] [ proto XFRM_PROTO ] [ spi SPI ]\n");
 
-       //fprintf(stderr, "XFRM_PROTO := [ esp | ah | ipcomp ]\n");
+       //fprintf(stderr, "XFRM_PROTO := [ esp | ah | comp ]\n");
        fprintf(stderr, "XFRM_PROTO := [ ");
-       fprintf(stderr, "%s | ", strxf_proto(IPPROTO_ESP));
-       fprintf(stderr, "%s | ", strxf_proto(IPPROTO_AH));
-       fprintf(stderr, "%s", strxf_proto(IPPROTO_COMP));
+       fprintf(stderr, "%s | ", strxf_xfrmproto(IPPROTO_ESP));
+       fprintf(stderr, "%s | ", strxf_xfrmproto(IPPROTO_AH));
+       fprintf(stderr, "%s", strxf_xfrmproto(IPPROTO_COMP));
        fprintf(stderr, " ]\n");
 
        fprintf(stderr, "MODE := [ transport | tunnel ](default=transport)\n");
index 97aabb702cc9bb53adec4e84b0b1ecdd842e866d..8a87cf2e7403835bec9919b482c6da71a35f4ead 100644 (file)
@@ -63,11 +63,11 @@ static void usage(void)
        fprintf(stderr, "        [ FLAG_LIST ]\n");
 
        fprintf(stderr, "ID := [ src ADDR ] [ dst ADDR ] [ proto XFRM_PROTO ] [ spi SPI ]\n");
-       //fprintf(stderr, "XFRM_PROTO := [ esp | ah | ipcomp ]\n");
+       //fprintf(stderr, "XFRM_PROTO := [ esp | ah | comp ]\n");
        fprintf(stderr, "XFRM_PROTO := [ ");
-       fprintf(stderr, "%s | ", strxf_proto(IPPROTO_ESP));
-       fprintf(stderr, "%s | ", strxf_proto(IPPROTO_AH));
-       fprintf(stderr, "%s ", strxf_proto(IPPROTO_COMP));
+       fprintf(stderr, "%s | ", strxf_xfrmproto(IPPROTO_ESP));
+       fprintf(stderr, "%s | ", strxf_xfrmproto(IPPROTO_AH));
+       fprintf(stderr, "%s ", strxf_xfrmproto(IPPROTO_COMP));
        fprintf(stderr, "]\n");
 
        //fprintf(stderr, "SPI - security parameter index(default=0)\n");
@@ -309,14 +309,14 @@ static int xfrm_state_modify(int cmd, unsigned flags, int argc, char **argv)
                if (req.xsinfo.id.proto != IPPROTO_ESP &&
                    req.xsinfo.id.proto != IPPROTO_AH &&
                    req.xsinfo.id.proto != IPPROTO_COMP) {
-                       fprintf(stderr, "\"ALGO\" is invalid with proto=%s\n", strxf_proto(req.xsinfo.id.proto));
+                       fprintf(stderr, "\"ALGO\" is invalid with proto=%s\n", strxf_xfrmproto(req.xsinfo.id.proto));
                        exit(1);
                }
        } else {
                if (req.xsinfo.id.proto == IPPROTO_ESP ||
                    req.xsinfo.id.proto == IPPROTO_AH ||
                    req.xsinfo.id.proto == IPPROTO_COMP) {
-                       fprintf(stderr, "\"ALGO\" is required with proto=%s\n", strxf_proto(req.xsinfo.id.proto));
+                       fprintf(stderr, "\"ALGO\" is required with proto=%s\n", strxf_xfrmproto(req.xsinfo.id.proto));
                        exit (1);
                }
        }