+int message_new_synthetic_error(int error, uint32_t serial, sd_rtnl_message **ret) {
+ struct nlmsgerr *err;
+ int r;
+
+ assert(error <= 0);
+
+ r = message_new(ret, NLMSG_SPACE(sizeof(struct nlmsgerr)));
+ if (r < 0)
+ return r;
+
+ (*ret)->hdr->nlmsg_len = NLMSG_LENGTH(sizeof(struct nlmsgerr));
+ (*ret)->hdr->nlmsg_type = NLMSG_ERROR;
+ (*ret)->hdr->nlmsg_seq = serial;
+
+ err = NLMSG_DATA((*ret)->hdr);
+
+ err->error = error;
+
+ return 0;
+}
+
+int sd_rtnl_message_route_new(uint16_t nlmsg_type, unsigned char rtm_family,
+ unsigned char rtm_dst_len, unsigned char rtm_src_len,
+ unsigned char rtm_tos, unsigned char rtm_table,
+ unsigned char rtm_scope, unsigned char rtm_protocol,
+ unsigned char rtm_type, unsigned rtm_flags, sd_rtnl_message **ret) {
+ struct rtmsg *rtm;
+ int r;
+
+ assert_return(nlmsg_type == RTM_NEWROUTE || nlmsg_type == RTM_DELROUTE ||
+ nlmsg_type == RTM_GETROUTE, -EINVAL);
+ assert_return(ret, -EINVAL);
+
+ r = message_new(ret, NLMSG_SPACE(sizeof(struct rtmsg)));
+ if (r < 0)
+ return r;
+
+ (*ret)->hdr->nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
+ (*ret)->hdr->nlmsg_type = nlmsg_type;
+ if (nlmsg_type == RTM_NEWROUTE)
+ (*ret)->hdr->nlmsg_flags |= NLM_F_CREATE | NLM_F_EXCL;
+
+ rtm = NLMSG_DATA((*ret)->hdr);
+
+ rtm->rtm_family = rtm_family;
+ rtm->rtm_dst_len = rtm_dst_len;
+ rtm->rtm_src_len = rtm_src_len;
+ rtm->rtm_tos = rtm_tos;
+ rtm->rtm_table = rtm_table;
+ rtm->rtm_protocol = rtm_protocol;
+ rtm->rtm_scope = rtm_scope;
+ rtm->rtm_type = rtm_type;
+ rtm->rtm_flags = rtm_flags;
+
+ return 0;
+}
+