I looked into the existing code of the function create_ipsec_tunnel(..)
Are you sure that the "return 0" in the error cases is correct? Should it not be -1, as in the one case in the bottom of the function? If yes - then it makes probably sense to combine them all into one "goto error" case.