static int pppoe_payload_parse(PPPoETags *tags, struct pppoe_hdr *header) { struct pppoe_tag *tag; int r; assert(tags); pppoe_tags_clear(tags); PPPOE_TAGS_FOREACH(tag, header) { switch (PPPOE_TAG_TYPE(tag)) { case PTT_SRV_NAME: r = pppoe_tag_parse_string(tag, &tags->service_name); if (r < 0) return r; break; case PTT_AC_NAME: r = pppoe_tag_parse_string(tag, &tags->ac_name); if (r < 0) return r; break; case PTT_HOST_UNIQ: r = pppoe_tag_parse_binary(tag, &tags->host_uniq, &tags->host_uniq_len); if (r < 0) return r; break; case PTT_AC_COOKIE: r = pppoe_tag_parse_binary(tag, &tags->cookie, &tags->cookie_len); if (r < 0) return r; break; case PTT_SRV_ERR: case PTT_SYS_ERR: case PTT_GEN_ERR: { _cleanup_free_ char *error = NULL; /* TODO: do something more sensible with the error messages */ r = pppoe_tag_parse_string(tag, &error); if (r < 0) return r; if (strlen(error) > 0 && utf8_is_valid(error)) log_debug("PPPoE: error - '%s'", error); else log_debug("PPPoE: error"); break; } default: log_debug("PPPoE: ignoring unknown PPPoE tag type: 0x%.2x", PPPOE_TAG_TYPE(tag)); } } return 0; }
sd_pppoe *sd_pppoe_unref(sd_pppoe *ppp) { if (ppp && REFCNT_DEC(ppp->n_ref) <= 0) { pppoe_tags_clear(&ppp->tags); free(ppp->ifname); free(ppp->service_name); sd_pppoe_stop(ppp); sd_pppoe_detach_event(ppp); free(ppp); } return NULL; }
sd_pppoe *sd_pppoe_unref(sd_pppoe *ppp) { if (!ppp) return NULL; assert(ppp->n_ref > 0); ppp->n_ref--; if (ppp->n_ref > 0) return NULL; pppoe_tags_clear(&ppp->tags); free(ppp->ifname); free(ppp->service_name); sd_pppoe_stop(ppp); sd_pppoe_detach_event(ppp); free(ppp); return NULL; }