I'm not sure this is a good idea, using iface->if_index == 0 to indicate that the link local addr is not set.  Am I reading this correctly?  Are you using if_index 0 to imply that setup_linklocal_addr failed for this interface?

Maybe what we should do instead is make iface->if_addr a pointer and compare the pointer value to 0.