* the chunk length to indicate when to stop.  Make sure
  * there is room for a param header too.
  */
-#define sctp_walk_params(pos, chunk, member)\
-_sctp_walk_params((pos), (chunk), ntohs((chunk)->chunk_hdr.length), member)
+#define sctp_walk_params(pos, chunk)\
+_sctp_walk_params((pos), (chunk), ntohs((chunk)->chunk_hdr.length))
 
-#define _sctp_walk_params(pos, chunk, end, member)\
-for (pos.v = chunk->member;\
+#define _sctp_walk_params(pos, chunk, end)\
+for (pos.v = (u8 *)(chunk + 1);\
      (pos.v + offsetof(struct sctp_paramhdr, length) + sizeof(pos.p->length) <=\
       (void *)chunk + end) &&\
      pos.v <= (void *)chunk + end - ntohs(pos.p->length) &&\
 
            ntohl(peer_init->init_hdr.a_rwnd) < SCTP_DEFAULT_MINWINDOW)
                return sctp_process_inv_mandatory(asoc, chunk, errp);
 
-       sctp_walk_params(param, peer_init, init_hdr.params) {
+       sctp_walk_params(param, peer_init) {
                if (param.p->type == SCTP_PARAM_STATE_COOKIE)
                        has_cookie = true;
        }
                                                  chunk, errp);
 
        /* Verify all the variable length parameters */
-       sctp_walk_params(param, peer_init, init_hdr.params) {
+       sctp_walk_params(param, peer_init) {
                result = sctp_verify_param(net, ep, asoc, param, cid,
                                           chunk, errp);
                switch (result) {
                src_match = 1;
 
        /* Process the initialization parameters.  */
-       sctp_walk_params(param, peer_init, init_hdr.params) {
+       sctp_walk_params(param, peer_init) {
                if (!src_match &&
                    (param.p->type == SCTP_PARAM_IPV4_ADDRESS ||
                     param.p->type == SCTP_PARAM_IPV6_ADDRESS)) {
        union sctp_params param;
 
        addip = (struct sctp_addip_chunk *)chunk->chunk_hdr;
-       sctp_walk_params(param, addip, addip_hdr.params) {
+       sctp_walk_params(param, addip) {
                size_t length = ntohs(param.p->length);
 
                *errp = param.p;
                        /* ensure there is only one addr param and it's in the
                         * beginning of addip_hdr params, or we reject it.
                         */
-                       if (param.v != addip->addip_hdr.params)
+                       if (param.v != (addip + 1))
                                return false;
                        addr_param_seen = true;
                        break;
                case SCTP_PARAM_IPV6_ADDRESS:
                        if (length != sizeof(struct sctp_ipv6addr_param))
                                return false;
-                       if (param.v != addip->addip_hdr.params)
+                       if (param.v != (addip + 1))
                                return false;
                        addr_param_seen = true;
                        break;
                goto done;
 
        /* Process the TLVs contained within the ASCONF chunk. */
-       sctp_walk_params(param, addip, addip_hdr.params) {
+       sctp_walk_params(param, addip) {
                /* Skip preceeding address parameters. */
                if (param.p->type == SCTP_PARAM_IPV4_ADDRESS ||
                    param.p->type == SCTP_PARAM_IPV6_ADDRESS)
                return NULL;
 
        reconf = (struct sctp_reconf_chunk *)retval->chunk_hdr;
-       retval->param_hdr.v = reconf->params;
+       retval->param_hdr.v = (u8 *)(reconf + 1);
 
        return retval;
 }
        __u16 cnt = 0;
 
        hdr = (struct sctp_reconf_chunk *)chunk->chunk_hdr;
-       sctp_walk_params(param, hdr, params) {
+       sctp_walk_params(param, hdr) {
                __u16 length = ntohs(param.p->length);
 
                *errp = param.p;