On Saturday 13 November 2010 00:31:21 you wrote: > > Hello, > > On Fri, 12 Nov 2010, Hans Schillstrom wrote: > > > This patch series adds/(updates) the following functionality > > in the synchronization between master and backup daemons. > > > > - IPv6 > > - Persistence Engine > > - Firewall marks transferred > > - Time-outs transferred. > > - Flag field increased to 32 bits. > > > > Note: > > This patches depends on Patch 1-9 in staging branch: > > "IPVS: Backup, Prepare for transferring firewall marks (fwmark) to the backup daemon." > > to ... > > "IPVS: skb defrag in L7 helpers" > > > > A new message format is also introduced, not understood by old backup daemons. > > For compatibility reasons receiving the old version (version 0) is still possible. > > Old (version 0) backups will just drop new (Version 1) messages. > > It's also possible to send sync msg in version 0 format, by sysctl > > #sysclt -w net.ipv4.vs.sync_version=0 > > v3 PATCH 1/3 > - ntoh_seq can use directly get_unaligned_be32, it is BE to CPU, > no need for ntohl Tanks, > > - In ip_vs_conn_fill_param_sync: > > - should we ignore the conn entry when pe_name_len > is 0 and pe_data_len != 0 (return 1)? May be such checks: > > /* Handle pe data */ > if ((pe_data_len != 0) != (pe_name_len != 0)) { > IP_VS_DBG(3, "BACKUP, Invalid PE parameters\n"); > return 1; > } > if (!pe_name_len) > return 0; > ... It's OK, for me, what do you think Simon ? Lets do it this way, if (pe_data_len) { if (pe_name_len) { ... } else { IP_VS_DBG(3, "BACKUP, Invalid PE parameters\n"); return 1; } ... > > - make sure p->pe is _put when p->pe_data > allocation fails (-ENOMEM) > if (!p->pe_data) { if (p->pe->module) module_put(p->pe->module); return -ENOMEM; } > - ip_vs_proc_str: use 'unsigned int', not just 'unsigned' > OK > - ip_vs_proc_sync_conn: > - pe_data_len, pe_name_len, pe_data, pe_name are > not initialized Ooops, how did that happen :-? > > - 'retc 10;' must be 'retc = 10;' ? Yes it should, I wounder why the compiler didn't complain... > > - inconsistent spaces: > '} else if (! s->v4.type) {' > 'while (p< msg_end && *p && !retc ) {' My fingers seems to like the space bar :-) > > - please convert char *p, char *msg_end to '__u8 *' or > 'unsigned char *' because this is risky for char * when > value is above 127: > int ptype = *(p++); > int plen = *(p++); > OK, I switch to __u8 in general; > - add some sanity checks because 'p< msg_end' guarantees > that only ptype is present, for example: Thats true > > while (p < msg_end) { > int ptype; > int plen; > > if (p + 2 > msg_end) > return -30; > > ptype = *(p++); > plen = *(p++); > > - for IPVS_OPT_PE_NAME ip_vs_proc_str must be called > with IPVS_OPT_F_PE_NAME Oops > > - ip_vs_process_message: > - before 'size = ntohs(s->v4.ver_size) & SVER_MASK;' > there must be a check for present v4 structure: > > if (msg_end + sizeof(s->v4) > buffer+buflen) { > IP_VS_ERR_RL("BACKUP, Dropping buffer, msg > buffer\n"); > return; > } OK > size = ntohs(s->v4.ver_size) & SVER_MASK; > > - we must account padding later after > ip_vs_proc_sync_conn is called, it should not be > included in size because the parameter > parsing will fail while walking the padding: > > size += 3; > size &= ~3; > msg_end = p + size; > > there is no need to check if new msg_end > exceeds buflen because if there are more > conn entries the above code will check for > present v4 structure. I think this one produce cleaner code, > > Another option is the parameter parsing > to consider ptype=0 as 1 byte padding but > then there should be no plen octet for this > case. Then ver_size can include the padding. > For example: > > while (p < msg_end) { > int ptype = *(p++); > int plen; > > /* Padding ? */ > if (!ptype) > continue; > if (p + 1 > msg_end) > return -30; > plen = *(p++); > > v3 PATCH 2/3 > - hton_seq can use put_unaligned_be32 Yes > - ip_vs_sync_conn: > - move init of pe_name_len after sloop > Ooops > - The 'Sanity checks' code must be after sloop > Yes, > - we can use cp->pe instead of cp->dest->svc->pe OK > > - before 'len = (len+3) & 0xffc;' may be > we have to calculate pad = (4 - len) & 3 > so that we can use it later, len should not > include the padding, for example: > > pad = (4 - len) & 3; > /* check if there is a space for this one */ > if (curr_sb && (curr_sb->head+len+pad > curr_sb->end)) { > ... > > - then after all parameters: > > curr_sb->head += len; > if (pad) { > memset(curr_sb->head, 0, pad); > curr_sb->head += pad; > } > > or > > curr_sb->head += len; > while (pad --) > *curr_sb->head ++ = 0; > > then this code is not needed: > > + if (p < curr_sb->head) > + *p = 0; /* Dont leave random bytes at end */ > > - use cp->pe for IPVS_OPT_PE_NAME > > v3 PATCH 3/3 > OK > > Regards > > -- > Julian Anastasov <ja@xxxxxx> > -- Regards Hans Schillstrom <hans.schillstrom@xxxxxxxxxxxx> -- To unsubscribe from this list: send the line "unsubscribe lvs-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html