[libvirt] [PATCHv2] PHYP: Adding network interface management
Eduardo Otubo
otubo at linux.vnet.ibm.com
Mon Dec 13 20:07:21 UTC 2010
On 12/09/2010 07:16 PM, Eric Blake wrote:
> On 11/22/2010 06:03 PM, Eduardo Otubo wrote:
>
> Apologies for my review backlog (if you haven't guessed, I sometimes
> table big patches for later, then forget to come back rapidly).
No problem, I'll try to post earlier next time. Thanks anyway.
>
>> This is the implementation of the previous patch now using virInterface*
>> API. Ended up this patch got much more simpler, smaller and easier to
>> review. Here is some details:
>>
>> * MAC size and interface name are fixed due to specifications on HMC,
>> both are created automatically and CAN'T be specified from user. They
>> have the following format:
>>
>> * MAC: 122980003002
>
> HMC represents MAC as a decimal number? How hideous, but not your
> fault; and this comment in the commit message will be useful for anyone
> auditing the code in the future.
Yeah, no way I understand this notation either. Keeping all the commit
comments on the PATCHv3 I'll send right away.
>
>> + /* Getting the remote slot number */
>> +
>> + char_ptr = NULL;
>> + char_ptr = strchr(iface->mac, '\n');
>
> Redundant assignments (delete the first line).
ACK, fixed.
>
>> + if (VIR_ALLOC_N(name, PHYP_IFACENAME_SIZE)< 0) {
>> + virReportOOMError();
>> + goto err;
>> + }
>> +
>> + if (VIR_ALLOC_N(mac, PHYP_MAC_SIZE)< 0) {
>> + virReportOOMError();
>> + goto err;
>> + }
>
> Since these arrays are so small, it's faster to just stack-allocate them:
>
> char name[PHYP_IFACENAME_SIZE];
ACK, fixed.
>
>> + /* The next free slot itself: */
>> + slot++;
>> +
>> + /* Now addig the new network interface */
>
> s/addig/adding/
ACK, fixed.
>
>> + if (exit_status< 0 || ret == NULL)
>> + goto err;
>> +
>> + char_ptr = NULL;
>> + char_ptr = strchr(ret, '\n');
>
> Another redundant assignment.
ACK, fixed.
>
>> + if (memcpy(mac, ret, PHYP_IFACENAME_SIZE) == NULL)
>> + goto err;
>> +
>> + VIR_FREE(cmd);
>> + VIR_FREE(ret);
>> + return virGetInterface(conn, name, mac);
>> +
>> + err:
>> + VIR_FREE(name);
>> + VIR_FREE(cmd);
>> + VIR_FREE(ret);
>> + return NULL;
>
> This leaks name if you end up calling virGetInterface. And both paths
> leak mac. But if you change name and mac to be stack-allocated, then
> you don't have to worry about freeing them.
ACK, fixed.
>
>> + ret = phypExec(session, cmd,&exit_status, conn);
>> +
>> + if (exit_status< 0 || ret == NULL)
>> + goto err;
>> +
>> + VIR_FREE(cmd);
>> + return virGetInterface(conn, name, ret);
>> +
>> + err:
>> + VIR_FREE(cmd);
>> + VIR_FREE(ret);
>> + return NULL;
>
> This leaks ret if virGetInterface is called.
ACK, fixed.
>
>> + ret = phypExec(session, cmd,&exit_status, iface->conn);
>> +
>> + if (exit_status< 0 || ret == NULL)
>> + goto err;
>> +
>> + if (virStrToLong_i(ret,&char_ptr, 10,&state) == -1)
>> + goto err;
>> +
>> + if (char_ptr)
>> + *char_ptr = '\0';
>> +
>> + VIR_FREE(cmd);
>> + return state;
>
> Another leak of ret.
ACK, fixed.
>
>> +static int
>> +phypListInterfaces(virConnectPtr conn, char **const names, int nnames)
>
> s/int/size_t/
>
>> + ret = phypExec(session, cmd,&exit_status, conn);
>> +
>> + /* I need to parse the textual return in order to get the network interfaces */
>> + if (exit_status< 0 || ret == NULL)
>> + goto err;
>> + else {
>
> Rather than indenting the rest of the function inside an else{} block,
> you can leave the code at the top level indentation since the if() block
> was an unconditional goto.
ACK, fixed.
>
>> + ret = phypExec(session, cmd,&exit_status, conn);
>> +
>> + if (exit_status< 0 || ret == NULL)
>> + goto err;
>> +
>> + if (virStrToLong_i(ret,&char_ptr, 10,&nnets) == -1)
>> + goto err;
>> +
>> + if (char_ptr)
>> + *char_ptr = '\0';
>> +
>> + VIR_FREE(cmd);
>> + return nnets;
>
> Another leak of ret.
ACK, fixed.
>
>>
>> int
>> @@ -4117,7 +4651,7 @@ phypRegister(void)
>> return -1;
>> if (virRegisterStorageDriver(&phypStorageDriver)< 0)
>> return -1;
>> - if (virRegisterNetworkDriver(&phypNetworkDriver)< 0)
>> + if (virRegisterInterfaceDriver(&phypInterfaceDriver)< 0)
>
> Are you intending to replace NetworkDriver with InterfaceDriver, or
> should you be supporting both drivers simultaneously (although this may
> be more an indication of how unfamiliar I am with the difference between
> what the two drivers are supposed to provide).
First option, I'll replace NetworkDriver with InterfaceDriver. I didn't
know that there were an Interface API, my deep fault on this matter.
As I said, I will keep all the commit comments for further needs.
Sending now the PATCHv3.
Thanks for the review.
Regards,
--
Eduardo Otubo
Software Engineer
Linux Technology Center
IBM Systems & Technology Group
Mobile: +55 19 8135 0885
eotubo at linux.vnet.ibm.com
More information about the libvir-list
mailing list