]> git.ipfire.org Git - thirdparty/lldpd.git/commitdiff
Parse LLDP-MED MDI when receiving frames
authorVincent Bernat <bernat@luffy.cx>
Mon, 8 Dec 2008 19:11:00 +0000 (20:11 +0100)
committerVincent Bernat <bernat@luffy.cx>
Mon, 8 Dec 2008 19:11:00 +0000 (20:11 +0100)
src/lldp.c
src/lldp.h
src/lldpctl.c
src/lldpd.h

index 1aad0b1f55ecdef4117df9856458569f9a968e79..be9d52317d969c15ed6fe0cd53610b42c317bd60 100644 (file)
@@ -722,10 +722,74 @@ lldp_decode(struct lldpd *cfg, char *frame, int s,
                                                    hardware->h_ifname);
                                                goto malformed;
                                        }
-                                       chassis->c_med_powtype =
-                                           *(u_int8_t*)(frame + f);
+                                       switch (*(u_int8_t*)(frame + f) & 0xC0) {
+                                       case 0x0:
+                                               chassis->c_med_pow_devicetype = LLDPMED_POW_TYPE_PSE;
+                                               switch (*(u_int8_t*)(frame + f) & 0x30) {
+                                               case 0x0:
+                                                       chassis->c_med_pow_source =
+                                                           LLDPMED_POW_SOURCE_UNKNOWN;
+                                                       break;
+                                               case 0x10:
+                                                       chassis->c_med_pow_source =
+                                                           LLDPMED_POW_SOURCE_PRIMARY;
+                                                       break;
+                                               case 0x20:
+                                                       chassis->c_med_pow_source =
+                                                           LLDPMED_POW_SOURCE_BACKUP;
+                                                       break;
+                                               default:
+                                                       chassis->c_med_pow_source =
+                                                           LLDPMED_POW_SOURCE_RESERVED;
+                                               }
+                                               break;
+                                       case 0x40:
+                                               chassis->c_med_pow_devicetype = LLDPMED_POW_TYPE_PD;
+                                               switch (*(u_int8_t*)(frame + f) & 0x30) {
+                                               case 0x0:
+                                                       chassis->c_med_pow_source =
+                                                           LLDPMED_POW_SOURCE_UNKNOWN;
+                                                       break;
+                                               case 0x10:
+                                                       chassis->c_med_pow_source =
+                                                           LLDPMED_POW_SOURCE_PSE;
+                                                       break;
+                                               case 0x20:
+                                                       chassis->c_med_pow_source =
+                                                           LLDPMED_POW_SOURCE_LOCAL;
+                                                       break;
+                                               default:
+                                                       chassis->c_med_pow_source =
+                                                           LLDPMED_POW_SOURCE_BOTH;
+                                               }
+                                               break;
+                                       default:
+                                               chassis->c_med_pow_devicetype =
+                                                   LLDPMED_POW_TYPE_RESERVED;
+                                       }
+                                       switch (*(u_int8_t*)(frame + f) & 0x0F) {
+                                       case 0x0:
+                                               chassis->c_med_pow_priority =
+                                                   LLDPMED_POW_PRIO_UNKNOWN;
+                                               break;
+                                       case 0x1:
+                                               chassis->c_med_pow_priority =
+                                                   LLDPMED_POW_PRIO_CRITICAL;
+                                               break;
+                                       case 0x2:
+                                               chassis->c_med_pow_priority =
+                                                   LLDPMED_POW_PRIO_HIGH;
+                                               break;
+                                       case 0x3:
+                                               chassis->c_med_pow_priority =
+                                                   LLDPMED_POW_PRIO_LOW;
+                                               break;
+                                       default:
+                                               chassis->c_med_pow_priority =
+                                                   LLDPMED_POW_PRIO_UNKNOWN;
+                                       }
                                        f += 1;
-                                       chassis->c_med_powval =
+                                       chassis->c_med_pow_val =
                                            ntohs(*(u_int16_t*)(frame + f));
                                        f += 2;
                                        chassis->c_med_cap_enabled |=
index b830cde05f8eebc97656b89fa2cd74ffe4e43b6a..527a3e2d29ecac4bf707f25242f9663ec83d16e2 100644 (file)
@@ -266,6 +266,23 @@ enum {
 #define LLDPMED_LOCFORMAT_ELIN 3
 #define LLDPMED_LOCFORMAT_LAST LLDPMED_LOCFORMAT_ELIN
 
+#define LLDPMED_POW_TYPE_PSE 1
+#define LLDPMED_POW_TYPE_PD 2
+#define LLDPMED_POW_TYPE_RESERVED 3
+
+#define LLDPMED_POW_SOURCE_UNKNOWN 1
+#define LLDPMED_POW_SOURCE_PRIMARY 2
+#define LLDPMED_POW_SOURCE_BACKUP 3
+#define LLDPMED_POW_SOURCE_RESERVED 4
+#define LLDPMED_POW_SOURCE_PSE 5
+#define LLDPMED_POW_SOURCE_LOCAL 6
+#define LLDPMED_POW_SOURCE_BOTH 7
+
+#define LLDPMED_POW_PRIO_UNKNOWN 1
+#define LLDPMED_POW_PRIO_CRITICAL 2
+#define LLDPMED_POW_PRIO_HIGH 3
+#define LLDPMED_POW_PRIO_LOW 4
+
 #define LLDPMED_CAP_CAP 0x01
 #define LLDPMED_CAP_POLICY 0x02
 #define LLDPMED_CAP_LOCATION 0x04
index e836f8cc9e56ffa88dc217833604d8f4355b9f40..f5c7691ac57a3ca7047e5eb28f5217b43ddbeea3 100644 (file)
@@ -482,47 +482,51 @@ display_med(struct lldpd_chassis *chassis)
                        printf("\n");
                }
        }
-       if (chassis->c_med_powtype) {
+       if (chassis->c_med_pow_devicetype) {
                printf(" LLDP-MED Extended Power-over-Ethernet:\n");
                printf("  Power Type & Source: ");
-               if((chassis->c_med_powtype & 0xC0) == 0x00) {
+               switch (chassis->c_med_pow_devicetype) {
+               case LLDPMED_POW_TYPE_PSE:
                        printf("PSE Device");
-                       if((chassis->c_med_powtype & 0x30) == 0x00) {
-                               printf(", unknown");
-                       } else if((chassis->c_med_powtype & 0x30) == 0x10) {
-                               printf(", Primary Power Source");
-                       } else if((chassis->c_med_powtype & 0x30) == 0x20) {
-                               printf(", Backup Power Source / Power Conservation Mode");
-                       }
-               } else if((chassis->c_med_powtype & 0xC0) == 0x40) {
+                       break;
+               case LLDPMED_POW_TYPE_PD:
                        printf("PD Device");
-                       if((chassis->c_med_powtype & 0x30) == 0x00) {
-                               printf(", unknown");
-                       } else if((chassis->c_med_powtype & 0x30) == 0x10) {
-                               printf(", PSE");
-                       } else if((chassis->c_med_powtype & 0x30) == 0x20) {
-                               printf(", local");
-                       } else {
-                               printf(", PSE & local");
-                       }
-               } else {
+                       break;
+               default:
                        printf("reserved");
                }
+               switch (chassis->c_med_pow_source) {
+               case LLDPMED_POW_SOURCE_UNKNOWN:
+               case LLDPMED_POW_SOURCE_RESERVED:
+                       printf(", unknown"); break;
+               case LLDPMED_POW_SOURCE_PRIMARY:
+                       printf(", Primary Power Source");
+                       break;
+               case LLDPMED_POW_SOURCE_BACKUP:
+                       printf(", Backup Power Source / Power Conservation Mode");
+                       break;
+               case LLDPMED_POW_SOURCE_PSE:
+                       printf(", PSE"); break;
+               case LLDPMED_POW_SOURCE_LOCAL:
+                       printf(", local"); break;
+               case LLDPMED_POW_SOURCE_BOTH:
+                       printf(", PSE & local");
+                       break;
+               }
                printf("\n  Power Priority:      ");
-               if((chassis->c_med_powtype & 0x0F) == 0x00) {
+               switch (chassis->c_med_pow_priority) {
+               case LLDPMED_POW_PRIO_CRITICAL:
+                       printf("critical"); break;
+               case LLDPMED_POW_PRIO_HIGH:
+                       printf("high"); break;
+               case LLDPMED_POW_PRIO_LOW:
+                       printf("low"); break;
+               default:
                        printf("unknown");
-               } else if((chassis->c_med_powtype & 0x0F) == 0x01) {
-                       printf("critical");
-               } else if((chassis->c_med_powtype & 0x0F) == 0x02) {
-                       printf("high");
-               } else if((chassis->c_med_powtype & 0x0F) == 0x03) {
-                       printf("low");
-               } else {
-                       printf("reserved");
                }
                printf("\n  Power Value:         ");
-               if(chassis->c_med_powval < 1024) {
-                       printf("%u mW", chassis->c_med_powval * 100);
+               if(chassis->c_med_pow_val < 1024) {
+                       printf("%u mW", chassis->c_med_pow_val * 100);
                } else {
                        printf("reserved");
                }
index 8143667af1cd3c17df253a72e228d5fe8bd908a2..1d8644608576b67d1284823beba03a9424d79c04 100644 (file)
@@ -118,7 +118,7 @@ struct lldpd_chassis {
        STRUCT_LLDPD_MED_LOC           \
        STRUCT_LLDPD_MED_LOC           \
        STRUCT_LLDPD_MED_LOC           \
-       "Pwwbbwsssssss"
+       "Pwwbbbbwsssssss"
 
        void                    *c_padding1; /* We force alignment */
        struct lldpd_med_policy  c_med_policy[LLDPMED_APPTYPE_LAST];
@@ -127,8 +127,10 @@ struct lldpd_chassis {
        u_int16_t                c_med_cap_available;
        u_int16_t                c_med_cap_enabled;
        u_int8_t                 c_med_type;
-       u_int8_t                 c_med_powtype;
-       u_int16_t                c_med_powval;
+       u_int8_t                 c_med_pow_devicetype; /* PD or PSE */
+       u_int8_t                 c_med_pow_source;
+       u_int8_t                 c_med_pow_priority;
+       u_int16_t                c_med_pow_val;
        char                    *c_med_hw;
        char                    *c_med_fw;
        char                    *c_med_sw;