SMC_PROCESSABORT        = 27,
 };
 
+#define SMC_FEATURE_MASK       0       /* bitmask of
+                                        * supported supplemental features
+                                        */
+
 struct smc_link_group;
 
 struct smc_wr_rx_hdr { /* common prefix part of LLC and CDC to demultiplex */
 
                        fce_v2x->max_conns = ini->max_conns;
                        fce_v2x->max_links = ini->max_links;
                }
+               fce_v2x->feature_mask = htons(ini->feature_mask);
        }
 
 out:
                pclc_smcd->v2_ext_offset = htons(v2_ext_offset);
                plen += sizeof(*v2_ext);
 
+               v2_ext->feature_mask = htons(SMC_FEATURE_MASK);
                read_lock(&smc_clc_eid_table.lock);
                v2_ext->hdr.eid_cnt = smc_clc_eid_table.ueid_cnt;
                plen += smc_clc_eid_table.ueid_cnt * SMC_MAX_EID_LEN;
 
        ini->max_conns = SMC_CONN_PER_LGR_MAX;
        ini->max_links = SMC_LINKS_ADD_LNK_MAX;
+       ini->feature_mask = SMC_FEATURE_MASK;
 
        if ((!(ini->smcd_version & SMC_V2) && !(ini->smcr_version & SMC_V2)) ||
            ini->release_nr < SMC_RELEASE_1)
                        return SMC_CLC_DECL_MAXLINKERR;
                ini->max_links = fce_v2x->max_links;
        }
+       /* common supplemental features of server and client */
+       ini->feature_mask = ntohs(fce_v2x->feature_mask) & SMC_FEATURE_MASK;
 
        return 0;
 }
                if (fce_v2x->max_links != ini->max_links)
                        return SMC_CLC_DECL_MAXLINKERR;
        }
+       /* common supplemental features returned by client */
+       ini->feature_mask = ntohs(fce_v2x->feature_mask);
 
        return 0;
 }
 
        u8 roce[16];            /* RoCEv2 GID */
        u8 max_conns;
        u8 max_links;
-       u8 reserved[14];
+       __be16 feature_mask;
+       u8 reserved[12];
        u8 user_eids[][SMC_MAX_EID_LEN];
 };
 
 
 struct smc_clc_first_contact_ext_v2x {
        struct smc_clc_first_contact_ext fce_v2_base;
-       u8 max_conns; /* for SMC-R only */
-       u8 max_links; /* for SMC-R only */
-       u8 reserved3[2];
+       union {
+               struct {
+                       u8 max_conns; /* for SMC-R only */
+                       u8 max_links; /* for SMC-R only */
+               };
+               u8 reserved3[2];        /* for SMC-D only */
+       };
+       __be16 feature_mask;
        __be32 vendor_exp_options;
        u8 reserved4[8];
 } __packed;            /* format defined in