Hello, On Fri, 29 Oct 2010, Hans Schillstrom wrote:
PATCH STATUS: - Persistence data is not tested. THANKS The Persistence part is based on Simon Hormans Backup RFC Julian for the comments and the Review of the RFC *v2 Simlified fwmark handling patch 1/4 New handling of optional data patch 2/4 Seconds in timeout Basically all changes is based on Julians and Simons comments on the RFC For details see individual patches.
v2 PATCH 1/4 OK v2 PATCH 2/4 - Do we change the name from "Option" to "Parameter" ? Also, 'Option Length" will be part of the DATA, i.e. it should be present depending on type, in some cases it will be implicit, eg. for IPVS_OPT_SEQ_DATA: IPVS_OPT_SEQ_DATA: - 1 octet IPVS_OPT_SEQ_DATA followed by struct ip_vs_sync_conn_options IPVS_OPT_PE_DATA: - 1 octet IPVS_OPT_PE_DATA, 1 or 2 octets for Parameter Length (pe_data_len) followed by pe_data. If the decision is to support large data please use 2 octets and get_unaligned_be16 to read it. Other PEs may need it, they can decide to add many things in PE data, they will not allocate other cp fields for their data. IPVS_OPT_PE_NAME: - 1 octet for IPVS_OPT_PE_NAME, 1 octet for Parameter Length (pe_name_len) followed by pe_name - struct ip_vs_sync_mesg_v2 with spaces instead of tabs? - can we add check in backup for timeout not to exceed (MAX_SCHEDULE_TIMEOUT / HZ) For example: if (timeout) { if (timeout > MAX_SCHEDULE_TIMEOUT / HZ) timeout = MAX_SCHEDULE_TIMEOUT / HZ; cp->timeout = timeout * HZ; } else ... - extra space in protocol: ip_vs_proc_conn(¶m, flags, state, s-> protocol, AF_INET, - lets drop the optional parameters from ip_vs_process_message()? - ip_vs_process_message: do not use mask: m2->size & SVER_MASK because the message size has no version. - What is the right thing to do in ip_vs_conn_fill_param_sync when ip_vs_pe_get() does not find PE? May be to drop connection? May be in ip_vs_process_message() we should use one pointer for end of message (it was 'p' before now), so that we can skip connections, for example, when some mandatory parameter as PE is not supported. We should not drop the whole sync message. When message is invalid it should be dropped but lack of support should not hurt other connections. In the case for PE may be ip_vs_conn_fill_param_sync() should return 1 if PE is unknown (ip_vs_pe_get). Then caller will continue with next connection if result > 0 or will drop message if result < 0 as in current patch. May be the pe_name presence should be the first check in ip_vs_conn_fill_param_sync. Also note that p->pe is pointer without reference while called in ip_vs_sched_persist. In our case with ip_vs_conn_fill_param_sync we should put this reference after calling ip_vs_proc_conn(). May be ip_vs_find_dest should check that p->pe matches svc->pe. ip_vs_try_bind_dest should provide p->pe too for this check. But we must somehow ignore new conns with PE if they don't have cp->dest (service) because it is risky to attach PE that is not held by svc. It is bad that the check for p->pe is before ip_vs_find_dest. Example for parsing: - rename msgEnd/p to 'char *endp;' and move it before loop. It will have the 'p' role as before: to point to end of connection. before loop: endp = buffer + sizeof(struct ip_vs_sync_mesg_v2); In loop: + p = endp; + s = (union ip_vs_sync_conn *) endp; + size = ntohs(s->v4.ver_size) & SVER_MASK; + endp = p + size; <--- we are ready for 'continue' By this way endp should point to next connection in case we want to ignore current one at any time. 'p' will walk parameters as you do now. After that all checks for p should be with endp, I mean use 'if (p > endp)' here: + if (p > buffer+buflen) { + IP_VS_ERR_RL("bogus conn in sync message\n"); + return; + } - Note that pe_data is leaked when ip_vs_proc_conn() fails to create connection. May be PE info for non-templates should be ignored? And we need a way to know if ip_vs_proc_conn called ip_vs_conn_new at all and that it succeeded so that we can safely free pe_data. Simon should tell what happens if some PE updates ct->pe_data, may be we should replace it too for the case when ip_vs_proc_conn works with existing template? v2 PATCH 4/4 May be we should add configuration option if sync is enabled to default to version 0 because how we solve the problem if backup can not be upgraded? For IPVS_OPT_PE_NAME: because we have length better not to add zero terminator in sync message. It complicates the checks in backup. Or backup prefers to check with zero terminated string directly from message? In this case we should check for existing terminator. Regards -- Julian Anastasov <ja@xxxxxx> -- 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